C++ Class 中的两个不同的变量初始化。有什么不同?

Two different variable initializations in a C++ Class. What's the difference?

我是一个自学成才的初学者,所以我想我会问一些非常基础的问题,但我忽略了。

假设您在 C++ 中有一个名为 aClass 的 class,其中一个构造函数需要一个参数。这两种方法有什么区别?

第一名:

aClass::aClass(int aVariable) : privateVariable(aVariable) {}

第二名:

aClass::aClass(int aVariable) {
    privateVariable = aVariable;
}

如果它们基本上是同一件事,那么两者中哪一个更常见?或者,出于什么原因人们倾向于使用而不是另一个?

谢谢!

第一个做初始化,应该优先考虑。

第二个做赋值(默认初始化后)。 它主要相当于:

aClass::aClass(int aVariable) : privateVariable() {
    privateVariable = aVariable;
}

如果 privateVariable 不是默认可构造的,那么将不起作用。

虽然这已经有一个公认的答案,但让我们详细说明一下。

让我们举个例子,其中一个有效,另一个无效:

class Foo
{
    public:
        Foo(int value);
    private:
        Foo();
        int content;
};

class Bar
{
    public:
        Bar(int value);
    private:
        Foo foo;
};

构造函数的有效实现是

Bar::Bar(int value) : foo(value) {}

如果你喜欢

Bar::Bar(int value) 
{
    foo = Foo(value);
}

会发生什么,这不会编译。作为演示,我创建了 http://cpp.sh/2vfwqk,看看如果您尝试 运行 会发生什么。然后取消注释较低的实现并取消注释上面的实现。
问题是,Foo() 必须先调用才能开始处理正文,因为 foo 需要初始化。
初始化列表直接执行此操作。

(如果我没有将空构造函数设为私有,而是将其完全省略,该示例也可以工作,但这样更容易理解。)

另一件事是,如果 Foo() 将是 public,它将构造两个对象。如果那些是轻量级的,没问题,但如果空构造函数需要大量内存或时间,则不可取。

对于作为参考的成员,您非常需要这个。
也许值得一读:https://www.geeksforgeeks.org/when-do-we-use-initializer-list-in-c/