CppCoreGuidelines E.5 让构造函数构建不变式,如果不能构建,抛出异常
26 July 2023
“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 如果构造函数不能构造一个有效对象,抛出一个例外。
强化
标记内部有私有状态,且没有构造函数(公开、保护、私有构造函数)的类。