拷贝构造函数是一种特殊的构造函数
(1)它是构造函数,所以函数名是类名、没有返回值
(2)它是特殊的构造函数:参数形式是固定的
class Object
{
public
Object(const Object& other)
{
this->a=other.a;
this->b=other.b;
...
}
};
拷贝构造函数的含义:以一个对象为蓝本,来构造另一个对象。
Object b;
Object a(b);
称作:以b为蓝本,创建一个新的对象a。(a是b的一个拷贝/备份,两者内容是完全相同)
拷贝构造函数从不显示调用,而是由编译器隐式地调用,在以下三种情况:
(1)定义对象
Object a;
Object b(a);//或者写成Object b = a;
(2)动态创建对象
Object a;
Object* p = new Object(a);
(3)函数的传值调用
void Test(Object obj);
区分“构造”与“赋值”
构造:
Object a;
Object b=a;或者Object b(a);此为“构造”,在创建对象的时候给初值,拷贝构造函数被调用
赋值:
Object a;
Object b;
b=a;此为“赋值”,不会调用拷贝构造函数
在拷贝构造函数,可以访问参数对象的任意成员,因为他们是同类,所以访问不受限制。
当没有书写拷贝构造函数时,编译器会默认提供一个拷贝构造函数。默认的拷贝动作:将每一个成员逐个拷贝。
注意:除非必要,不要添加拷贝构造函数。
一旦你决定了要添加拷贝构造函数,请仔细检查:
(1)所有的成员变量,要依次拷贝所有成员变量,不要遗漏
(2)调用父类的拷贝构造函数
只有在深度拷贝的情况下,才需要添加拷贝构造函数。
(1)它是构造函数,所以函数名是类名、没有返回值
(2)它是特殊的构造函数:参数形式是固定的
class Object
{
public
Object(const Object& other)
{
this->a=other.a;
this->b=other.b;
...
}
};
拷贝构造函数的含义:以一个对象为蓝本,来构造另一个对象。
Object b;
Object a(b);
称作:以b为蓝本,创建一个新的对象a。(a是b的一个拷贝/备份,两者内容是完全相同)
拷贝构造函数从不显示调用,而是由编译器隐式地调用,在以下三种情况:
(1)定义对象
Object a;
Object b(a);//或者写成Object b = a;
(2)动态创建对象
Object a;
Object* p = new Object(a);
(3)函数的传值调用
void Test(Object obj);
区分“构造”与“赋值”
构造:
Object a;
Object b=a;或者Object b(a);此为“构造”,在创建对象的时候给初值,拷贝构造函数被调用
赋值:
Object a;
Object b;
b=a;此为“赋值”,不会调用拷贝构造函数
在拷贝构造函数,可以访问参数对象的任意成员,因为他们是同类,所以访问不受限制。
当没有书写拷贝构造函数时,编译器会默认提供一个拷贝构造函数。默认的拷贝动作:将每一个成员逐个拷贝。
注意:除非必要,不要添加拷贝构造函数。
一旦你决定了要添加拷贝构造函数,请仔细检查:
(1)所有的成员变量,要依次拷贝所有成员变量,不要遗漏
(2)调用父类的拷贝构造函数
只有在深度拷贝的情况下,才需要添加拷贝构造函数。