繁体   English   中英

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

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

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

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

第一:

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

第二:

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

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

谢谢!

第一个进行初始化,应该是首选。

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

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

因此,如果privateVariable不是默认可构造的,则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()是公共的,它将构造两个对象。 如果这些是轻量级的,没问题,但如果空构造函数需要大量内存或时间,则不可取。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM