C++中的拷贝构造函数
JaimeJie 人气:2一、拷贝构造函数:
格式: 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、构造函数可以重载,析构函数不可以重载。
加载全部内容