当用一个已经初始化了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用,也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。
以下情况都会调用拷贝构造函数:
(1)一个对象以值传递的方式传入函数体
(2)一个对象以值传递的方式从函数返回
(3)一个对象需要通过另一个对象进行初始化
浅拷贝和深拷贝的概念:
浅拷贝:如果在类中没有显示的声明一个拷贝构造函数,那么,编译器会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝,而位拷贝又称为浅拷贝。以下就是浅拷贝,而浅拷贝的过程就是说在某些情况下,需要用已初始化的对象去初始化一个新对象的时候,在没有自定义的拷贝构造函数时,系统调用默认构造函数,编译通过,但此时,a和b将指向同一个内存,根据构造函数和析构函数的特点,先构造的后析构,所以b会先析构,将这块内存的外部资源释放,再将内存释放,之后a内的指针就是野指针了,出现运行错误。
#include<iostream>
using namespace std;
class A:{
A(){}
~A(){}
}
int main(){
A a;
A b=a;
}
深拷贝:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝。
#include<iostream>
using namespace std;
class A:{
public:
A(int data):ma(data),mb(data){}
~A(){}
void A(const class &str){
ma=str.ma;
mb=str.mb;
}
private:
int ma;
int mb;
}
int main(){
A a(10);
A b=a;
}
所以说,自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造函数,提高源码效率。