您的位置:首页 > 其它

复制控制:复制构造函数 赋值操作符 以及 析构函数(智能

2009-12-04 21:16 387 查看
这篇日志主要关注对象的复制控制!这篇好好组织一下吧。

复制控制包括:复制构造函数,析构函数,以及赋值操作符

1. 复制构造函数

(1)什么时候会调用?

显式或隐式两种调用。

当定义一个新对象并用一个同类型的对象对它进行初始化时,显示使用复制构造函数

当该类型的对象传递给函数或从函数返回该类型的对象时,隐式调用。

(2)具体用到的地方?

初始化对象,传参,函数返回值,初始化容器元素,初始化数组元素



<1>初始化对象。分为直接式和复制式两种:

string str("test")

string str = "test“

第一种是直接式,第二种是复制式。复制式时,编译器首先调用一个C 风格字符串形参的string构造函数,创建一个临时对象,然后调用string的复制构造函数将str初始化为临时对象。

<2>形参和返回值

这个没什么好说的,C系列只要不是引用传参,都会复制实参给形参的(包括指针也复制的),所以这里会调用复制构造函数。

<3>初始化容器

这个看例子,我对容器还不是很了解,不敢说太多。

vevtor<string> svec(5)

编译器首先使用string的默认构造函数创建一个临时值来初始化svec,然后使用复制构造函数将临时值复制到svec的每个元素。

<4>数组元素

当对类数组使用花括号的初始化列表的初始化形式时,会调用复制构造函数对数组元素进行初始化。



(3)系统自动生成的复制构造函数

其实有许多错误不是因为系统不作为,而是因为系统做太多。关键它做了没跟你打声招呼。

如果你没有定义复制构造函数,那么系统会为你自动生成一个。

他会对现有对象的每个非static成员,依次复制到正创建的对象。

对内置类型,复制值,对类成员,则调用类对象的复制构造函数,数组成员也将复制到一个新的数组中。

(目前我没有试验过,但是感觉这个有点深克隆的感觉啊,我的意思是如果类成员是 非指针的类类型的时候,如 Class1 mClass1. 如果是指针肯定是浅克隆了。Java因为全部都是指针啊,所以不定义就肯定是浅克隆 )

(4)禁止复制

禁止复制有两种方法,将复制构造函数定义为Private,这样系统也不会帮你生成了。

或者在复制构造函数前面加explicit关键字,表示一定要显示调用,那么就不会出现上面说的隐式调用的情况了。

(写的好累)还有别的事情 先switch一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐