条款06:若不想使用编译器自动生成的函数,就该明确拒绝

Explicitly disallow the use of compiler-generated functions you do not what.

编译器产出的函数都是 public,如果想阻止这些函数被创建出来,并且没什么需求使用,可以将将它们声明为 private。即明确声明一个成员函数,阻止了编译器暗自创建其专属版本;而令这些函数为 private,使得客户无法调用它。

不过这个做法并不绝对安全,因为 member 函数和 friend 函数还是可以调用 private 函数。但是可以选择不去定义它们,这样如果不慎调用它们,会获得一个连接错误(linkage error)。即将成员函数声明为 private 而且故意不实现它们。

class HomeForSale {
public:
    ...
private:
    ...
    HomeForSale(const HomeForSale&);
    HomeForSale& operator=(const HomeForSale&);
};

这里并不需要写函数参数名称,因为这些函数没有被实现,并且不会被调用。

如果想令许多类不能被复制,可以专门为阻止 copying 动作而设计一个 base class:

class Uncopyable {
protected:
    Uncopyable() {}
    ~Uncopyable() {}
private:
    Uncopyable(const Uncopyable&);
    Uncopyable& operator=(const Uncopyable&);
};

class HomeForSale: private Uncopyable {        // class 不用再声明 copy 构造函数 或 copy assign 操作符
    ...
};

编译器构造的默认函数会尝试调用其 base class 的对应函数,但这些调用会被编译器拒绝,因为 base class 的拷贝函数是 private 的。

Last updated

Was this helpful?