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

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

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

相关文章
|
12天前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
21 3
|
12天前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
18 2
|
11天前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
47 1
|
12天前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
18 1
|
13天前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
21 3
|
13天前
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
36 3
|
12天前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
13 0
|
12天前
|
C++
C++构造函数初始化类对象
C++构造函数初始化类对象
11 0
|
10天前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
10天前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)