【发布时间】:2015-02-16 02:56:10
【问题描述】:
当我碰到这个时,我正在处理一些关于构造函数初始化列表的问题。
考虑一下:
class Student {
public:
Student() {
id = 0;
}
Student(int i) {
id = i;
}
private:
int id;
};
现在,看看这个:
当你进入构造函数的主体时,所有的字段都已经构造好了;如果他们有默认构造函数,那些已经被调用了。现在,如果你在构造函数的主体中为它们赋值,你就是在调用复制构造函数。这是低效的,因为最终调用了两个构造函数而不是一个。
来源:What does a colon following a C++ constructor name do?
那么,是不是说当我调用无参数构造函数的时候,拷贝构造函数也被调用了呢?
请解释一下。这真是令人困惑。
特别是第一行的意思:
当你进入构造函数的主体时,所有的字段都已经构造好了
【问题讨论】:
-
“那么,是不是说我在调用无参构造函数的时候,拷贝构造函数也被调用了?” 不是,引用状态在哪里呢?
-
这不是一个很好的例子,因为
int是一个 POD,因此不是“默认构造的”。 -
请解释那里的意图。什么时候调用两个构造函数而不是一个。我真的很困惑。
-
它们指的是成员的复制构造函数(如果它们是类类型而不是
int)。但这实际上是一个错误,因为调用的是赋值运算符而不是复制构造函数。 -
主要问题是您引用的答案不太正确。首先,将“所有字段”替换为“所有成员变量”。其次,“如果你在构造函数的主体中为它们赋值,你就是在调用复制构造函数”是不正确的。您实际上是在调用默认构造函数之后调用赋值运算符。没有在同一个对象上调用 2 个构造函数的情况。除非一个构造函数显式转发给另一个构造函数,否则这是没有意义的。
标签: c++