2011-10-29 8 views
1

all。私はC++を初めて使っています。オブジェクトの割り当てについて質問したいと思います。C++オブジェクトをプライベートに割り当てるとき

たとえば 私は同じクラスa1とa2から2つのオブジェクトを持っています。 クラス内にプライベートメンバーがいる場合

なぜこのような割り当てを行うことができますか? a1 = a2;

私の質問は、私が唯一のメンバ関数は、プライベートメンバデータの内容を変更する権限 を持っていますが、手順を 私はちょうど通過、プライベートメンバデータを容易に変更されたと思った、ということです。 なぜですか?

+0

ありがとう! 私はそれを得たと思う – CLH

答えて

2

あなたはそうです。しかし、あなたが概説した場合、a1のメンバ関数を呼び出します。公的なメンバー関数YourClass& operator=(const <YourClass>& rightHandSide)が具体的です。自分で提供しなかった場合、コンパイラは自動的にそのようなメソッドを生成します。コンパイラの生成を防ぎ、厳密に上記の方法で割り当てをしたくない場合は、をプライベート宣言して、まったく定義しないでください。これにより、コンパイラはa1 = a2に文句を付けることになります。

もう1つ混乱する可能性があるのは、方法がrhsのプライベートデータをどのくらい正確に読み取ることができるかという疑問です。これはLuchian Grigoreが概説した通りです。クラスにはプライベートであり、インスタンスにはプライベートではありません。

5

operator=メンバー関数を使用して割り当てを行うことができます。メンバー関数は、定義上プライベートメンバーにアクセスできます。

デフォルトを指定すると、「デフォルトのバージョンではメンバーワイズコピーが実行されます。各メンバーは、独自のコピー代入演算子によってコピーされます(プログラマ宣言またはコンパイラ生成) " thisを参照してください。

2

発信者は、「オブジェクト」以外の何がコピーされているのかわかりません。呼び出し元は、プライベートメンバーがまったく存在しないことを知りません。 代入演算子はpublicであり、動作はすべてのパブリックメソッドで同じです。パブリックメソッドはもちろんプライベートメンバーを変更できます。

2

プライベートメンバーおよびメソッドは、特定のインスタンスではなくクラスに制限されています。異なるクラスインスタンス内のプライベートメンバーには、同じクラスのオブジェクトからアクセスできます。この動作は仕様によるもので、標準によって保証されています。

代入演算子(A& A::operator = (const A& other))を上書きしていない場合は、ほとんどの場合、浅いコピーを実行している可能性があります。

0

a1 = a2;この場合、a1およびa2の両方に存在するa1オブジェクト(すなわち、ターゲットオブジェクト)の暗黙的な「コピー代入演算子」が呼び出される。 「コピー代入演算子」の仕事は、すべてのデータメンバーをあるオブジェクトから別のオブジェクトにコピーすることです。

関連する問題