C++类成员的默认值是什么?

62

在C++中,结构体和类成员的默认值是什么?这些规则在类、结构体、基本类型等方面有何不同?是否存在规则不同的情况?


3
请参阅以下链接:https://dev59.com/aXI-5IYBdhLWcg3w6tFR,https://dev59.com/33E95IYBdhLWcg3wMa91,https://dev59.com/M3NA5IYBdhLWcg3wKacx - outis
2个回答

60
在C++中,结构体和类在这方面没有区别,它们都被统称为“class types”。
通常情况下,类成员没有默认值。为了使类成员获得确定性的值,必须进行“初始化”,可以通过以下方式实现:
- 成员本身的默认构造函数 - 封闭类的构造函数初始化列表 - 显示指定封闭类对象的初始化(包括值初始化和聚合初始化)
此外,所有静态存储期的对象都会在程序启动时进行零初始化。
除上述情况外,类成员再次没有默认值,最初将包含不可预测的垃圾值。

19
静态存储区总是被初始化为零。这是由编程语言保证(要求),与任何操作系统无关。 - AnT stands with Russia
@jpyllman 这是 C 标准的一部分(不是 C++)。它在 K&R 中提到过。 - lorean
2
@lorean:我不确定你所谓的“非C++”是什么意思。在C++标准中,静态存储期对象的无条件零初始化也是明确存在的。C++与C不同之处在于它允许静态对象进行动态(即运行时)初始化,但仍然规定所有静态对象都在任何其他初始化开始之前进行零初始化。 - AnT stands with Russia
我的评论措辞不当。我是指它在C++继承的C标准的一部分中被指定。 - lorean
2
自从C++14以来,静态对象不一定会首先进行零初始化,详见 - M.M
显示剩余5条评论

17

是的,有一个方法。如果你使用默认构造函数并用括号初始化对象,则POD成员将被零初始化:

someClass * p = new someClass();

1
这个说法并不正确。它非常依赖于编译器的作者。标准中没有任何规定,除非程序员为其分配了一个值,否则POD值将不会被初始化。这就是为什么存在开发者工具,如valgrind的原因。 - Damian Dixon
1
@DamianDixon 不是这样的,请看下面:C++14 8.5 11 "如果一个对象的初始化器是空括号集,即 (),则该对象将被值初始化。". 8.5 8 "对于类型为 T 的对象进行值初始化意味着:... 如果 T 是一个(可能带有 cv 限定符的)类类型,且没有用户提供或删除的默认构造函数,则该对象将被零初始化..." 8.5 6 "对于类型为 T 的对象或引用进行零初始化意味着:... — 如果 T 是一个(可能带有 cv 限定符的)非联合类类型,则每个非静态数据成员和每个基类子对象都将被零初始化..." - HolyBlackCat
@HolyBlackCat,你必须使用空括号。如果你不加上(),也就是不提供任何初始化,那么你就无法得到这种行为,最终会得到一个未初始化的POD。因此,程序员必须采取一些措施来初始化变量。 - Damian Dixon
@HolyBlackCat,我已经尝试过使用空括号,但个人认为最好避免使用它们。请查看我的答案中的示例以了解原因(此处空间不足)。希望现在我对这一点有了更好的理解。谢谢。 - Damian Dixon
假设 someClass p = someClass(); 有相同的效果? - user3882729
显示剩余2条评论

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