2011-11-03 152 views
0

我學習C++,遇到了一些奇怪的問題,我無法在C++書籍或Web上找到任何信息。下面的代碼只是對轉換構造函數的測試: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); 
} 

但是,如果我從測試類中刪除拷貝構造函數測試(const的測試&)我得到如下所示的錯誤消息。但複製構造函數從來沒有使用過,所以它爲什麼需要?

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傳遞參數能夠編譯功能,不測試的拷貝構造函數。我在cygwin中使用gnu g ++編譯器。

回答

3

因爲:

void testFunction(Test in) 

你路過價值Test對象,調用拷貝構造函數。

+0

添加一行以從拷貝構造函數打印輸出表明它沒有被調用。 – snowape

+2

@snowape這可能是因爲在代碼生成時,拷貝構造函數由於返回值優化而被忽略。然而,RVO並未改變複製構造函數在編譯時必須可用的事實。這是我最好的猜測。 –

+0

對不起,我在回答時並沒有真正注意'main()',我只是看到錯誤在抱怨什麼。我同意邁克爾關於它實際上沒有被調用的原因。 –

0

另一種解釋的問題:
如果從 的Test類中刪除拷貝構造函數Test(const Test&),你必須要使用編譯器生成的拷貝構造函數,它會調用subClass sub的拷貝構造函數。但是您將其定義爲subClass(subClass&),這不符合對話。因此,如果您將其更改爲subClass(const subClass&),則可以立即刪除Test(const Test&)

+0

感謝您的額外信息。現在我看到子類是如何參與的。 – snowape