2016-06-18 11 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は」第二のコンストラクタを呼び出して、なぜ私は理解していません。私は2番目のコンストラクタはコピーコンストラクタです奇妙なコンストラクタ行動

+0

'someFunction'がかかる

はちょうどそうのように、のFooオブジェクトへの参照パラメータを持つ関数を宣言し、それを避けるために、パラメータのコピー。 'Foo(Foo&f)'はコピーコンストラクタとして使用できます。 'Foo(Foo const&f)'はより良いコピーコンストラクタになります。 –

答えて

8

...それだけでパラメータなしで、最初のコンストラクタを呼び出しますし、0が表示されます。

は、たぶん私は何かを明らかに行方不明です思った、とあなたは、引数を渡すとき値による関数にはがコピーされます。がコピーコンストラクタを呼び出します。

最初のコンストラクタ(デフォルトのコンストラクタ)は、オブジェクトをゼロから作成し、引数を指定しない場合にのみ呼び出されます。

1

fooオブジェクトをコピーするだけなので、デフォルトのコンストラクタを呼び出すことはありません。コピーコンストラクタを使用し、使用可能なコピーコンストラクタがない場合は、それに似た2番目のコンストラクタを使用しています。

2

あなたはsomeFunctionを呼び出すときに、コンパイラはfにオブジェクトf1またはf2をコピーするためのコピーコンストラクタを呼び出しているので。そして、いつものようにそれを呼び出す

int someFunction(Foo &f) {} 

を::

someFunction(f1);