2011-08-29 18 views
4

可能性の重複:
Why should the copy constructor accept its parameter by reference in C++?コピーコンストラクタ関連の質問(ネイティブC++)

私はコピーコンストラクタは、「無限の数を避けるために、パラメータとして参照を持たなければならないことを知っています呼び出しの 'それ自体に。私の質問は - なぜそれが起こるのか、その背後にある論理は何ですか?

CExample(const CExample& temp) 
{ 
    length = temp.length; 
} 
+2

あなたの質問がありますか?正確なものを求めてもっと努力してください。 –

+0

無限ループが起こるのはなぜですか? –

+0

あなたは何を話していますか? – Nawaz

答えて

6

それはコンストラクタを含むすべての機能は、バイ値の引数で仕事だ[、C'torは値で渡されたコピーにあなたの引数を取るC'torが行われていた最初のもの、引数をコピーして]。これを行うためには、C'torを元のものからローカル変数に、再び呼び出さなければならないでしょう...そして、繰り返し...無限ループを引き起こすでしょう。

+0

ああ今、私はそれを持って、ありがとう! –

+0

"クラスXの非テンプレートコンストラクタは、その最初のパラメータがX&、const X&、 volatile X&またはconst volatile X&、[...]"であればコピーコンストラクタです。 .. – PlasmaHH

+0

@PlasmaHH:私の答えの最初の単語は「仮定」です。 OPは、彼が「それの背後にある論理は何であるか」と尋ねると、「もし何か」と尋ねると、 – amit

2

コピーコンストラクタは、C++でいくつか呼び出されます。あなたはこの場合、

void f(CExample obj) 
{ 
    // ... 
} 

、のような機能を持っているときに

CExample x; 
f(x); 

CExample::CExamplexからobjを構築するために呼び出されるコールを行うときにそれらの一つがあります。

次のシグネチャ

void f(CExample &obj) 
{ 
    // ... 
} 

を(objは今、参照によって渡されることに注意してください)持っている場合は、コピーコンストラクタCExample::CExample呼び出されません。あなたのコンストラクタは(最初の例の機能fのように)値でコピーするオブジェクトを受け入れ

場合、コンパイラは、コピーを作成するために、コピーコンストラクタ最初を呼び出す必要があります(と同じように関数f、もう一度)、しかし、... oops、我々は、コピーコンストラクタを呼び出すために、コピーコンストラクタを呼び出す必要があります。これは悪く聞こえるよね?

1

See here

値パラメータはコピーを作成することが必要となるので、「これは、コピーコンストラクタを呼び出します。そのパラメータのコピーを作成しますコピーコンストラクタを呼び出すことになる、その参照..です"

または、コンストラクタのvalueパラメータは、パラメータの値をコピーするためにコンストラクタを呼び出す必要があります。この新しいコンストラクタは同じことを行う必要があり、無限再帰につながります。