カプセル化は、オブジェクト指向設計の原則であり、オブジェクトの内部構造を隠蔽し、必要な公開インターフェースのみを提供することを意味します。
問題の歴史: オブジェクト指向プログラミングが登場して以来、主要な課題の1つは、オブジェクトの内部状態を外部からの不正な変更から保護し、ロジックに対して厳密な制御を確保することでした。
問題: カプセル化がなければ、すべてのデータとメソッドが外部のコードにアクセス可能になり、オブジェクトの状態に対する制御を失い、把握しにくいバグが発生します。
解決策:
C++では、3つのアクセス指定子 private, protected, public が使用されます。private はクラスの外部からメンバーへのアクセスを禁止し、protected は継承者のみがアクセスでき、public はメンバーをインターフェースの一部にします。
コード例:
class Stack { private: int *data; int top; public: Stack(); void push(int val); int pop(); };
主な特徴:
privateメンバーはクラスの外から変更できないのは本当ですか?
いいえ。friend関数、friendクラス、または不安全な手法(ポインタのキャストや未定義の動作を介してなど)を使用することができます。
継承時の指定子の適用順序はどうなりますか(private, protected, public)?
継承が private として宣言された場合、基底クラスのすべてのpublicおよびprotectedメンバーは派生クラスのprivateメンバーになります。
protectedとprivateの継承はどのように異なりますか?
protected継承では、基底クラスのすべてのpublicおよびprotectedメンバーが派生クラスのprotectedメンバーになります。private継承では、すべてがprivateになります。
クラスのすべてのメンバーがpublicとして宣言されているため、外部のコードが構造を変更し、オブジェクトの不変条件を破る可能性があります。
長所:
短所:
必要なpublicメソッドのみが使用され、他のデータは閉じられており(private)、状態が保護されています。
長所:
短所: