C++データカプセル化:コードを守る仕組みと実装例
すべてのC++プログラムは以下の2つの基本要素で構成されています:
プログラム文(コード) : プログラムのアクションを実行する部分で、関数と呼ばれます。
プログラムデータ : プログラムの情報であり、プログラム関数によって影響を受けます。
カプセル化は、データとそれを操作する関数を結合し、両方を外部からの干渉と誤用から守るオブジェクト指向プログラミングの概念です。データカプセル化は、重要なOOP概念である データ隠蔽 をもたらしました。
データカプセル化 は、データとそれを使用する関数をバンドルするメカニズムであり、データ抽象化 はインターフェースのみを公開し、実装詳細をユーザーから隠蔽するメカニズムです。
C++は、クラス と呼ばれるユーザー定義型の作成を通じて、カプセル化とデータ隠蔽の特性をサポートしています。クラスには private、protected、public メンバを含めることができます。デフォルトでは、クラス内で定義されたすべての項目は private です。例:
class Box {
public:
double getVolume(void) {
return length * breadth * height;
}
private:
double length; // 箱の長さ
double breadth; // 箱の幅
double height; // 箱の高さ
};
変数 length、breadth、height は private です。これは、それらが Box クラスの他のメンバからのみアクセスでき、プログラムの他のどの部分からもアクセスできないことを意味します。これがカプセル化が達成される1つの方法です。
クラスの一部を public にする(つまり、プログラムの他の部分からアクセス可能にする)には、public キーワードの後に宣言する必要があります。public 指定子の後に定義されたすべての変数や関数は、プログラム内の他のすべての関数からアクセス可能になります。
あるクラスを別のクラスのフレンドにすると、実装詳細が露見し、カプセル化が低下します。理想は、各クラスの詳細を可能な限り他のすべてのクラスから隠蔽しておくことです。
データカプセル化の例
public と private メンバを持つクラスを実装するC++プログラムはすべて、データカプセル化とデータ抽象化の例です。以下の例を考えてみましょう:
Live Demo#include <iostream>
using namespace std;
class Adder {
public:
// コンストラクタ
Adder(int i = 0) {
total = i;
}
// 外部世界へのインターフェース
void addNum(int number) {
total += number;
}
// 外部世界へのインターフェース
int getTotal() {
return total;
};
private:
// 外部世界から隠蔽されたデータ
int total;
};
int main() {
Adder a;
a.addNum(10);
a.addNum(20);
a.addNum(30);
cout << "Total " << a.getTotal() << endl;
return 0;
}
上記コードをコンパイルして実行すると、以下の結果が得られます:
Total 60
上記クラスは数値を加算し、合計を返します。パブリックメンバ addNum と getTotal は外部世界へのインターフェースであり、ユーザーはクラスを使用するためにこれらを知る必要があります。プライベートメンバ total は外部世界から隠蔽されていますが、クラスが正しく動作するために必要です。
設計戦略
私たちの多くは、本当に公開する必要がない限り、クラスメンバをデフォルトで private にすることを学んできました。それが良い カプセル化 です。
これはデータメンバに最も頻繁に適用されますが、仮想関数を含むすべてのメンバに等しく適用されます。
C言語
- C++データ型完全ガイド:基本型、修飾子、ベストプラクティス
- C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
- C++クラスとオブジェクト完全ガイド:オブジェクト指向プログラミングの実践
- C++クラステンプレート完全ガイド:実践的なジェネリックプログラミング
- C++ char型をマスター:宣言、ASCII、変換テクニック
- C++ストレージクラス完全解説:スコープ、ライフタイム、使い方
- C++データ構造:配列、構造体、ポインタで効率的なプログラムを構築
- C++ポリモーフィズム完全理解:仮想関数と純粋仮想関数
- Javaカプセル化マスター:データ隠蔽の実践ガイド
- Javaカプセル化完全解説: データ隠蔽・ゲッター/セッター・アクセス制御の実践
- Javaデータ構造: 従来クラス(Vector/Stack/Hashtable等)とコレクションフレームワーク概要