类初始化列表

时间:2011-01-07 11:54:26

标签: c++ initialization

关于c ++编码风格的简单问题,

例如,如果我们不做任何其他操作,将使用初始化列表中的默认构造函数调用类的所有成员变量。将调用B默认构造函数,并将value设置为0,int();

class A
{
   A();
private:
   B b;
   int value;
}

但是我的问题是,即使是默认构造函数也会被调用它是一个习惯,总是自己做,或者它只是为代码添加额外的行

  

A :: A():b(),value(){}

4 个答案:

答案 0 :(得分:4)

你正在触及C ++的一个棘手角落。

对象中POD值的初始化是粘性的,取决于一些事情 即使我不确定我是否能够正确地遵守所有规则,但我相信@Steve Jessop曾经写过一篇关于SO的文章(虽然我现在可以找到它)。

但是有些例子:

  

此类将始终初始化为b == false和value = 0.

class A
{
   A() : b(), value() {}
   B b;
   int value;
};

如果没有显式默认构造函数,则更复杂:
这里编译器将为您生成一个默认构造函数。但编译器生成默认构造函数的方式取决于具体情况。 编译器生成的默认构造函数可以执行两种不同形式的初始化,并且使用它取决于上下文:

  1. 零初始化(所有POD成员都被清零)
  2. 值初始化(所有POD成员未定义)
  3. 示例:

    class B
    {
       B b;
       int value;
    };
    
    // Variables of static storage duration (notably globals)
    // Will be zero initialized and thus b == false and value = 0
    
    B   global; // Initialized
    
    int main()
    {
        // Object of automatic storage duration or dynamic storage duration
        // These will depend on how they are declared.
    
        // Value Initialization (POD re-mains undefined)
        B    bo1;           // b/value undefined
        B*   bp1 = new B;   // b.balue undefined
    
        // Zero Initialization
        B    bo2 = B();     // b = false, value = 0
        B*   bp2 = new B(); // b = false, value = 0
    
        // Note: The most obvious syntax for zero initializing a local object
        //        does not work as it is actually interpreted as a forward
        //        declaration of a function;
        B   bo3(); 
    }
    

答案 1 :(得分:2)

保留默认构造函数是个好主意。编译器生成的构造函数比编写自己的版本更加可靠和可维护,除了其他任何东西之外,编写编译器可以为您编写的代码完全浪费时间。如果您不需要任何构造逻辑,那么不要编写构造函数。

但是,除非你这样做,否则int不会被初始化,这是必须编写构造函数的一个很糟糕的理由。

答案 2 :(得分:1)

默认情况下,int变量没有用值初始化 - 你必须自己做。

因此,当您未在构造函数中将成员变量“value”设置为某个值时,它将保持未初始化状态。

答案 3 :(得分:1)

默认构造函数仅针对具有默认构造函数的类类型调用,而不是针对基元。