任何时候创建一个只有一个参数的构造函数(cast构造函数),都会激活一个隐式的用户定义的转换;定义一个转换运算符(cast运算符)而不是一个构造函数,也会激活一个隐式转换。
pub_String { // ... public: pub_String(const char *cptr, int maxSizeHint = 0); // "cast constructor" // ... operator const char *() const; // "cast operator" };
原则109:会激活隐式转换的构造函数,尤其是从广泛使用的类型或基本类型(如 int)的转换,会破坏由强类型所提供的安全性。
指导方针33:考虑避免cast运算符,尤其是对基本整数类型,改为进行显式的转换。
指导方针34:为任何定义在头文件中的类显式声明(公共或私有的)构造函数和赋值运算符,甚至在默认的实现是充分的情况下。
次要设计规则8:在每一个声明了一个虚函数的(或派生于一个声明了虚函数的类的)类中,把析构函数显式的声明为类中的第一个虚函数,并且非内联的定义它。
指导方针35:在没有另外声明虚函数的类中,显式的把析构函数声明为非虚拟的并且适当的对它进行定义(内联的或非内联的)。