一 拷贝构造函数
拷贝构造函数是一种特殊的构造函数(copy constructor)
(1) 它是构造函数,所以函数名是类名,没有返回值
(2)它是特殊的构造函数,参数形式是固定的
例如,
class Object{
public:
Object(const Object& other);
};
拷贝构造函数的含义:以一个对象为蓝本,来构造另一个对象。
Object b;
Object a(b);
称作:以b为蓝本,创建一个新的对象a,a是b的一个拷贝/备份,两者内容完全相同。
- 拷贝构造函数的调用
拷贝构造函数从来不显示调用,而是由编译器隐士地调用, 有以下三种情况:
(1)定义对象:
Object a;
Object b(a);
(2)动态创建对象:
Object a;
Object* P = new Object(a);
(3) 函数的传值调用
void Test(Object obj);
注意⚠️
1 区分构造与赋值
构造:
Object a;
Object b(a);
此时为构造,在创建对象的时候给初值,拷贝构造函数被调用;
赋值:
Object a(1,2);
Object b;
b=a;
此时为赋值,不会调用拷贝构造函数。
- 可以访问同类对象的private成员
在拷贝构造函数里,可以访问参数的任意成员
二 默认的拷贝构造函数
当没有写拷贝构造函数时,编译器会默认提供一个拷贝构造函数。默认的拷贝工作:将每一个成员逐格拷贝。也就是说,在多数情况下,我们无需操心,编译器会帮我们完成成员的拷贝动作。
拷贝构造函数的检查项:(除非必要,不要添加拷贝构造函数)
一旦添加了,请仔细检查:
(1)所有的成员变量,要依次拷贝,不要遗漏
(2)调用父类的拷贝构造函数,要么不负责,要么全负责
三 深度拷贝
拷贝其具体的数据:
Text(Const Text& other){
m_size = other.size;
m_buf= new char[m_size];
strcpy(m_buf,other.muf);
}
此种情况称为深度拷贝,省事的办法:禁止用户进行拷贝构造,将拷贝构造函数设定为private。