使用转换构造函数隐式地需要复制构造函数

时间:2011-11-03 02:03:11

标签: c++ constructor copy-constructor

我正在学习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 ++编译器。

2 个答案:

答案 0 :(得分:3)

由于:

void testFunction(Test in)

您通过值传递Test对象,该值调用复制构造函数。

答案 1 :(得分:0)

对该问题的另一种解释:
如果从Test(const Test&)类中删除复制构造函数Test ,您必须打算使用编译器生成的复制构造函数,它将调用subClass sub的复制构造函数。但是你把它定义为subClass(subClass&),它不符合对流。因此,如果您将其更改为subClass(const subClass&),则可以立即删除Test(const Test&)