拷贝构造函数

来源:互联网 发布:徐志雷ti7知乎 编辑:程序博客网 时间:2024/04/30 16:19

类的拷贝构造函数

class Cexample

{

Cexample(const Cexample & c)

{

}

  };


1.它是一个 构造函数

2.第一个默认的参数必须是 Cexample & 形式的;

3.如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数。
这个默认的参数可能为 X::X(const X&)或 X::X(X&),由编译器根据上下文决定选择哪一个。

 作用:相同类的对象之间的 数值传递


应用地方:

1. 对象以值传递的方式传入函数参数

(1).对象传入形参时,会先会产生一个相同类的临时对象
(2).然后调用拷贝构造函数把对象的值给临时对象。
(3).等函数执行完后, 析构掉临时对象。

2.对象以值传递的方式从函数返回

Cexample fun(){} 

函数值返回时首先产生一个临时对象,然后拷贝构造将返回值给临时对象,函数结束,析构掉临时对象

3. 对象需要通过另外一个对象进行初始化;

Cexample  B(100); //构造B对象

Cexample A(B); 拷贝B到A

Cexample A=B; 拷贝B到A




浅拷贝和深拷贝:

当类的构造函数里面包括动态地址分配时候,拷贝构造函数要响应的添加动态地址分配的操作!!

在“深拷贝”的情况下,对于对象中动态成员,就不能仅仅简单地赋值了,而应该重新动态分配空间,如上面的例子就应该按照如下的方式进行处理:

[c-sharp] view plaincopy
  1. class Rect  
  2. {  
  3. public:  
  4.     Rect()      // 构造函数,p指向堆中分配的一空间  
  5.     {  
  6.         p = new int(100);  
  7.     }  
  8.     Rect(const Rect& r)  
  9.     {  
  10.         width = r.width;  
  11.         height = r.height;  
  12.         p = new int;    // 为新对象重新动态分配空间  
  13.         *p = *(r.p);  
  14.     }  
  15.     ~Rect()     // 析构函数,释放动态分配的空间  
  16.     {  
  17.         if(p != NULL)  
  18.         {  
  19.             delete p;  
  20.         }  
  21.     }  
  22. private:  
  23.     int width;  
  24.     int height;  
  25.     int *p;     // 一指针成员  
  26. };  

此时,在完成对象的复制后,内存的一个大致情况如下:

 

此时rect1的p和rect2的p各自指向一段内存空间,但它们指向的空间具有相同的内容,这就是所谓的“深拷贝”


0 0