1.编译器会自动生成的函数
当定义一个类时,如果没有声明构造函数、析构函数、拷贝构造函数和拷贝赋值运算符,缺少其中的哪个,编译器就会为它声明一个(编译版本的)对应的函数;
2.阻止拷贝
阻止拷贝有两种方法:
方法一:
在新标准下,将拷贝构造函数和拷贝赋值运算符定义为删除函数(delete function),使用方法如下:
Struct NoCopy
{
NoCopy(); //...
NoCopy(const NoCopy&)=delete;
NoCopy& operator=(const NoCopy&)=delete;
//...
}
方法二:
将拷贝构造函数和拷贝赋值运算符声明为私有的且不予实现,使用方法如下:
class NoCopy
{
NoCopy(); //...
private:
NoCopy(const NoCopy&);
NoCopy& operator=(const NoCopy&);
//...
}
当NoCopy的一个对象去给另一个对象赋值或者执行拷贝操作时,会出现一个未定义的成员导致一个链接时错误,因为函数被定义为private私有的;
当成员函数或者友元函数驶入来呗时,也将出现导致链接时错误,因为没有实现;
综上所述,一般推荐使用方法一来完成阻止拷贝操作。