C++ 类成员的默认值是啥

Posted

技术标签:

【中文标题】C++ 类成员的默认值是啥【英文标题】:What is the default value for C++ class membersC++ 类成员的默认值是什么 【发布时间】:2011-02-06 13:45:34 【问题描述】:

c++ 中结构成员和类成员的默认值是什么,这些规则有何不同(例如,在类/结构/基元/等之间)?是否存在默认值规则不同的情况?

【问题讨论】:

另见:***.com/questions/1613341/…、***.com/questions/2417065/…、***.com/questions/1069621/… 【参考方案1】:

在 C++ 中,结构和类在这方面没有区别。它们都被称为类类型

类类型的成员在一般情况下没有默认值。为了让一个类成员获得一个确定性的值,它必须被初始化,这可以通过

来完成 成员本身的默认构造函数 封闭类的构造函数初始化列表 为封闭类的对象显式指定初始化程序(包括值初始化和使用聚合初始化程序进行初始化)。

此外,所有具有静态存储持续时间的对象在程序启动时都被初始化为零。

除了上述情况,类成员再一次没有默认值,并且最初会包含不可预测的垃圾值。

【讨论】:

静态存储是否零初始化取决于您运行的操作系统。 @jpyllman:不。静态存储始终是零初始化的。无论任何操作系统,它都由语言保证(要求)。 好的,我试图找到这样的信息,但没有找到。我一直认为它是未定义的,除非你设置一些值。 @lorean:我不确定你所说的“不是 C++”是什么意思。具有静态存储持续时间的对象的无条件零初始化也明确存在于 C++ 标准中。 C++ 与 C 不同,因为它允许对静态对象进行动态(即运行时)初始化,但 C++ 仍然表示所有静态对象在任何其他初始化开始之前都是零初始化的。 由于 C++14 静态对象不一定要先零初始化,see detail.【参考方案2】:

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

someClass * p = new someClass();

【讨论】:

此说法不正确。这很大程度上取决于谁编写了编译器。标准中没有任何内容表明 POD 值将被初始化为任何值,除非程序员为其分配了一个值。这就是存在 valgrind 等开发人员工具的原因。 @DamianDixon 不,请参见以下内容:C++14 8.5 11 “初始化器为空括号集的对象,即 (),应进行值初始化。”8.5 8 "对 T 类型的对象进行值初始化意味着: ... 如果 T 是(可能是 cv 限定的)类类型,没有用户提供或删除的默认构造函数,则该对象被零初始化..." 8.5 6 "对 T 类型的对象或引用进行零初始化意味着: ... — 如果 T 是(可能是 cv 限定的)非联合类类型,则每个非-static 数据成员和每个基类子对象都是零初始化的..." @HolyBlackCat,但是您必须使用空括号。如果您不添加 (),即提供某种初始化,那么您将不会得到这种行为,并且最终会得到一个未初始化的 POD。所以程序员必须做一些事情来初始化变量。 @DamianDixon 是的,这就是重点!我发布了第一条评论,因为您似乎不同意 () zero-inits 类字段缺少用户定义的 ctor 的事实,这是 Hans Passant 所说的。 @HolyBlackCat,点了。我以前没有遇到过这种语言变化。我总是习惯性地将变量初始化为定义的值,因为我必须使用 VS2010 及更高版本。我已更新我的答案以反映标准中的这一变化。

以上是关于C++ 类成员的默认值是啥的主要内容,如果未能解决你的问题,请参考以下文章

Java面向对象——类的成员

Java中成员属性默认访问修饰符是啥

使用模板类数据成员的c ++“没有适当的默认构造函数可用”错误

c++语言中class是啥意思

如果我声明一个内部类,内部成员的默认访问级别是啥?

visual C++中error C2352是啥意思