Skip to content

明确拒绝生成不需要的函数

编译器默认会创建 default 构造函数、copy 构造函数、copy assignment 操作符,以及析构函数。

如果你不想用户使用它们,你就得自行声明它们,并将对应的操作符声明为 private:

cpp
class Animal
{

private:
    Animal(const Animal &);
    Animal &operator=(const Animal &);
};
class Animal
{

private:
    Animal(const Animal &);
    Animal &operator=(const Animal &);
};

将连接期错误移至编译期是可能的,只需要将刚刚的做法在一个专门为了阻止 copying 动作而设计的 base class 内进行实现,然后让所有需要阻止 copying 的 class 都继承这个 base class 即可:

cpp
class Uncopyable
{
protected:
    Uncopyable(){};
    ~Uncopyable() {}

private:
    Uncopyable(const Uncopyable &);
    Uncopyable &operator=(const Uncopyable &)
};

class Animal : private Uncopyable {}
class Uncopyable
{
protected:
    Uncopyable(){};
    ~Uncopyable() {}

private:
    Uncopyable(const Uncopyable &);
    Uncopyable &operator=(const Uncopyable &)
};

class Animal : private Uncopyable {}

小结

  • 为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为 private 并且不予实现。使用像 Uncopyable 这样的 base class 也是一种做法。

Developed by Kisstar & Powered by VitePress.