您的位置:首页 > 编程语言 > C语言/C++

C++中的拷贝构造函数

2019-12-26 17:14 1491 查看

一、拷贝构造函数:

格式: A(const  A& a); 

 

总结:

系统为对象B分配了内存并完成了与对象testA的复制过程,就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。

 

1.拷贝构造函数的使用: 

A testA;

A B = testA;

2.析构的先后顺序:

程序结束,析构的时候,先析构了B,后析构了testA.

 

二、拷贝构造函数的调用时机

1、当函数的参数为类的对象时;

 

 调用copy_constructor_fun(A aA)时,会产生以下几个重要步骤:
(1)、A对象传入形参时,会先产生一个临时变量Temp;

(2)、然后调用拷贝构造函数把A的值给Temp。

(3)、等copy_constructor_fun()指向完毕后,析构掉Temp。

 

 

 

2、函数的返回值是类的对象

 

 

 3、对象需要另外一个对象进行初始化

A testA(100);

A B = testA;

或者:
A C(testA);

 

三、深拷贝和浅拷贝

1、默认拷贝构造函数

 

 

2、浅拷贝

简单的值复制,比如上面几个例子,都是浅拷贝,默认的拷贝构造函数都是浅拷贝。

3、深拷贝

深拷贝主要用于类中有指针成员变量时,防止析构的时候指针悬挂现象。

因为默认的拷贝构造函数只是简单的值复制,如果存在指针变量,相当于两个指针指向同一块内存地址,析构的时候,该块内存地址会被析构两遍,那么当第一次被释放之后,后面指向该内存的指针就会存在悬挂的现象。

深拷贝主要是为拷贝的类对象中的指针变量开辟新的内存空间,这样释放的时候,就不会出现悬挂现象。

 

 

 

 

写明显示的深拷贝构造函数:

 

 

四、总结

1.为什么拷贝构造函数的参数必须是引用传递,而不是值传递

防止递归调用。

2、拷贝构造函数的作用

用来复制对象的,使用以一个对象的实例来初始化这个对象的一个新的实例。

3、对一个类A,如果一个构造函数的第一个参数是下列之一:
1) A&

2) const A&

3) volatile A&

4) const volatile A& 

且没有其他参数或者其他参数都有默认值,那么这个函数是拷贝构造函数。

4、一个类中可以存在多余一个的拷贝构造函数吗?

答: 类中可以存在超过一个拷贝构造函数。

注意,如果一个类中只存在一个参数为 X& 的拷贝构造函数,那么就不能使用const X或volatile X的对象实行拷贝初始化.
  如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数。
  这个默认的参数可能为 X::X(const X&)或 X::X(X&),由编译器根据上下文决定选择哪一个。

 

 5、构造函数可以重载,析构函数不可以重载。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: