2009-06-11 126 views
2

我目前正在学习一门C++课程并试图深入理解整个事情。 我想出了一些理论,这将是巨大的,如果有人能证实他们:变量初始化和构造函数

每个变量(本地,全局staic,会员和非会员)都保证有第一次使用

之前调用它的构造函数

像int这样的基本类的ctors基本上是no-ops,所以我们明确地赋值了一个值,没有默认的零值。

以下类在语义上是相同的(并且应该产生相同代码)

class A 
{ 
    int n; 
}; 

class A 
{ 
    int n; 
public: 
    A() : n() {} 
}; 

class A 
{ 
    int n; 
public: 
    A() { n = int(); } 
}; 

变量n为在所有情况下仍然未初始化。

编辑:

这似乎是我absolutetly低估了这个问题的复杂性,我大部分的假设是错误的。现在Iam仍然试图找出对象初始化的基本规则。

回答

3

您可能会发现this有趣。

新Foo和新 美孚()之间的区别是,前者将 未初始化,而后者将是当富 是POD类型 缺省初始化(为零)。所以,不使用带有括号,成员“一” 可以包含垃圾,但与 括号“a”将永远被初始化 为0

+1

我觉得这个说法很难相信。 class Bar {int n; }是一个POD,因为它是隐式定义的,因此它是/平凡/(来自ISO的正式术语)。然而,它是存在的,并且'新酒吧'和'新酒吧()`称它。在任何情况下Bar :: Bar()都不会初始化Bar :: n – MSalters 2009-06-11 10:04:31

+0

“class B {int n;};” *不是* POD,因为它包含一个私有的非静态成员'n'。但是,如果它被定义为“class B {public:int n;};”那么它将是一个POD,所以当您执行“新Bar()”时,'n'将被初始化。 – 2009-06-11 10:59:04

+1

新手是否有可能完全理解这个主题?似乎有这么多的规则和例外:-( – codymanix 2009-06-11 11:22:23

4

恐怕你错了。当你说:

int n = int(); 

然后n(和所有其他POD类型)将零初始化。

此外,还要确保你是在你对初始化和分配之间的差别心里很清楚 - 这是在C语言很重要++:

int n = int(); // initialisation 
n = 0;   // assignment 
1

否 表单时,该变量只在第一种情况下没有初始化。

对于具有用户定义构造函数的类的成员,情况很简单:总是调用构造函数。

内置类型(和“普通旧数据”结构)可能会保持未初始化状态,如第一个示例中所示。尽管它们没有用户提供的构造函数,但使用构造语法(您的其他两个示例)将它们初始化为零。

这个稍微棘手的规则的原因是为了避免不必要的开销;例如,如果你定义:

struct S 
{ 
    int array[1024*1024]; 
}; 

仅为分配值,你需要他们,你不想让编译器零粉饰4MB内存,只要你构建一个意图。

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()导致一个临时INT被初始化创建值为0 然后将其分配给n;