对于一些类来说,拷贝操作是没有意义的,例如 iostream 类阻止了拷贝,以避免多个对象写入或读取相同的 IO 缓冲。
1. 删除函数deleted function
1.1 定义
通过在函数的参数列表后面加上 =delete 函数来指明来指明这是一个删除函数,即是不能以任何方式备调用。
struct Nocopy{
NoCopy() = default; //默认合成构造函数
NoCopy(const NoCopy&) = delete; //阻止拷贝
NoCopy& operator=(const NoCopy&) = delete; //阻止赋值
~NoCopy() = default; //默认合成析构函数
}
- =delete 必须出现在函数第一次声明的时候,编译器需要知道一个函数是删除的,以便禁止它。
- 可以对任何函数指定 =delete,但是只能对有默认合成的函数使用 =default。
- 析构函数不能是删除函数,否则delete 对象,局部对象析构都将error
1.2 类的成员函数是删除函数带来的影响
如果类的某个成员的析构函数是删除函数,那么
- 类的合成析构函数也被定义为删除函数
- 类的合成拷贝构造函数也被定义为删除函数
如果类的某个成员的赋值运算符是是删除函数,或者类有一个 const 的引用成员,那么
- 类的合成拷贝赋值运算符被定义为删除的
- 或者有一个 const 成员,它没有类内初始化器且未显示定义默认构造函数,则该类的默认构造函数被定义为删除的。
总之,如果一个类有数据成员不能默认构造、拷贝、复制、销毁,则对应的成员函数将被定义为删除的。
2. private 拷贝控制
新标准之前,类是通过将其拷贝构造函数和拷贝赋值运算符声明为 private 的类阻止拷贝。
class PrivateCopy{
PrivateCopy(const PrivateCopy &);
PrivateCopy& operator= (const PrivateCopy &);
public:
PrivateCopy();
~PrivateCopy();
}