通过构造函数与直接初始化进行成员初始化的比较
Comparison of member initialization by constructor vs. direct initialization
>我正在创建一个类,其中一个成员是指向结构的另一个成员的常量指针(不可变地址)。
在下面的简化版本中,两个类的行为是否始终相同?特别是在ptr
中存储的地址是否保证正确初始化的意义上。
struct First
{
int a;
int* const ptr = &a;
};
struct Second
{
int a;
int* const ptr;
Second() : ptr(&a) {}
};
(在我的实际应用程序中,成员a
是一个类实例,ptr
被从某些枚举到指向a
成员的指针的映射所取代。
在下面的简化版本中,两种结构的行为方式是否始终相同?
不,他们不会,但对您的情况可能没问题。请继续阅读。
First::ptr
和Second::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
有一个用户提供的默认构造函数,这会更改这些类的某些特征。例如,我可以想到聚合,琐碎,也许还有标准布局。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++值初始化矢量迭代器比较
- 使用 lambda 比较初始化优先级队列的方法
- 无法使用比较器初始化标准::函数
- 将向量元素与字符串元素进行比较,而不初始化向量
- 使用更大的比较器初始化映射
- 如何使用自定义比较器初始化类数据成员,该成员是 std::set
- 有没有办法比较用 int 初始化的 char 类型的数组的 2 个元素
- 通过构造函数与直接初始化进行成员初始化的比较
- 使用依赖于 "this" C++ 的比较结构初始化集合
- C 构造函数与初始化列表速度比较
- C++使用自定义比较函数初始化priority_queue
- 在C++中使用自定义比较功能初始化多集
- 与值初始化的迭代器进行比较是否定义良好
- 将STL容器内容与初始化程序列表进行比较
- 用C++中的比较器初始化集合
- STL:用未构造的有状态比较器初始化容器
- 如何用比较函数初始化set的映射
- 关于 VC++ 和 Sun Studio 中的字段初始化顺序、签名比较和未使用的变量的警告
- 正在初始化非静态成员:C++和Java比较