静态或动态初始化
问题描述:
初始化时使用默认构造函数(编译器生成) “静态初始化”或“动态初始化”?静态或动态初始化
我的意思是,在
class test{
int m;
public :
test(): m(12) {}
};
test i;
int main()
{//
}
这里时i
得到初始化 - 在编译时或者是动态初始化,即是可以安全使用于其他文件i
用于初始化或其他东西?
如果用户定义了默认构造函数会怎么样?
答
由于test
有一个构造函数,它将在对象初始化时运行。该对象将被放置到被初始化为零的存储区中。你甚至可以通过之前创建对象后使用i.m
初始化值测试:
extern test i;
int dummy1 = i.m;
test i;
int dummy2 = i.m;
当你然后打印dummy1
和dummy2
你应该得到0
和12
,分别。如果你想要静态初始化i
你需要但使用像
test i = { 12 };
这只能带豆荚的作品。总之,请注意全球数据总是不好的。只是不要打扰和正确做事。
问题的症结在于:“当这些对象具有用户定义的构造函数时,如何初始化全局/命名空间范围对象?”。答案可以在标准的§3.6.2中找到。在这种情况下,'i.m'会被静态初始化为0,并被动态地初始化为12,然而,如果默认构造函数被声明为'constexpr',那么'i.m'会被静态初始化为12。 – Mankarse 2012-02-18 10:27:07