26 July 2023

C++ 核心指南目录

“Let a constructor establish an invariant, and throw if it cannot”

理由

允许未建立不变式的对象会导致很多麻烦。某些成员函数可能无法正确调用。

例子

class Vector {  // very simplified vector of doubles
    // if elem != nullptr then elem points to sz doubles
public:
    Vector() : elem{nullptr}, sz{0}{}
    Vector(int s) : elem{new double[s]}, sz{s} { /* initialize elements */ }
    ~Vector() { delete [] elem; }
    double& operator[](int s) { return elem[s]; }
    // ...
private:
    owner<double*> elem;
    int sz;
};

在这这个类的构建过程中, new 可能会抛出异常,导致 Vector 的元素没有正确构建。这时候,依赖于这个不变式的下标操作就会调用出错。

请查看:C.42 如果构造函数不能构造一个有效对象,抛出一个例外

强化

标记内部有私有状态,且没有构造函数(公开、保护、私有构造函数)的类。