2017-02-05 14 views
0
using namespace std; 

class C { 

public: 

    char *s; 

    C(const char *s0) { 
     s = new char[strlen(s0)+1]; 
     strcpy(s,s0); 
    } 

    C(C &c) { 
     s = new char[strlen(c.s)+1]; 
     strcpy(s,c.s); 
    } 
}; 

int main(int argc, char* argv[]) { 

    C c("cde"); 
    C c0(c); 

    cout << c.s << endl; 
    cout << c0.s << endl; 

    c.s[1] = 'X'; 

    cout << c.s << endl; 
    cout << c0.s << endl; 
} 

私はポインタと参照で何が起こっているか分かりません。誰も、なぜ2番目のc0.sの出力がまだ "cde"であるのか説明できますか?ありがとうございました。C++のコピーコンストラクタは誰でも説明できますか?

+1

あなたは 'c0.s'を何と予想していますか?なぜ? –

+1

*コピー*にしていますので? – juanchopanza

+0

'c0'はコピーですので、' c'を変更しても影響はありません。 – Galik

答えて

2

コピーコンストラクタは

s = new char[strlen(c.s)+1]; 

新しいバッファを作成するので、両方のオブジェクトが別々のバッファが含まれている

strcpy(s,c.s); 

新しいバッファに元のバッファの内容をコピーしています。 1つのオブジェクトを変更すると、そのオブジェクトのバッファが変更されるため、他のオブジェクトへの変更は一切出現しません。

コピーコンストラクタは、デフォルトのコピー動作を複製するこの

C(C &c) { 
    s = c.s; 
} 

のようなものを見た場合、両方のオブジェクトは同じバッファーと、一方が他方に現れるの変更を参照することになります。

バッファを削除し、バッファに割り当てられたストレージのリークを防ぐためにデストラクタが実装されていた場合、これは致命的です。 1つのオブジェクトを破壊すると、両方のバッファが解放され、遅かれ早かれ無効バッファがアクセスまたは削除されます。

続きを読むWhat is The Rule of Three?

関連する問題