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 开发之路(WKWebView内嵌HTML5之图片上传) 五
HTML5页面的图片上传功能在iOS端的实现. 首先,页面上用的是plupload组件,在wkwebview上存在两个坑需要修复才能正常使用. 问题:在webview上点击选择照片/相机拍摄,就会出现 ...
- Picasso设置圆角
package liu.roundimagedemo.view; import android.graphics.Bitmap; import android.graphics.BitmapShade ...
- SQL SERVER 2000通过链接服务器发送邮件出现错误
案例环境: 服务器A系统: Windows Server 2000 数据库版本 : Microsoft SQL Server 2000 - 8.00.2282 (Intel X86) 服务器B系统: ...
- Linux 查看服务器开放的端口号
在讨论这个问题前,我们先来了解一下物理端口.逻辑端口.端口号等计算机概念. 端口相关的概念: 在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型.物理端口指的是物理存在的端口,如ADSL ...
- SQL*LOADER错误总结
在使用SQL*LOADER装载数据时,由于平面文件的多样化和数据格式问题总会遇到形形色色的一些小问题,下面是工作中累积.整理记录的遇到的一些形形色色错误.希望能对大家有些用处.(今天突然看到自己以前整 ...
- 弹窗样式 idialog,purebox,artdialog4.1.2,jquery.alert.v1.2
<script src="<?php echo $imgurl;?>/tools/media/js/jquery.iDialog.js"></scri ...
- UDT中epoll对CLOSE状态的处理
epoll_wait()返回可用uid时,对uid取状态,本该是BROKEN的,却取到CLOSED,然而,不能像处理BROKEN事件那样处理CLOSED事件,这样移除不了CLOSED事件,于是epol ...
- 3-1 Linux文件管理类命令详解
根据马哥Linux初级 03-01整理 1. 目录管理 ls cd pwd mkdir rmdir tree 2. 文件管理 touch stat file rm cp mv nano 3. 日期时间 ...
- mysql sum 和 count 函数 合并使用
SELECT sum(start) as total, count(start) as rows FROM table where....
- linux中档案类型
我们用ls-l命令时,在第一列的第一个字符表示是档案类型.如: 那d和-等这些都表示什么呢? [ d ]-------目录 [ - ]--------文件 [ l ]---------连结档(link ...