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++ 类中的两个不同变量初始化。有啥不同?的主要内容,如果未能解决你的问题,请参考以下文章