阻止拷贝

来源:互联网 发布:mina 接收数据不完整 编辑:程序博客网 时间:2024/05/21 09:22

大多数类应该定义默认构造函数、拷贝构造函数和拷贝赋值运算符,无论是隐式的还是显式的。
虽然大多数类应该定义(而且通常也的确定义了)拷贝构造函数的拷贝赋值运算符,但对某些类来说,这些操作没有合理的意义。
定义删除的函数
在新标准下,我们可以通过将拷贝构造函数和拷贝赋值运算符定义为删除的函数来阻止拷贝。删除的函数是这样一种函数:我们虽然声明了它们,但不能以任何方式使用它们。
与=default不同,=delete必须出现在函数第一次声明的时候。
析构函数不能是删除的成员
如果析构函数被删除,就无法销毁此类型的对象了。
对于删除了析构函数的类型,虽然我们不能定义这种类型的变量或成员,但是可以动态分配这种类型的对象。但是,不能释放这些对象。
合成的拷贝控制成员可能是删除的
对某些类来说,编译器将这些合成的成员定义为删除的函数:
1。如果类的某个成员的析构函数是删除的或不可访问的,则类的合成析构函数被定义为删除的。
2。如果类的某个成员的拷贝构造函数是删除的或不可访问的,则类的合成拷贝构造函数被定义为删除的。如果类的某个成员的析构函数是删除的或不可访问的,则类的合成拷贝构造函数也被定义为删除的。
3。如果类的某个成员的拷贝赋值运算符是删除的或不可访问的,或是类有一个const的或引用成员,则类的合成拷贝赋值运算符被定义为删除的。
4。如果类的某个成员的析构函数是删除的或不可访问的,或是类有一个引用成员,它没有类内初始化器,或是类有一个const成员,它没有类内初始化器且类型未显式定义默认构造函数,则该类的默认构造函数被定义为删除的。
本质上,这些规则的含义是:如果一个类有数据成员不能默认构造、拷贝、复制或销毁,则对应的成员函数将被定义为删除的。
本质上,当不可能拷贝、赋值或销毁类的成员时,类的合成拷贝控制成员就被定义为删除的。

0 0
原创粉丝点击