为什么那个拷贝的构造函数必须要有?
展开全部
之前说过, 当你不定义拷贝构造的时候,系统会给你自动生成一个。
这个自动生成的,就是浅拷贝。
对于这个例子。
如果存在
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就是一个野指针。
这个自动生成的,就是浅拷贝。
对于这个例子。
如果存在
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.”
这句话怎么读起来怪怪的。。。
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询