C++ Primer 5th笔记(chap 13 拷贝控制)阻止拷贝

对于一些类来说,拷贝操作是没有意义的,例如 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();
}

猜你喜欢

转载自blog.csdn.net/thefist11cc/article/details/113858100