1. ホーム
  2. c++

[解決済み] なぜコピーコンストラクタでプライベート変数にアクセスできるのですか?

2023-01-05 01:27:36

質問

プライベート変数にアクセスできるのは、クラス内のget関数だけだと知りました。しかし、それならなぜコピーコンストラクタでアクセスできるのでしょうか?

例を挙げます。

Field::Field(const Field& f)
{
  pFirst = new T[f.capacity()];

  pLast = pFirst + (f.pLast - f.pFirst);
  pEnd  = pFirst + (f.pEnd - f.pFirst);
  std::copy(f.pFirst, f.pLast, pFirst);
}

私の宣言

private:
  T *pFirst,*pLast,*pEnd;

どのように解決するのですか?

IMHO では、既存の回答はこの「なぜ」の説明が不十分で、どのような動作が有効かを繰り返し説明することに重点を置いています。

ここでの包括的なコンセプトは、クラスを設計し、書き、維持するプログラマは、望ましい OO カプセル化を理解し、その実装を調整する権限を期待されている、ということです。 ですから、もしあなたが class X と書いている場合、あなたは個々の X x オブジェクトにアクセスできるコードがどのように使用できるかだけでなく、どのように使用できるかも符号化しています。

  • 派生クラスが(オプションで純粋な仮想関数や保護されたアクセスを通して)それと相互作用することができ、そして
  • 明確な X オブジェクト 協力する を使用して、設計の後条件と不変条件を尊重しながら、意図した動作を提供します。

比較、加算/乗算/除算、コピー構築、クローン、代入などを行っている場合、他のオブジェクトのプライベートまたは保護されたデータにアクセスする必要があるか、より単純で高速、または一般的に優れた関数の実装を可能にすることがよくあります。

具体的には、これらの操作は、以下のようなことを行うために特権的なアクセスを利用したいと思うかもしれません。

  • (コピー コンストラクタ) 初期化リストの中の "rhs"(右辺)オブジェクトのプライベート メンバーを使用し、メンバー変数がデフォルトで構築されるのではなく、コピーで構築され(合法であれば)、その後あまりにも割り当てられます(再び、合法である場合)。
  • リソースの共有 - ファイル ハンドル、共有メモリ セグメント。 shared_ptr を使用してデータを参照するなど。
  • を所有する、など。 auto_ptr<> 所有権を建設中のオブジェクトに移動します。
  • 新しいオブジェクトを最適に使用できる状態で構築するために必要なプライベートな "cache"、キャリブレーション、またはステート メンバーを、ゼロから再生成することなく、コピーします。
  • コピーされるオブジェクトに保持されている、パブリック API からはアクセスできないが、後の例外オブジェクトやロギングで使用される可能性がある診断/トレース情報 (たとえば、コピーされていない元のインスタンスが構築された時間/状況についての何か) にアクセスする。
  • いくつかのデータのより効率的なコピーを実行します: 例えば、オブジェクトは例えば unordered_map メンバを持つが、一般には begin()end() イテレータ - に直接アクセスできます。 size() に直接アクセスすることができます。 reserve の容量でより高速にコピーできるようになります。 at()insert() で、それ以外は throw ....
  • クライアントコードにとって未知であるか書き込み専用である可能性のある親/調整/管理オブジェクトへの参照をコピーバックします。