拷贝构造也是一种构造函数,只是参数一个旧的对象,当使用旧对象给新创建的对象初始化时将调用拷贝构造。
类名(const 类& that)
{
}
默认情况下编译器会自动生成一个拷贝构造函数,该函数负责把旧对象中的数据拷贝给新的对象。
深拷贝与浅拷贝:
如果类的成员中有指针,在拷贝时只拷贝指针变量,这种叫浅拷贝,这种拷贝分式在旧对象被释放时,该对象的指针变量所指向的内存也被释放。
深拷贝是为对象维护一个新的指针,然后将旧对象的指针所向的内容拷贝一份新的给这个指针,这样就不会有上述浅拷贝存在的问题,但也会占用更多的内存。
注意:默认的拷贝构造只能完成浅拷贝。
什么情况要重写拷贝构造:
当类中的成员有指针时,想完成深拷贝的效果,就需要重写拷贝构造。
什么情况下会调用拷贝构造:
1、使用旧对象给新对象初始化时
Test t1 = t;
2、使用对象作为函数的参数或返回值时。
void func(Test t) {}
赋值运行符 :使用旧对象给其它对象赋值时,调用赋值运算符,它的任务就是把对象a中的数据拷贝给对象b,默认情况下也是浅拷贝。
void operator=(const 类& that)
{
}
当你需要重写拷贝构造时,也就需要重写赋值运算符。
关于拷贝构造和赋值函数的建议
1、拷贝构造和赋值函数不光会赋值本类的数据,也会调用父类和成员类的拷贝构造和赋值函数,而不是单纯的内存拷贝,因此尽量少使用指针成员。
2、函数的参数中尽量指针和引用,减少调用拷贝构造的次数,这样也可以提高传递的效率。
3、如果由于特殊原因无法实现拷贝构造和赋值函数,可以先实现个空的 然后私有化,防止误用。
4、一旦实现了拷贝构造也要实现赋值函数,反之亦然。
常用考笔试题: