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/
我是一个自学成才的初学者,所以我想我会问一些非常基础的问题,但我忽略了。
假设您在 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/