变量初始化和构造函数

时间:2009-06-11 08:44:41

标签: c++ variables constructor initialization

我目前正在学习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在每种情况下仍然未初始化。

编辑:

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

4 个答案:

答案 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;