C++编程规范指47.以同样的顺序定义和初始化成员变量

简介:

摘要:

   与编译器一致:成员变量初始化的顺序要与类定义中声明的顺序始终保持一致,不用考虑构造函数初始化列表中编写的顺序。要确保构造函数代码不会导致混淆地指定不同的顺序。

考虑以下代码:

<span style="font-size:18px;">class Employee
{
         string emall_,firstName_, lastName_;
public:
         Employee(const char*firstName, const char* lastName)
                   :firstName_(firstName),lastName_(lastName)
                   ,emall_(firstName_ + "." + lastName_ + "@gmail.com"){}
};</span>


    这段代码隐藏着一个错误,危害性极大,而且很难发现。因为类定义中email_是在first_和last_之前被声明的,它将首先会被初始化,然后试图使用其他未初始化的字段。更糟糕的是,如果构造函数的定义位于另一个文件夹,成员变量声明的顺序对构造函数的正确性的远距离影响就更难确定了。

    C++语言之所以才去这样的设计,是因为要确保销毁成员的顺序是唯一的;否则,析构函数将以不同的顺序销毁对  象,具体顺序取决于构造对象的构造函数。为此带来的底层操作开销应该是不可接受的。

解决方案是,总是按成员声明的顺序编写吃呢个月初始化语句。这样,任何非法依赖都会显而易见。当然,尽量不让一个成员的初始化依赖于其他成员更好。

    许多编译器在我们违反了此条规则时会发出警告。

相关文章
|
4天前
|
存储 算法 测试技术
|
4天前
|
程序员 编译器 C++
|
4天前
|
存储 程序员 编译器
C++11:声明 & 初始化
C++11:声明 & 初始化
9 0
|
4天前
|
算法 C++
【C++入门到精通】condition_variable(条件变量)C++11 [ C++入门 ]
【C++入门到精通】condition_variable(条件变量)C++11 [ C++入门 ]
12 0
|
4天前
|
安全 程序员 编译器
【C++】继承(定义、菱形继承、虚拟继承)
【C++】继承(定义、菱形继承、虚拟继承)
15 1
|
4天前
|
编译器 C++
【C++】类与对象(运算符重载、const成员、取地址重载)
【C++】类与对象(运算符重载、const成员、取地址重载)
15 2
|
4天前
|
存储 编译器 C语言
【C++】类与对象【定义、访问限定符、this指针】
【C++】类与对象【定义、访问限定符、this指针】
6 1
|
4天前
|
编译器 C++
【C++】【C++的常变量取地址问题(对比C的不同)】const修饰的常变量&volatile修饰用法详解(代码演示)
【C++】【C++的常变量取地址问题(对比C的不同)】const修饰的常变量&volatile修饰用法详解(代码演示)
|
4天前
|
存储 Java C++
【C++类和对象】探索static成员、友元以及内部类
【C++类和对象】探索static成员、友元以及内部类
|
4天前
|
安全 程序员 编译器
【C++类和对象】初始化列表与隐式类型转换
【C++类和对象】初始化列表与隐式类型转换