[英]Copy constructor called everytime a default constructor is called?
碰到这个问题时,我正在研究有关构造函数初始化列表的一些问题。
考虑一下:
class Student {
public:
Student() {
id = 0;
}
Student(int i) {
id = i;
}
private:
int id;
};
现在,检查一下:
当您进入构造函数的主体时,所有字段都已被构造; 如果它们具有默认构造函数,则这些构造函数已被调用。 现在,如果您在构造函数的主体中为其分配值,则您正在调用复制构造函数。 这是低效的,因为最终调用了两个构造函数而不是一个。
那么,这是否意味着当我调用无参数构造函数时,也会同时调用复制构造函数?
请解释。 这真是令人困惑。
特别是第一行的含义:
当您进入构造函数的主体时,所有字段都已经被构造
这意味着int id
在到达id = 0
之前已经被初始化。 由于未指定任何显式初始化程序,因此已默认初始化。 另外,因为它是一个int
,所以初始化规则告诉使用它将具有一些不确定的值。
在实践中,对于int
或任何初始化起来非常便宜的类型,这没什么大不了的。
如果我们使用类而不是使用int
成员,则可以更清楚地了解幕后的实际情况:
#include <iostream>
class Verbose {
public:
Verbose() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
Verbose(int) {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
Verbose(Verbose const &) {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
Verbose & operator=(Verbose const &) {
std::cout << __PRETTY_FUNCTION__ << "\n";
return *this;
}
~Verbose() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
};
class Object {
public:
Verbose v;
Object() {
v = Verbose(3);
}
};
int main() {
Object o;
}
此代码将输出:
Verbose::Verbose()
Verbose::Verbose(int)
Verbose &Verbose::operator=(const Verbose &)
Verbose::~Verbose()
Verbose::~Verbose()
请注意,我们:
v
。 Verbose(3)
Object o
超出范围时,我们然后销毁成员变量。 请注意,我们基本上构造了两次Verbose v
! 我们首先使用默认的构造函数,然后基本上使用operator=
调用对其进行重建。 如果使用初始化列表 ,则可以将其减少为对Verbose(int)
一次调用。
他们的意思是
Student() {
id = 0;
}
效率不如
Student() : id(0) {}
在此特定示例中,由于成员只是一个int
,因此将在单个步骤中初始化id
。
相反,如果Student
具有更多复杂的成员(例如Backpack
和Books
,则后一种方法将有所作为。 如果这些类不是POD,则第一个方法将花费两步来初始化成员,而第二个方法将只花费一个步来初始化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.