【发布时间】:2012-02-28 23:54:08
【问题描述】:
考虑一个类层次结构,其中A 是基类,B 派生自A。
如果B中没有定义拷贝构造函数,编译器会合成一个。当被调用时,这个复制构造函数将调用基类复制构造函数(即使是合成的,如果用户没有提供的话)。
#include <iostream>
class A {
int a;
public:
A() {
std::cout << "A::Default constructor" << std::endl;
}
A(const A& rhs) {
std::cout << "A::Copy constructor" << std::endl;
}
};
class B : public A {
int b;
public:
B() {
std::cout << "B::Default constructor" << std::endl;
}
};
int main(int argc, const char *argv[])
{
std::cout << "Creating B" << std::endl;
B b1;
std::cout << "Creating B by copy" << std::endl;
B b2(b1);
return 0;
}
输出:
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Copy constructor
如果用户在B 中定义了自己的复制构造函数,则在调用时,此复制构造函数将调用基类默认构造函数,除非显式存在对基类复制构造函数的调用(例如在初始化列表中)。
#include <iostream>
class A {
int a;
public:
A() {
std::cout << "A::Default constructor" << std::endl;
}
A(const A& rhs) {
std::cout << "A::Copy constructor" << std::endl;
}
};
class B : public A {
int b;
public:
B() {
std::cout << "B::Default constructor" << std::endl;
}
B(const B& rhs) {
std::cout << "B::Copy constructor" << std::endl;
}
};
int main(int argc, const char *argv[])
{
std::cout << "Creating B" << std::endl;
B b1;
std::cout << "Creating B by copy" << std::endl;
B b2(b1);
return 0;
}
输出:
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Default constructor
B::Copy constructor
我的问题是,为什么用户定义的复制构造函数不调用基类复制构造函数作为默认行为?
【问题讨论】:
-
如果默认情况下是这样,您将如何指定您不希望发生这种情况的情况?
-
@PlasmaHH
ParentClass()在初始化列表中。我相信这仍然会非常不一致和令人困惑。 -
@MarkB:确实,我希望他在考虑时也能得出同样的结论……
-
因为标准委员会有一个选择并且在我看来做出了最合乎逻辑的选择(如果您没有指定如何调用基类构造函数,那么您必须是指默认的那个(没有参数),因为您没有指定任何参数)。
-
还要注意同样的逻辑适用于所有成员以及基类。
标签: c++ language-design copy-constructor