我正在学习C ++而且遇到了一些奇怪的东西,我在C ++书籍或网络上找不到任何信息。下面的代码只是对转换构造函数的测试:Test(int)。 testFunction获取一个需要Test对象的int,转换构造函数用于创建一个Test对象以发送给该函数。这按预期工作。
#include <iostream>
using namespace std;
class subClass {
public:
subClass(int);
subClass(subClass&);
};
subClass::subClass(int i) {};
subClass::subClass(subClass& i) {};
class Test {
public:
Test(const Test&);
Test(int);
subClass sub;
};
Test::Test(const Test &)
: sub(1) {};
Test::Test(int in)
: sub(1) {};
void testFunction(Test in) {
cout << "testfunction\n";
};
int main () {
testFunction(4);
}
但是,如果我从Test类中删除了复制构造函数Test(const Test&amp;),我会收到如下所示的错误消息。但复制构造函数从未使用过,为什么需要它呢?
example.cpp: In function `int main()':
example.cpp:32: error: no matching function for call to `Test::Test(Test)'
example.cpp:13: note: candidates are: Test::Test(Test&)
example.cpp:24: note: Test::Test(int)
example.cpp:32: error: initializing argument 1 of `void testFunction(Test)' from result of `Test::Test(int)'
其他信息: 我注意到,从子类中删除复制构造函数或通过引用传递参数到testFunction,可以在没有Test的复制构造函数的情况下编译函数。我在cygwin中使用gnu g ++编译器。
答案 0 :(得分:3)
由于:
void testFunction(Test in)
您通过值传递Test
对象,该值调用复制构造函数。
答案 1 :(得分:0)
对该问题的另一种解释:
如果从Test(const Test&)
类中删除复制构造函数Test
,您必须打算使用编译器生成的复制构造函数,它将调用subClass sub
的复制构造函数。但是你把它定义为subClass(subClass&)
,它不符合对流。因此,如果您将其更改为subClass(const subClass&)
,则可以立即删除Test(const Test&)
。