条款-06 若不想使用编译器自动生成的函数,就该明确拒绝
- 为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为 private 并且不予实现。使用像 Uncopyable 这样的 base class 也是一种做法。
有 以下两种方法避免编译器自动生成拷贝构造函数:
-
把 cpoy 构造函数和 copy assignment写在基类的 private继承里,且只写声明,不写参数名称。
class HomeForSale { public: …… private: …… HomeForSale ( const HomeForSale& ); HomeForSale& operator=( const HomeForSale& ); };
-
在子类继承基类的时候,写成 private 继承。
class Uncopyable { protocted : Uncopyable () {} ~Uncopyable () {} private : Uncopyable ( const Uncopyable& ); Uncopyable& operator=( const Uncopyable& ); }; class HomeForSale : private Uncopyable{ // class 不再声明 …… // copy 构造函数、copy assignment 操作符。 };