为什么显式初始化列表更容易出错?

7
在书籍《C++对象模型内幕》中,作者指出了显式初始化列表的三个缺点:
1. 只有当所有类成员都是公共的时才能使用。 2. 只能指定常量表达式(那些可以在编译时计算的表达式)。 3. 由于编译器不会自动应用它,因此对象初始化失败的可能性显著增加。
我不知道为什么显式初始化列表更容易失败。"编译器不会自动应用它"是什么意思?
是否有一些例子来证明这个观点呢?
感谢您的回答。

1
“我不知道为什么显式初始化列表更容易出现故障。” 说实话,我也不知道?!?当前标准已经明确定义了初始化策略,并且我无法看到使用“显式初始化列表”会有任何缺点。也许你的书不是那么好的资源,或者你错过了一些特定的上下文。 - πάντα ῥεῖ
1
@πάνταῥεῖ 嗯,这本书是1996年写的,所以很多内容现在已经不适用了。 - Shafik Yaghmour
@quantdev 这本书是Lippman的《C++对象模型内幕》,在第5.1章。 - Wizmann
1996年,哇。所以这是一本关于第一个ISO标准之前的C++的书。是啊,我可以看出那时候事情可能会发生变化。 - chris
@ShafikYaghmour 同意。这本书可能有点过时了。但我找不到其他关于这篇文章的书籍。 - Wizmann
显示剩余3条评论
1个回答

4
以下是Lipmann的书中显式初始化列表的示例。
Point1 local1 = { 1.0, 1.0, 1.0 };

我认为他想表达的是你必须记得使用显式初始化!换句话说,它们不能替换构造函数。如果你忘记使用列表...

Point local2;

如果你遇到了“无法初始化对象”的问题,那么很可能是因为你没有使用初始化列表。这并不是说初始化列表会以任何方式失败,而只是你可能会忘记使用它。
与构造函数进行比较。
Point::Point (int x=0, int y=0, int z=0) : x(x), y(y) z(z) {};

现在您可以同时做到这两点,仍然能够获得明确的结果。
 Point local3(1.0, 1.0, 1.0);
 Point local4; // uses default values of 0,0,0

避免在C++编程中使用POD是一个好习惯吗?尽管POD可能具有更好的性能。 - Wizmann
@Wizmann,我真的不会担心在几乎所有情况下的任何性能差异。无论如何,一个类仍然可以有很多东西并且是POD。唯一与这个问题冲突的要求是它需要一个平凡的默认构造函数和POD数据成员。无论如何,请参见http://coliru.stacked-crooked.com/a/ec7100fcc3d8fb69 - chris
@chris 但是如果你忘记使用初始化列表创建对象,仍然需要担心对象的未定义值。 - Wizmann
@Wizmann,是的,你会的,这就是为什么琐碎的默认构造函数要求与问题冲突。 - chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接