2016-06-18 216 views
4
#include <iostream> 
using namespace std; 

class Foo 
{ 
public: 
    Foo() 
    { 
     cout << 0; 
    } 
    Foo(Foo &f) 
    { 
     cout << 1; 
    } 
}; 

void someFunction(Foo f) {}; 

int main() 
{ 
    Foo f1;   //displays 0 (as expected) 
    Foo f2(f1);  //displays 1 (as expected) 
    someFunction(f1); //displays 1 (why?) 
    someFunction(f2); //displays 1 (why?) 

    return 0; 
} 

我不明白爲什麼函數'someFunction'調用第二個構造函數。我以爲它只是調用第一個構造函數,不帶參數,並顯示爲0。奇怪的構造函數的行爲

也許我缺少明顯的東西...

+0

'someFunction'取它的參數副本。 'Foo(Foo&f)'可以用作複製構造函數。 'Foo(Foo const&f)'會是一個更好的複製構造函數。 –

回答

8

第二個構造函數是拷貝構造函數,當你傳遞一個參數到一個函數的值是複製,它調用複製構造函數。

第一個構造函數(默認值構造函數)僅在從頭開始創建對象時調用,並且沒有任何參數。

1

它永遠不會調用默認構造函數,因爲您只是複製foo對象。它將使用拷貝構造函數,並且如果沒有可用的拷貝構造函數,它將使用與之相似的第二個。

2

因爲當你調用someFunction,編譯器調用拷貝構造函數對象f1f2複製到f

爲了避免這種情況,只聲明函數與基準參數爲對象,像這樣:

int someFunction(Foo &f) {} 

然後調用它照例:

someFunction(f1);