vetty

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次,这是错误的。

posted on 2015-06-01 16:25  cocos2014  阅读(1037)  评论(0编辑  收藏  举报

导航