2016-12-12 3 views
1

次のコードについては混乱していますが、なぜTest tcalcに、return tTest(Test &t)にコールされるのかわかりません。誰かが私にそれを明確にするのを助けることができますか?どうもありがとう!パラメータとしての自己参照をC++でどのように渡すのでしょうか?

#include <iostream> 
using namespace std; 

class Test { 
    public: 
    Test(int na, int nb) { 
     a = na; 
     b = nb; 
    } 

    Test(Test &t) { 
     a = t.a + 1; 
     b = t.b + 1; 
    } 

    int getValue() { 
     return a + b; 
    } 

    Test calc(Test t) { 
     return t; 
    } 
    private: 
    int a; 
    int b; 
}; 

int main() { 
    Test t(1, 1); 
    cout << t.calc(t).getValue() << endl; 
} 

答えて

5
ラインにおいて

cout << t.calc(t).getValue() << endl; 
     ^^^^^^^^^ 
      here 

ます(宣言Test Test::calc(Test t)で再び見て)値ではなく、参照によってtを渡すので、引数tがコピーされています。返される(ローカル)オブジェクト戻り位置先に関数のローカルスタックからコピーされる - コピーは、コピーコンストラクタ

Test(Test &t) 

return t;が、同じ考えの呼び出しを意味します。

ところで、あなたはおそらく、一般的には、ソースを変更するとは思わないだろうとしてコピーctorのためconst

Test(const Test &t) 

が欲しいです。技術的にはに引数を非constとしてとるコピーctorを持っています。 Can a copy-constructor take a non-const parameter?

+0

あなたの素早い返答をありがとうと、私はあなたが 'calc(t)'について何を言ったかを理解することができます。しかし、なぜ 'return t'もコピーコンストラクタをトリガしたのですか?私は 'calc'の' Test t'と同じアドレスでなければならないと思いますか? – CYB

+1

@CYB私はちょうどそれを今説明した、編集を参照してください。 – vsoftco

+0

ああ!関数は 'Test'オブジェクトを返さなければならないので、再びコピーされます!これは正しいです ?ところで、ありがとう! – CYB

関連する問題