这两种方法有什么区别?

时间:2016-12-30 19:58:44

标签: c++ class c++11 c++14

class A
{
   int a = 100;
};

class A
{
    int a;
public :
   A()
   {
      a = 100;
   }
};

我知道有两种方法,因为静态变量在类外部初始化,并且无法在类中完成。但是如果我使用构造函数或在声明本身期间初始化变量a(一个普通的int),会有什么不同。

2 个答案:

答案 0 :(得分:5)

根据CPP核心指南:http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rc-in-class-initializer

  

C.48:首选的成员初始值设定项的类初始值设定项   常量初始化器的构造函数

     

原因明确表示   预期在所有构造函数中使用相同的值。避免   重复。避免维护问题。它导致最短和   最有效的代码。

在您的确切示例中,差异并不是很大。但是随着类变得更加复杂,并且您添加了子类和多个构造函数,能够在一个位置定义默认值可以简化代码。

答案 1 :(得分:0)

在以下构造函数中:

class A
{
   int a = 100;
};

int a = 100;default member initializer。在进入构造函数之前,非静态数据成员按类定义中的声明顺序进行初始化。

如果在构造函数中指定了一个值,那么在赋值时,该变量已经初始化(作为POD,在这种情况下它被初始化为一个不确定的值):

   A()
   {
      a = 100;
   }

因此,在这种情况下的区别在于,当在第二个示例中输入构造函数时,a的值是不确定的,而在第一个示例中,它是初始化的。

第三种方法可以使用member initializer list

A() : a{100}
{
}

在这种情况下,成员初始值设定项(如果有)将被忽略,但初始化序列仍将由类中声明的顺序决定。

与第一个示例一样,在启动构造函数之前,该值将初始化为100