1.拷贝与赋值区别
赋值操作是将一个对象的值赋予另一个已经存在的对象,而拷贝构造函数则是利用一个已经存在的对象来创建一个新对象。
class A {
int i;
public:
A() {} //显示定义了拷贝构造函数,所以编译器不会生成默认构造函数
A(const A& a) { cout << "copy A"; }
A& operator=(A& a) { cout << "=="<<endl; return a; }
};
int main() {
A a;
A b;
a = b; //赋值
A c = a; //拷贝
}
运行结果:
2. 拷贝构造函数的显示定义
并不是每个类都必须显示定义拷贝构造函数。显示定义拷贝构造函数通常发生在以下两种情况:
1)完成“深拷贝”
2)新产生的对象的内容与原对象并不完全相同
3.默认构造函数功能
默认构造函数会将参数逐个拷贝到正在创建的对象中。编译器从给定对象中依次将每个非static成员拷贝到正在创建的对象中。
每个成员的类型决定了它是如何进行拷贝的:对类类型成员,会使用拷贝构造函数类拷贝。内置类型的成员则直接拷贝。对于数组,拷贝构造函数会逐元素地拷贝,如果数组元素是类类型,则使用拷贝构造函数来拷贝。(对于指针类型成员,直接拷贝)
4.阻止拷贝
某些情况下,定义类时必须采用某种机制阻止拷贝或赋值。例如,iostream类阻止了拷贝,以避免多个对象写入或读取相同的IO缓冲。
1) 定义删除函数
删除函数:定义了它,却不能以任何方式使用它
将拷贝构造函数和赋值运算操作定义为删除函数。
在函数的参数列表后面加上 “=delete” 来表明。
class A {
public:
A() {}
A(const A& a) = delete;
A& operator=(A& a) = delete;
};
2)private拷贝控制
将拷贝构造函数和赋值运算符声明为私有