0

可能重复:
初始化列表的好处

过去几天我一直在学习 C++,我看到了两种我无法确定两者优缺点的格式。希望有人可以在这里帮助我。

第一个变量被初始化为var(value)

class Foo
{
    public:
        Foo(): itsVar1(2), itsVar2(345){}

    private:
        int itsVar1;
        int itsVar2;      
};

第二个是用赋值运算符初始化的var = value

class Foo
{
    public:
        Foo()
        {
            itsVar1 = 2;
            itsVar2 = 345;
        }

    private:
        int itsVar1;
        int itsVar2;
}; 

一个比另一个有优势吗?是个人喜好吗?
第一种样式(?)对我来说看起来更令人困惑。看起来您正在调用一个方法并传入该值。看起来很含蓄;而第二种方法非常明确,作为来自 Python 的人“显式优于隐式”,我更喜欢第二种方法。我错过了什么?

4

3 回答 3

3

前一种表示法将在构造函数调用之前初始化成员。在初始化所说的内容之前,不会在构造函数内部执行任何操作。如果存在继承,则在当前构造函数调用之前,将在此处调用父类的构造函数。

同样,我认为构造函数的显式和隐式声明在 c++ 中与 python 不同。当你的构造函数只有一个参数不是类本身的类型时(构造函数不是复制构造函数),它可以用于类型转换。当您将显式放在构造函数的名称之前时,您告诉编译器未经我的明确许可不会转换任何内容。

于 2012-06-06T23:24:37.133 回答
2

尽可能使用初始化列表(第一种样式)。这样做的主要原因是:

  1. 使用初始化列表会使保证异常安全变得更加困难。为您的类成员变量使用 RAII 类以及初始化列表,可以轻松保证您的构造函数在面对成员变量的构造函数抛出的异常时不会泄漏资源。

  2. 赋值并不比初始化列表更好。如果成员变量类型是非平凡的,那么赋值实际上会执行得更差。使用初始化器,成员变量将在适当的位置构造,并且不会发生默认构造。使用赋值可以让所有成员变量首先成为默认构造。

  3. 初始化列表是将值分配给引用和 const 成员变量的唯一方法。

于 2012-06-06T23:44:07.913 回答
0

当构造函数声明为

 Foo(): itsVar1(2), itsVar2(345){}

这意味着变量“itsVar1”“和itsVar2”在创建其局部变量成员(即itsVar 和itsVar2)时被初始化。这种初始化方法称为初始化列表。在用户定义类型的情况下,这样的初始化将调用用户定义类型的复制构造函数。更多信息请访问:http ://en.wikipedia.org/wiki/Initialization_(programming)#Initializer_list

当构造函数定义为

  Foo()
    {
        itsVar1 = 2;
        itsVar2 = 345;
    }

构造函数创建内存并且不初始化成员变量 itsVar1 和 itsVar2。一旦创建成员并且控制流入构造函数的主体,它们就会被分配一个值。

使用初始化列表的优点是成员变量不会被调用两次(一次在创建期间,另一次在赋值期间)。成员变量的创建和初始化同时发生。如果您的初始化程序列表中有许多变量,那么在调用构造函数时您会比其他方法获得轻微的性能优势。

于 2012-06-06T23:32:57.720 回答