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)一直没弄懂这两个有什么区别.只知道,重载了=号,下面复制的时候 ...
随机推荐
- 给DB数据表加强制索引
DB2 数据库会根据DB层的统计值决定 根据查询条件走哪一个索引,某些情况下,由于未知原因,索引会走偏,故程序中可以规定程序走哪一个索引来避免索引走偏的情况发生. 强制走索引的 实例代码如下: SEL ...
- SharePoint 2013 搜索高级配置(Search Scope)
前言:SharePoint 2013集成了Fast Search,而后在配置上与2010及之前版本都有一些区别,如果需要开启搜索的文档,请参考我之前写的博客,博客地址附后.下面,我们开始了解下,Sha ...
- 设置statusBarStyle
设置状态栏的样式, typedef NS_ENUM(NSInteger, UIStatusBarStyle) { UIStatusBarStyleDefault ...
- Android(Java)控制GPIO的方法及耗时分析
前面两篇分别介绍了通过脚本和C代码读写/sys/class/gpio以控制GPIO.实际项目调试时经常还需要在Java代码里控制GPIO,其实现与C代码类似,唯一不同是Android权限.本文重点介绍 ...
- android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本)
原地址 :http://www.cnblogs.com/wangmars/p/3914090.html SQLite,是一款轻型的数据库,被广泛的运用到很多嵌入式的产品中,因为占用的资源非常少,二其中 ...
- 【iOS】Alamofire库在iOS7下设置Head无效的问题
声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 正文 同样的代码在iOS8下没有问 ...
- 《C#高级编程》读书笔记
<C#高级编程>读书笔记 C#类型的取值范围 名称 CTS类型 说明 范围 sbyte System.SByte 8位有符号的整数 -128~127(−27−27~27−127−1) sh ...
- RAC异机恢复
RAC异机恢复PDCL到PFCL: PNCL:RAC+ASM ,product env db name:PNCL instance:PDCL1 PDCL2 PFCL:RAC+ASM ,perf ...
- android 解决ListView点击与滑动事件冲突
如果你的ListView的Item有滑动功能,但又点击Item跳转到其它activity,这样若是在Adapter里面写点击事件是会导致滑动事件获取不到焦点而失效: 解决方法:不要在adapter里面 ...
- 关于java中MessageFormat.format中单引号问题
我们知道java中可以用MessageFormat.format来格式化字符串.这个方法在我们的实际开发中经常用到,有点类似模板,这样我们就不需要用很恶心的拼接字符串了.如下面 String s1=& ...