摘要:
与编译器一致:成员变量初始化的顺序要与类定义中声明的顺序始终保持一致,不用考虑构造函数初始化列表中编写的顺序。要确保构造函数代码不会导致混淆地指定不同的顺序。
考虑以下代码:
class Employee
{
string emall_,firstName_, lastName_;
public:
Employee(const char*firstName, const char* lastName)
:firstName_(firstName),lastName_(lastName)
,emall_(firstName_ + "." + lastName_ + "@gmail.com"){}
};
这段代码隐藏着一个错误,危害性极大,而且很难发现。因为类定义中email_是在first_和last_之前被声明的,它将首先会被初始化,然后试图使用其他未初始化的字段。更糟糕的是,如果构造函数的定义位于另一个文件夹,成员变量声明的顺序对构造函数的正确性的远距离影响就更难确定了。
C++语言之所以才去这样的设计,是因为要确保销毁成员的顺序是唯一的;否则,析构函数将以不同的顺序销毁对 象,具体顺序取决于构造对象的构造函数。为此带来的底层操作开销应该是不可接受的。
解决方案是,总是按成员声明的顺序编写吃呢个月初始化语句。这样,任何非法依赖都会显而易见。当然,尽量不让一个成员的初始化依赖于其他成员更好。
许多编译器在我们违反了此条规则时会发出警告。