默认初始化和值初始化有什么区别?

14

2个回答

10
根据标准 (8.5/4,5):
默认初始化类型 T 的对象意味着: - 如果 T 是非 POD 类型的类,将调用 T 的默认构造函数进行初始化 (如果 T 没有可访问的默认构造函数,则此初始化属于不合法操作); - 如果 T 是数组类型,则对每个元素进行默认初始化; - 否则,对象将被零初始化。
值初始化类型 T 的对象意味着: - 如果 T 是带有用户声明构造函数 (12.1) 的类类型 (见第9条款),则调用 T 的默认构造函数 (如果 T 没有可访问的默认构造函数,则此初始化属于不合法操作); - 如果 T 是没有用户声明构造函数的非联合类类型,则 T 的每个非静态数据成员和基类都将被值初始化; - 如果 T 是一个数组类型,则对每个元素进行值初始化; - 否则,对象将被零初始化。

2
警告:此答案针对C++11已过时。请参见https://dev59.com/_2Eh5IYBdhLWcg3wnEYc。在C++11中,对于"default-initialize"情况,"-- 否则,对象将被零初始化"被替换为"-- 否则,不进行初始化"。 - Dan Nissenbaum

9

"default-initialise"会按照标准规定给变量赋默认值,这可能是垃圾值

"value-initialise"会将变量初始化为特定的值 - 比如在构造函数中设置的值,或者由编译器进行优化。


1
这帮助我记住,当你value初始化某些东西时,该物品确实正在设置其值(即使这意味着将它们设置为0作为回退,如果没有可用的构造函数),而普通的default初始化将没有回退,并且如果没有构造函数设置其值,则值可能未初始化。 以C ++的精神,必须有一些条件来强制进行value初始化 - 即,您必须显式传递括号,例如A a();(请参见https://dev59.com/aGox5IYBdhLWcg3w9o-i#8860787)。 - Dan Nissenbaum
1
@Dan Nissenbaum A不是一个(); 作为函数声明看起来很棘手,这不是一个令人烦恼的解析问题吗? - Zebrafish

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