为什么那个拷贝的构造函数必须要有?

 我来答
风若远去何人留
2016-12-16 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450129
专业C/C++软件开发

向TA提问 私信TA
展开全部
之前说过, 当你不定义拷贝构造的时候,系统会给你自动生成一个。
这个自动生成的,就是浅拷贝。
对于这个例子。
如果存在
String a(b);或者String a=b;
这样的定义。
就会调用拷贝构造。用系统生成的那个,效果就是
a.Length =b.Length;
a.Sp = b.Sp;
也就是说,两个共用同一个Sp指针,这个指向的是一个分配的空间。
然后,一旦任何一个被析构了,比如b被析构,那么b.Sp被释放。
再去通过a.Sp访问这个空间,就会导致出错了。

但是在这个代码里面,并没有这样的定义,为什么一定要拷贝构造。。。
因为,operator+函数返回的并不是引用。
所以 这个函数实现的时候,一定是定义一个局部变量,把a+b的结果写进去,返回。
str3=str2+str1的时候,先一个无名临时变量,被拷贝构造出来,然后再调用
operator=重载,把这个无名临时变量赋值给str3.
执行这个操作后,无名临时变量就被析构了。
这样,如果没有拷贝构造的定义,进行深拷贝。
那么得到的str3.Sp就是一个野指针。
更多追问追答
追问
“str3=str2+str1的时候,先一个无名临时变量,被拷贝构造出来,然后再调用
operator=重载,把这个无名临时变量赋值给str3.”

这句话怎么读起来怪怪的。。。
追答

str3=str2+str1这个是一个比较复杂的过程  哈哈

等同于

str3=operator+(str2, str1);

又等同于

str3.operator=(operator(str2, str1));

这个才是真正执行的过程。 


先调用operator(String&, String&)这个函数。 

这个函数返回局部变量str。 但是问题是,局部变量在函数退出就会被销毁回收了,是没办法作为参数传递给operator=这个函数的。 

所以 系统就构建了一个临时变量,归属于主调函数main,然后把这个临时变量的引用,传给operator=函数,执行操作后,销毁自己。 

这个过程是隐式的。 

来自:求助得到的回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式