通过构造函数与直接初始化进行成员初始化的比较

Comparison of member initialization by constructor vs. direct initialization

本文关键字:初始化 比较 成员 构造函数      更新时间:2023-10-16

>我正在创建一个类,其中一个成员是指向结构的另一个成员的常量指针(不可变地址)。

在下面的简化版本中,两个类的行为是否始终相同?特别是在ptr中存储的地址是否保证正确初始化的意义上。

struct First
{
int a;
int* const ptr = &a;
};
struct Second
{
int a;
int* const ptr;
Second() : ptr(&a) {}
};

(在我的实际应用程序中,成员a是一个类实例,ptr被从某些枚举到指向a成员的指针的映射所取代。

在下面的简化版本中,两种结构的行为方式是否始终相同?

不,他们不会,但对您的情况可能没问题。请继续阅读。

First::ptrSecond::ptr都将初始化为期望值,即First::a的地址,分别Second::a,但是:

[class.mem]/7&[class.mem]/9

7 在成员声明符中,如果声明符 id具有函数类型,则紧跟在声明符后面的 = 被解释为引入纯说明符,否则将解释为引入大括号或等于初始值设定项

9大括号或等于初始值设定项只能出现在数据成员的声明中。(对于静态数据成员, 见12.2.3.2;有关非静态数据成员,请参阅 15.6.2 和 11.6.1)。非静态的大括号或等于初始值设定项数据成员为成员指定默认成员初始值设定项不得直接或间接导致 封闭类或异常规范的默认默认构造函数的隐式定义的构造函数。

这意味着,First有一个默认的默认构造函数,其中Second有一个用户提供的默认构造函数,这会更改这些类的某些特征。例如,我可以想到聚合琐碎,也许还有标准布局