[解決済み] なぜコピーコンストラクタでプライベート変数にアクセスできるのですか?
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
.... - クライアントコードにとって未知であるか書き込み専用である可能性のある親/調整/管理オブジェクトへの参照をコピーバックします。
関連
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] パブリック、プライベート、プロテクトの違いは何ですか?
-
[解決済み] Pythonにはクラス内に「プライベート」変数がある?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】Javaで異なるクラスからプライベートフィールドの値を読み取る方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】'std::cout'への未定義の参照