当一个对象是独一无二的时候,为这个对象做一个副本有点没道理,所以我们应阻止对它进行的拷贝,但是,阻止这一动作并不是很直观,通常来说,你不希望class的某一功能,只要不声明对应的函数就行了,但这个策略对拷贝构造函数和赋值操作符思是无效的,因为如果你不声明它们,编译器会替你声明一个默认的,那么该如何解决这个问题呢,通常来说,可以采取如下三种方法。
- 将拷贝构造函数和赋值操作符声明为私有成员函数,并且只声明而不实现,这样似乎变得更安全一些,然而如果类的成员函数和友元函数调用它时,将会发挥僧错误,不过这种错误很容易检查出来。
class A{
public:
A(){}
~A(){}
private:
A(const A&);
A& operator=(const A&);
};
- 为这两个操作单独写出一个类,如下:
class Uncopyable{
protected:
Uncopyable(){}
~Uncopyable(){}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
};
//为阻止拷贝与赋值操作符,继承Uncopyable类;
class A: private Uncopyable(){
...
};
这样,同样能达成我们的目的。
- 我们还可以定义删除的函数,它是这样一种函数,虽然我们声明了它们,但是我们不能以任何一种方式使用它,在函数的参数列表后面加上=delete来指出我们希望它定义为删除的。
class Uncopyable{
public:
Uncopyable(const Uncopyable&) = delete;
Uncopyable& operator=(const Uncopyable&) = delete;
};
需要注意的是我们一般不定义析构函数为删除的,那样我们将不能销毁此类型的对象了。