我目前正在学习c ++课程,并试图深入了解整个事情。 我想出了一些理论,如果有人能证实它们会很棒:
每个变量(本地,全局,staic,成员和非成员)都保证在首次使用之前调用其ctor
像int这样的基元的ctors基本上是无操作,所以我们明确地赋值,没有默认的零值。
以下类在语义上是相同的(并且应该生成相同的代码)
class A
{
int n;
};
和
class A
{
int n;
public:
A() : n() {}
};
和
class A
{
int n;
public:
A() { n = int(); }
};
变量n在每种情况下仍然未初始化。
编辑:
似乎我绝对低估了这个主题的复杂性,我的大部分假设都是错误的。现在我仍然试图找出对象初始化的基本规则。
答案 0 :(得分:4)
我怕你错了。当你说:
int n = int();
然后n(和所有其他POD类型)将初始化为零。
另外,请确保您对初始化和分配之间的区别非常清楚 - 这在C ++中非常重要:
int n = int(); // initialisation
n = 0; // assignment
答案 1 :(得分:3)
您可能会发现this很有趣。
新Foo和new之间的区别 Foo()就是前者 未初始化,后者将是 当Foo时,默认初始化(为零) 是POD类型。所以,什么时候不使用 形成与parens,成员“a” 可以包含垃圾,但随着 parens“a”将始终被初始化 到0。
答案 2 :(得分:1)
不,该变量仅在第一种情况下未初始化。
对于具有用户定义构造函数的类的成员,情况很简单:始终调用构造函数。
内置类型(和“普通旧数据”结构)可能未初始化,如第一个示例所示。虽然它们没有用户提供的构造函数,但使用构造语法(另外两个示例)将它们初始化为零。
这个稍微棘手的规则的原因是避免不必要的开销;例如,如果您定义:
struct S
{
int array[1024*1024];
};
只打算根据需要分配值,你不希望编译器在构造一个内存时用零填充4Mb的内存。
答案 3 :(得分:1)
class A
{
int n;
};
仅分配了内存,未对n
进行初始化。
class A
{
int n;
public:
A() : n() {}
};
此处n
初始化为0。
class A
{
int n;
public:
A() { n = int(); }
};
首先构建n
(没有任何默认值),
然后 int()
导致使用值0创建临时int
然后将其分配给n
;