2017-10-09 2 views
-2

私はC++プログラミングの新人です。両方のメンバーが同じ価値観を示す部分にはまっています。なぜか説明できますか?あらかじめThx。コピーコンストラクタは実際に何をしますか?

#include<iostream> 

using namespace std; 

class test{ 
    public: 
    int all,sum; 

    test(int x){ 
     all=x; 
    } 

    test(test &a){ 
     all=a.all+5; 
     cout<<all; 
    } 

    void one(test m){ 
     cout<<endl; 
     cout<<endl<<m.all; 
     cout<<endl<<all; 
    } 
}; 

int main(){ 
    test a(10),b(a); 
    b.one(a); 
    return 0; 
} 
+1

。また、複数の変数ではなく、1行に1つの宣言/初期化のみを提案します。 – CoryKramer

+0

コピーコンストラクタは、あなたがやりたいことを何でもすることができます。通常、メンバは別のオブジェクトから* this *オブジェクトにコピーされます。 –

+2

A *デバッガ*を使用すると、StackOverflowに投稿して回答を待つよりも速くこの質問に答えることができます。 –

答えて

1

問題がabの両方が同じ値を持っていることではありません。彼らはしないから。デバッガでは、a.allが10で、b.allが15であることがわかりました。

本当の問題は、あなたが値によってone()aを渡しているということなので、コンパイラはa一時コピーを作成する必要があります。つまり、コンパイラはコピーコンストラクタを使用してmをコピーします(one()が終了するとmが破棄されます)。そのため、m.allの値は常に5ずつインクリメントされ、元の値にはなりません。あなたの例では

、ちょうどb.allm.allの値は、それらがコピー構築の両方に同じaオブジェクトからあるという理由だけで、同じ値になるようにが起こります。代わりにone()b.one(b);)にbを渡して試してみて、あなたはm.allは、あなたの代わりに参照によってそのmパラメータを取るためにone()を変更する必要があなたの問題を解決するために20の代わりに15

のものであろうことがわかります。

void one(const test &m) { 
    cout<<endl; 
    cout<<endl<<m.all; 
    cout<<endl<<all; 
} 

こうして、一時的なコピーは必要ありません。 aone()に渡すと、期待どおりにa.allがそのまま出力されます。 bone()に渡すと、期待どおりにb.allがそのまま出力されます。等々。


また、サイドノートで、あなたのコピーコンストラクタは、同様にのconst参照によりそのaパラメータを服用する必要があります:あなたは本当に適切にあなたのコードをフォーマットする方法を学ぶ必要が

test(const test &a){ 
    all=a.all+5; 
    cout<<all; 
} 
+0

Thx!しかし、あなたはまた、値がどのように等しくなるか私に説明することができますか?私は本当にこの部分を理解できませんでした。 b.one(a)が呼び出されるとどうなりますか? –

+0

@AshwinKumar:私の答えを更新しました –

関連する問題