变量初始化和构造函数
我目前正在学习一门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仍然试图找出对象初始化的基本规则。
您可能会发现this有趣。
新Foo和新 美孚()之间的区别是,前者将 未初始化,而后者将是当富 是POD类型 缺省初始化(为零)。所以,不使用带有括号,成员“一” 可以包含垃圾,但与 括号“a”将永远被初始化 为0
恐怕你错了。当你说:
int n = int();
然后n(和所有其他POD类型)将零初始化。
此外,还要确保你是在你对初始化和分配之间的差别心里很清楚 - 这是在C语言很重要++:
int n = int(); // initialisation
n = 0; // assignment
否 表单时,该变量只在第一种情况下没有初始化。
对于具有用户定义构造函数的类的成员,情况很简单:总是调用构造函数。
内置类型(和“普通旧数据”结构)可能会保持未初始化状态,如第一个示例中所示。尽管它们没有用户提供的构造函数,但使用构造语法(您的其他两个示例)将它们初始化为零。
这个稍微棘手的规则的原因是为了避免不必要的开销;例如,如果你定义:
struct S
{
int array[1024*1024];
};
仅为分配值,你需要他们,你不想让编译器零粉饰4MB内存,只要你构建一个意图。
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
;
我觉得这个说法很难相信。 class Bar {int n; }是一个POD,因为它是隐式定义的,因此它是/平凡/(来自ISO的正式术语)。然而,它是存在的,并且'新酒吧'和'新酒吧()`称它。在任何情况下Bar :: Bar()都不会初始化Bar :: n – MSalters 2009-06-11 10:04:31
“class B {int n;};” *不是* POD,因为它包含一个私有的非静态成员'n'。但是,如果它被定义为“class B {public:int n;};”那么它将是一个POD,所以当您执行“新Bar()”时,'n'将被初始化。 – 2009-06-11 10:59:04
新手是否有可能完全理解这个主题?似乎有这么多的规则和例外:-( – codymanix 2009-06-11 11:22:23