代码示例应该解释一下:
class A
{
B* pB;
C* pC;
D d;
public :
A(int i, int j) : d(j)
{
pC = new C(i, "abc");
} // note pB is not initialised, e.g. pB(NULL)
...
};
显然 pB 应该显式初始化为 NULL 以保证安全(且清晰),但是,就目前情况而言,A 构建后 pB 的值为多少?它是否默认初始化(为零?)或未初始化(即不确定以及内存中的任何内容)。我意识到 C++ 中的初始化有相当多的规则。
我认为它没有默认初始化;在 Visual Studio 中以调试模式运行时,它已将 pB 设置为指向 0xcdcdcdcd - 这意味着内存已被新建(在堆上)但未初始化。然而在释放模式下,pB 始终指向 NULL。这是否只是偶然,因此不值得依赖?或者这些编译器是否为我初始化它(即使它不在标准中)?当在 Solaris 上使用 Sun 的编译器进行编译时,它似乎也是 NULL。
我真的在寻找对标准的具体参考,以某种方式说。
Thanks.
以下是标准中的相关段落:
12.6.2 初始化基类和成员 [class.base.init]
4 如果给定的非静态数据成员或
基类不是由内存命名的
初始化程序 ID 在
内存初始化列表,然后
--如果实体是非静态数据
成员(可能符合简历资格)
类类型(或其数组)或基类,以及实体类
是一个非 POD 类,该实体是默认初始化的(dcl.init)。
如果实体是 const 限定类型的非静态数据成员,
实体类应具有用户声明的默认构造函数。
--否则,该实体不是
已初始化。如果实体是
const 限定类型或引用类型,或者(可能是 cv 限定类型)
字段)POD 类类型(或其数组)包含(直接或
间接)const 限定类型的成员,程序是
患病的-
形成。
调用构造函数后
X 级已完成,如果成员
X 中既没有指定
构造函数的内存初始化器,也不是
默认初始化,也没有初始化
在执行主体期间
构造函数,成员有
不确定的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)