C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别
class TestChild
{
public:
TestChild()
{
x=;
y=;
printf("TestChild: Constructor be called!\n");
}
~TestChild(){}
TestChild(const TestChild& tc)
{
x=tc.x;
y=tc.y;
printf("TestChild: Copy Constructor called!//因为写在了Test(拷贝)构造函数的初始化列表里\n");
} const TestChild& operator=(const TestChild& right)
{
x=right.x;
y=right.y;
printf("TestChild: Operator = be called! //因为写在了Test(拷贝)构造函数的函数体里\n");
return *this;
} int x,y;
}; class Test
{
public: Test(){printf("Test: Constructor be called!\n");}
explicit Test(const TestChild& tcc)
{
tc=tcc;
}
~Test(){}
Test(const Test& test):tc(test.tc)
{
tc=test.tc;
printf("Test: Copy Constructor be called!\n");
} const Test & operator=(const Test& right)
{
tc=right.tc;
printf("Test: Operator= be called!\n");
return *this;
} TestChild tc;
}; int main()
{
printf("1、Test中包含一个TestChild,这两个类分别具有构造函数、\n 拷贝构造函数、重载operator=。\n\n");
printf("2、在调用Test的构造函数和拷贝构造函数之前,会根据跟在\n 这些函数后的初始化列表去初始化其\n TestChild变量(调用TestChild的拷贝构造函数去初始化)\n\n");
printf("3、一旦进入Test的构造函数体或拷贝构造函数体,则说明其成员变量TestChild已\n 经通过TestChild的构造函数或TestChild的拷贝构造函数构造出了对象\n");
printf(" 所以,在Test的构造函数体或拷贝构造函数体中,再去使用=号\n 给TestChild的时候,调用的就是TestChild的operator=,\n 而不是TestChild的拷贝构造函数了\n");
printf(" 这就是Test构造函数后面 “:” 初始化列表的存在意义!(\n 为了调用成员变量的构造函数或者拷贝构造函数)\n\n");
printf("4、最后!揪出让人困惑的终极原因!!!!!\n Test test2=test1和Test test2(test1)这两种是TM一模一样的\n (都调用拷贝构造函数)!!!!除了这点儿之外,其他地方都是该是什么是什么(\"()\"调用构造函数,\"=\"调用赋值操作符)!!!\n\n");
printf("5、一个对象初始化完毕后,所有对这个对象的赋值都调用operator=\n\n输出如下:"); printf("Test test1; DO:\n");
Test test1;
printf("\n");
printf("Test test2=test1; DO:\n");
Test test2=test1;
printf("\n");
printf("Test test3(test2); DO:\n");
Test test3(test2);
printf("\n");
printf("test3=test1; DO:\n");
test3=test1; return ;
}
搞清楚这个之后我对C++真尼玛是万念俱灰。。C++这个女强人能学点儿C#小萝莉小鸟依人的优点么!!!!!!!!!!!!!!
嗯,其实C++的温柔没有被发现~ 她很贴心的发明了explicit这个关键字,如果把这个关键字加在构造函数之前,那么Test test2=test1;这样的初始化或者隐式类型转化是不能通过编译的
原文转自:http://www.cnblogs.com/darknightsnow/archive/2012/10/17/2728078.html
原作者为 暗夜的雪. 请尊重原作者版权
C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别的更多相关文章
- C++的转换构造函数、拷贝构造函数、赋值运算符重载
1 转换构造函数 C++的转换构造函数是只有一个参数的构造函数.当程序试图将一个其他类型的对象或基本类型值赋给该类的一个待初始化对象时(如Person p="Dean";) ...
- C++ 拷贝构造函数和赋值运算符
本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...
- C++中构造函数,拷贝构造函数和赋值函数的区别和实现
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...
- C++ 构造函数、拷贝构造函数、赋值运算符
<C++ Primer Plus> 12.1 动态内存和类 12.1.1 复习示例和静态类成员 不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存 如果在头文 ...
- C++禁止使用拷贝构造函数和赋值运算符方法
1.将拷贝构造函数和赋值运算符声明为私有,并不予实现 class Uncopyable { private: Uncopyable(const Uncopyable &); // 阻止copy ...
- 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符
学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...
- C++ Primer 学习笔记_54_类和数据抽象 --拷贝构造函数、赋值运算符
拷贝控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,须要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用! 复制构造函数: ...
- C++ 拷贝构造函数与赋值函数的区别(很严谨和全面)
这里我们用类String 来介绍这两个函数: 拷贝构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式 ...
- C++“拷贝构造函数”和“等号重载”有什么区别?
CTypeA(const CTypeB& b)CTypeA& operator=(const CTypeB& b)一直没弄懂这两个有什么区别.只知道,重载了=号,下面复制的时候 ...
随机推荐
- iOS适配 旧项目工程在iOS9下不能正常显示
在iOS开发中,很多时候会用到旧项目,比如版本的升级.使用Demo等等, iOS SDK正在不断的升级,不断的升级给iOS开发带来了新的活力. 然而在iOS SDK新的版本出来之后,旧项目可能会出现新 ...
- IBM实习
来到北京,进入IBM实习已经好多天了,两个月的暑假,两个月夏日在这里度过了,并将在未来个一个月里面,仍将在这里走过,但是我却一无所成,现在仍然只在徘徊中游走,丹迪什么时候能真正懂得实习的难得可贵,懂得 ...
- CentOS桌面安装
1.显示系统已经安装的组件,和可以安装的组件: #yum grouplist 2.如果系统安装之初采用最小化安装,没有安装xwindow,那么先安装: #yum groupinstall " ...
- Android系统的五种数据存储形式(二)
之前介绍了Android系统下三种数据存储形式,今天补充介绍另外两种,分别是内容提供者和网络存储.有些人可能认为内存提供者和网络存储更偏向于对数据的操作而不是数据的存储,但这两种方式确实与数据有关,所 ...
- Linux2.6内核进程调度系列--scheduler_tick()函数1.总体思想
参考的是ULK第三版,Linux2.6.11.12内核版本. 调度程序依靠几个函数来完成调度工作,其中最重要的第一个函数是scheduler_tick函数,主要步骤如下: /** * 维持当前最新的t ...
- Linux下安装使用Solr
Linux下安装使用Solr 1.首先下载Solr.mmseg4j分词包.tomcat并解压,这用google.百度都可以搜索得到下载地址. 2.因为要使用到中文分词,所以要设置编码,进入tomcat ...
- xp
微软MSDN Windows XP Professional下载 Windows XP Professional 简体中文 (最原始版本,无SP)[505.63MB] 文件名:CN_WINXP_PRO ...
- .NET应用架构设计—面向查询的领域驱动设计实践(调整传统三层架构,外加维护型的业务开关)
阅读目录: 1.背景介绍 2.在业务层中加入核心领域模型(引入DomainModel,让逻辑.数据有家可归,变成一个完整的业务对象) 3.统一协调层Application Layer(加入协调层来转换 ...
- ajax请求技术
1.写在前面: 阅读要求: 具有一定的HTML.CSS.JavaScript.Json基础 2.什么是ajax Ajax:即”Asynchronous Javascript And XML”(异步Ja ...
- 【转】SpringMVC中DispatcherServlet配置中url-pattern 配置/*和/的区别
原文地址:http://m.blog.csdn.net/blog/liuxiao723846/43733287 在使用springmvc时,都会在web.xml中配置一个dispatchservlet ...