条款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

results matching ""

    No results matching ""