C ++构造函数:使用初始化程序vs设置定义中的值

时间:2016-07-20 01:30:54

标签: c++ constructor initialization

因此,阅读我的一本教科书,我遇到了构造函数的初始化程序。我想知道是否存在性能差异,这是C ++通用编码标准的首选方法。

假设:

  • 默认构造函数不接受任何参数(因此不需要验证)
  • 该类有两个私有变量:int a和int b
  • 两个变量都需要设置为0

示例:

//Setting each private variable with assignment statements
SampleClass::SampleClass() 
{
    a = 0;
    b = 0;
}

//Using initializers to set the private variables
SampleClass::SampleClass() : a(0), b(0) 
{
}



我想如果有一个构造函数有参数且参数需要某种验证,最好使用在其中验证的方法。话虽如此,你会混合它们吗?

示例:

SampleClass2::SampleClass2(int fNumber, int sNumber) : a(fNumber)
{
    makeSureNotZero(sNumber);
}



只是为了澄清问题:

  1. 设置变量的两种方法中,哪种方法更好?
  2. C ++中的通用编码标准通常首选一种方法吗?
  3. 你能混合两种方法吗?

2 个答案:

答案 0 :(得分:3)

没有法律禁止混合这两种方法。

PODs的情况下,两种方法之间不会有任何可测量的差异,并且C ++编译器可能会为两种初始化方法生成相同的代码。

另一方面,如果类成员是更复杂的类,而不是像POD那样的int,那么构造函数初始化将产生更好的结果。这只是一个经验法则,实际结果会有所不同,具体取决于每个特定的类别。默认构造一个类的实例,然后调用它的赋值运算符,将比直接构造它更好。

答案 1 :(得分:1)

我的答案取决于编译器。大多数编译器应该足够聪明,以优化这两者,并使它们等效。如果编译器不是一个因素,那么只需查看,并考虑它,我会假设初始化列表。它用它初始化成员变量,而不是必须初始化它然后设置它。它可能只是少量指令,但我会让编译器处理它。