teppy大量のデータメンバを持つ大規模なクラスLargeObjectがあるとします。大量のデータメンバ};そして、LargeObjectをメンバに持つクラスがあるとします。大量のデータメンバを持つクラスをメンバに持つ};このObjectHolderクラスを扱うユーザーが、LargeObjectにアクセスしようとした時にちょっとしたミスを犯します。受けなくちゃいけないのに、&を書き忘れてしまいました。このコードを書いたプログラマはそのミスに気づいていません。コンパイルエラーになることもなく、実行時に粛々とLargeObjectのコピーが発生するだけです。アクセサ経由で受けたobjに操作しても結果はholder内に反映されません。これはObjectHolderを書いたプログラマも本意ではありません。想定してない操作ができてしまうことが問題です。クラスを書くということは、どういう操作を期待しているか、想定しているかをクラス自身に語らせる必要があります。不測のデータコピーを抑止する一つの方法としてアクセサの戻り値は参照ではなく基本的にポインタで返すというプラクティスがあります。別の方法としてLargeObject自身をコピー禁止にするというのも手です。クラスのコピーコンストラクタとコピー代入演算子をアクセス不能にすることでインスタンスのコピーを禁止することができます。member_[2048];};C++11より前の時代は=delete;による書き方が無いので、該当の関数をprivateにすることでコピー禁止を実現していました。これで、先ほどの&忘れる事件もコンパイルエラーになり、不測のコピーが発生してもすぐに気づくことができます。あるクラスのコピーコンストラクタ、代入演算子をアクセス不可にするとコピーは禁止できますが、第三者がそのコードを読んだ時に意図が分かりづらいという問題があります。このコピー禁止の仕掛け部分を専用のクラスに分離した上で継承することで各クラスにコピー禁止属性を持たせるというアプローチが一般的です。member_[2048];};これでLargeObjectがコピー禁止になり、さらにクラスの定義を見ただけでコピー禁止だということが分かりやすくなりました。C++でも説明されいます。コンパイラが生成するコピーコンストラクタとコピー代入演算子は、その基底クラスに対応する関数(同じ関数)を呼び出そうとします。対応する関数を規定クラスでprivateにしておけば、その呼び出しはエラーになるわけです。第3版またboost::noncopyableにも同様の実装があります。Idioms/コピー禁止ミックスインでも紹介されています。これらの情報も併せて参照すると良いでしょう。