条款06:若不想使用编译器默认生成的函数,就明确拒绝它
和上文05一脉相承,此时考虑到一些我们不想要默认函数的情况。
比如我们的单例模式不想要默认的构造函数,以免多出来一个对象。或者我们不想要拷贝构造函数,以免造成一些自然语义上的误会。
有几种方法,第一种是声明为private
但是不进行实现:
class B {
private:
B();
B(B& other);
};
这样别人就无法直接使用了,但是编程时要注意,不能让自己的成员函数调用这两个函数(当然如果调用了也可以检测到,因为没有实现,可千万不要写个空函数体啊)。
考虑更多一点,也不能让自己的友元类来调用自己的构造函数,但是这就更不好限制了,而且这样的错误会被移动到连接期报错。
我们还可以给这些类一个共同的基类:
class UnCopyable {
protected:
UnCopyable() {}
~UnCopyable() {}
private:
UnCopyable& operator=(const UnCopyable& oth);
UnCopyable(const Uncopyable& oth);
};
这样,继承这个类的所有类就可以构造,但是不能拷贝了。而且,因为编译器无法为子类生成默认的拷贝构造函数,所以可以把错误提前到编译期报出。
推荐第一种,第二种还要涉及到多重继承啊什么的,可以去看Boost的实现,叫做noncopyable
。