【问题标题】:C++ Constructors: Using an initializer vs setting the values in the definitionC++ 构造函数:使用初始化器与在定义中设置值
【发布时间】:2016-07-20 10:02:05
【问题描述】:

阅读我的一本教科书后,我发现了构造函数的初始化程序。我想知道是否存在任何性能差异,以及哪种方法是 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. 可以混合使用这两种方法吗?

【问题讨论】:

  • 如果你投了反对票,请告诉我你为什么投反对票。我觉得这是一个不是基于意见的问题,因为我正在寻找规则和性能。
  • 如果我没记错的话,主要区别是初始化发生的时间。当你使用初始化列表时,类成员将根据类声明中的顺序进行初始化,然后执行 constrictor。在第二种情况下,一切都将在构造方法中初始化。

标签: c++ constructor initialization


【解决方案1】:

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

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

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

【讨论】:

  • 对于通用的C++编码标准,首选哪个?
  • C++ 编码标准的迷人之处在于,每个人都有自己的编码标准,这优于其他所有标准。
  • @Sam:但我的真的更胜一筹。
  • @kingcobra1986 在我生命中的某个时刻,我几乎从未使用过初始化列表,然后我遇到了可以使用初始化列表解决的问题,从那时起,我更喜欢列表而不是构造函数中的赋值。我的建议只是熟悉它们,当您了解它们时,它们真的很好用。
  • 默认构造一个类的实例,然后调用它的赋值运算符,会比直接构造它产生更好的结果,这并非完全不可信。非常糟糕的实施类恕我直言。在每种情况下,成员初始化列表都应该一样快或更快。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-06-30
    • 2014-03-21
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多