C++拷贝构造函数
拷贝构造函数是一种特殊的构造函数,其定义为第一个参数为为本类型的一个引用或者是常引用,且无其它参数或者其它参数为默认值,例如下面的函数:
1 X::X(const X&); 2 X::X(X&, int a=1); 3 X::X(X&, int a=1, int b=2);
那么什么时候调用拷贝构造函数呢?
1.对象以值传递的形式传入参数
1 int main() 2 { 3 CExample test(1); 4 //传入对象 5 Fun(test); 6 7 return 0; 8 }
调用Fun时过程如下:
(1)test对象传入函数时,创建一个临时变量temp
(2)调用拷贝构造函数把test的值赋给临时变量,类似于CExample temp(test)
(3)Fun调用结束后,析构掉temp
2.对象以值传递的方式从函数返回
1 CExample Fun() 2 { 3 CExample object(0); 4 return object; 5 }
当Fun函数执行到return时,步骤如下:
(1)先产生一个临时变量temp
(2)调用拷贝构造函数把object赋值给temp,类似于CExample temp(object)
(3)函数执行到最后先析构掉局部变量object
(4)Fun执行完后析构掉temp
关于浅拷贝和深拷贝:
所谓浅拷贝,指的是在对象复制时,只对对象中的成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。大多情况下“浅拷贝”已经能很好地工作了,但是一旦对象存在了动态成员,那么浅拷贝就会出问题了。对
深拷贝的适用范围是对象存在动态成员,在“深拷贝”的情况下,对于对象中动态成员,就不能仅仅简单地赋值了,而应该重新动态分配空间,要不然就像浅拷贝一样释放对象时对同一内存空间会释放2次,这是错误的。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。