1.在给对象赋值时会调用类的复制构造函数,如果自己没有定义复制构造函数,那么编译器会自动为你生成一个复制构造函数。
2.什么是复制构造函数:
class A{
public:
A();//无参构造函数
A(const A &instance);//复制构造函数
……
}
3.浅拷贝:只是将一个对象的所有成员的值都简单的赋给新的对象,默认的复制构造函数就是采用的这种方法进行赋值。
4.深拷贝:用一个对象为另一个对象赋值时,遇到指针这些成员时不是简单地将指针指向的地址赋给新对象中的相应的指针成员,而是为新对象开辟一个新的内存空间,然后再让新对象中的相应的指针成员指向新开辟的内存空间,而浅拷贝中新对象的指针成员与原来的对象的相应指针成员指向同一个地址。
5.深拷贝的简单例子:
class A{
private:
int i;
int *j;
……
public:
//复制构造函数
A(const A &instance){
this.i=instance.i;
int tmp=*(instance.j);
this.j=&tmp;
……
}
……
}
6.什么时候需要自己定义复制构造函数来实现深拷贝。
如果你没有为上面的例子写复制构造函数,那编译器给你自动生成的构造函数应该是这样子的
A(const A &instance){
this.i=instance.i;
this.j=instance.j;
……
}
这样的话就是浅拷贝,当在instance中将j所指向的内存释放后,新对象中成员j指向的就是未定义的区域或者说是无效的,那么就会发生运行时异常。所以当你自己定义的类中有指针成员或者动态开辟内存的数据成员的时候就需要自己定义复制构造函数,实现对象的深拷贝功能。