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

Posted

技术标签:

【中文标题】C++ 类中的两个不同变量初始化。有啥不同?【英文标题】:Two different variable initializations in a C++ Class. What's the difference?C++ 类中的两个不同变量初始化。有什么不同? 【发布时间】:2020-03-03 10:33:55 【问题描述】:

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

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

第一个:

aClass::aClass(int aVariable) : privateVariable(aVariable) 

第二个:

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

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

谢谢!

【问题讨论】:

第一个做初始化,第二个做赋值(默认初始化后)。 对于引用或 const 成员,只有第一个是可能的。无论如何,只要没有具体要求第二个版本,我都会推荐它。 @Jarod42 在实践中不是一回事吗?如果其他方法打印“privateVariable”的值,在这两种情况下它不等于参数“aVariable”吗? 【参考方案1】:

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

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

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

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

【讨论】:

"如果 privateVariable 不是默认可构造的,则不起作用。"我可以为此举个例子吗(只需要几个字就够了)吗?我不确定“不可默认构造”的含义,因为我不明白什么时候会出现这种情况。 引用是原始示例。 aClass 也是一个示例(除非您还提供 aClass::aClass() )。 明白。谢谢!【参考方案2】:

尽管这已经有一个公认的答案,让我们稍微详细说明一下。

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

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/

【讨论】:

现在我需要将两者都签名为“已接受的答案”,因为它们都很有用。 ? 谢谢:)

以上是关于C++ 类中的两个不同变量初始化。有啥不同?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的静态变量

在java中变量和属性有啥不同

在“java”中变量和属性有啥不同?

请问C++语言里静态变量和全局变量有啥区别?谢谢

java 类中函数前加和不加static有啥不同

成员变量和局部变量区别