HOWTO · C++
C++ ゲッターとセッター
C++ でのカプセル化とデータの非表示、およびゲッターとセッターの使用に関するプログラミングチュートリアル。
この簡単なガイドでは、最初に、オブジェクト指向プログラミングでのカプセル化とデータ隠蔽の概念を簡単に紹介します。次に、C++ でのゲッターとセッターの使用に移ります。
カプセル化とは
カプセル化は、関連するすべてのものを結合するという概念です。C++ のクラスは、関連するすべてのデータを 1つのカプセルにまとめることができます。
たとえば、いくつかの属性とプロパティを持つオブジェクトまたはエンティティ Rectangle があるとします。そのすべての属性とプロパティを 1つのクラスに組み合わせることができます。
したがって、カプセル化は、関連するデータとメソッドを 1つのクラスに結合することが知られています。データ隠蔽の概念と混同されることがよくあります。
データの非表示は、クラスに属する属性がクラス外のすべての人にアクセス可能であってはならないという概念です。これは、データのセキュリティに違反しているためです。
クラスのデータメンバーを非公開にすると、クラス外のユーザーがアクセスできなくなるため、データのセキュリティを確保できます。
これにより、クラス外からデータメンバーの値を設定したり、値を取得したりすることはできませんが、メンバーへのアクセスに使用できるメソッドを作成できます。これらのメソッドにより、不要なデータがデータメンバーに配置されないようになります。。
データメンバーの値を設定または取得するためのこのようなメソッドは、getters および setters と呼ばれます。
C++ のゲッターとセッター
これは、クラスのデータメンバーをプライベートにして、無効なデータをクラスのデータメンバーに割り当てられないようにするための優れたプログラミング手法です。これにより、データメンバーに格納する前に、データメンバーに入力されたデータをチェックできます。
たとえば、Shape というクラスがあります。どの形状の長さ属性も負になることはありません。
したがって、長さの値を設定する際に、指定された値がゼロより大きいかどうかを確認します。
同様に、Employee クラスがある場合、それは salary の属性を持ちます。この属性には、負の値も非常に大きな正の値もありません。
したがって、salary の値を設定する前にバリデーターを配置する必要があります。以下の例を見てみましょう。
class Emp {
private:
int empSalary;
public:
void setEmpSalary(int sal) {
if (sal > 0 and sal < 10000000) empSalary = sal;
}
int getEmpSalary() { return empSalary; }
};
このコードスニペットには、データの非表示を実現するためのプライベートなデータメンバーsalary があります。さらに、このデータメンバーにゲッターとセッターを用意し、必要に応じて値を設定および取得できるようにしました。
セッター機能では、salary データメンバーに入力された無効な値を制御するためのチェックも作成しました。これは、必要なデータメンバーのセッターとゲッターを作成する方法です。
上記の例の完全なコードを見てみましょう。
#include <iostream>
#include <string>
using namespace std;
class Emp {
private:
int empSalary;
string empName;
public:
Emp(string n, int s) {
setEmpName(n);
setEmpSalary(s);
}
void setEmpName(string s) { empName = s; }
string getEmpName() { return empName; }
void setEmpSalary(int sal) {
if (sal > 0 and sal < 10000000) empSalary = sal;
}
int getEmpSalary() { return empSalary; }
};
int main() {
Emp e("John", 50000);
cout << "Name: " << e.getEmpName() << endl;
cout << "Salary: " << e.getEmpSalary() << endl;
}
出力:
Name: John
Salary: 50000
まとめ
クラスインターフェイスに getter メソッドと setter メソッドを追加することが重要です。クラスのメンバー変数はプライベートとして宣言されるため、クラスのユーザーは値を取得して設定する方法が必要になります。
setter メソッドには、メンバー変数が正当な値に設定されていることを確認するためのデータ検証コードを含めることができるため、getter および setter 関数はこのアクセスを安全に有効にします。
もちろん、クラスのすべてのメンバー変数に対して、getter、setter、またはその両方のメソッドを提供したくない場合があります。読み取り専用メンバー変数は、取得はできるが変更はできない変数です。
そのような例の 1つは、静的データメンバーの場合もあれば、読み取り専用データメンバーの場合もあります。このようなメンバーの場合、getter 関数は必要ですが、setter 関数は必要ありません。