Effective_cpp-#6

Explicitly disallow the use of complier-generated functions you do not want

动机

在某些时候,我们不希望某个对象能被拷贝或者赋值,因此我们需要某些方法来阻止对象被拷贝或复制。

方法

  • 将成员函数定义为private,并且不去具体实现它们;这样可以避免friend函数和member函数取调用它们;
1
2
3
4
5
6
7
8
class myClass{
public:
...
private:
...
myClass(const myClass&);
myClass& operator=(const myClass&);
};

此时如果client试图拷贝类对象,编译器会报错;而当friend函数和member函数试图去调用,链接器则会报错;

  • 另一种方法则是定义一个uncopyable的基类,让那些不希望被拷贝的类继承该基类
1
2
3
4
5
6
7
8
9
10
11
12
13
class unCopyable{
public:
unCopyable();
~unCopyable();//允许派生对象去构造和析构
private:
...
unCopyable(const unCopyable&);
unCopyable& operator=(const unCopyable&);
};

class myClass : private unCopyable{
... //不再声明copy构造函数和copy赋值函数
}

这种操作可以使得任何调用(包括member函数和friend函数)尝试去拷贝的都会被编译器驳回,因为这种函数的“编译器生成版本”在尝试调用其基类的对应生成时发现基类的拷贝构造和拷贝赋值都是private的

建议

  • 为驳回编译自动生成的函数,可以将相应的成员函数声明为private并且不予实现;或者继承一个如上的unCopyable的基类;