C++ でクラスのプライベートメンバーにアクセスする
この記事では、C++ でクラスのプライベートメンバーにアクセスする方法のいくつかの方法について説明します。
クラスメンバーを C++ で private
アクセス指定子を使用してカプセル化する
アクセス指定子は、カプセル化と呼ばれるオブジェクト指向プログラミングのコア機能を実装するために使用されます。その結果、クラスの特定のデータメンバーへの直接アクセスを制限し、基本的にクラスデータを操作するためのインターフェイスを構築します。C++ は、public
、private
、protected
のようないくつかのアクセス指定子キーワードを提供します。これらは通常、対応するアクセシビリティで修飾する必要があるクラスのメンバーの前にあります。
private
指定子の後に定義されたメンバーは、メンバー関数にのみアクセス可能であり、クラスを使用するコードから直接参照することはできません。クラスは通常、クラスの設計者とクラスのユーザーという 2つの側面を念頭に置いて構築されます。後者は通常、カプセル化の影響を受ける人です。プログラマーが最初のアクセス指定子の前にメンバーを定義する場合、メンバーのアクセス可能性は、class
キーワードが使用されるとデフォルトで private
に設定され、struct
キーワードで public
に設定されます。
次の例では、private
として宣言された 2つの文字列データメンバーを持つ BaseClass
というクラスを実装します。したがって、これらのメンバーの値にアクセスするには、クラスの設計者がそれらを取得する public
関数を含める必要があります。以下のコードから public
キーワードを削除しても、getUsername
および getName
関数を public
メンバーとして使用できることに注意してください。
カプセル化のもう 1つの利点は、ユーザー側の互換性の問題を心配することなく、内部クラス構造を変更できる柔軟性です。したがって、インターフェイス、つまりパブリック関数が変更されない限り、クラスのユーザーはコードを変更する必要はありません。
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
class BaseClass {
public:
BaseClass() = default;
explicit BaseClass(string user, string nm)
: username(std::move(user)), name(std::move(nm)) {}
~BaseClass() = default;
string& getUsername() { return username; };
string& getName() { return name; };
private:
string username;
string name;
};
int main() {
BaseClass base("buddy", "Buddy Bean");
cout << "base -> name: " << base.getName() << endl;
cout << "base -> username: " << base.getUsername() << endl;
exit(EXIT_SUCCESS);
}
出力:
base -> name: Buddy Bean
base -> username: buddy
C++ で public
関数を使用してクラスのプライベートメンバーを取得する
private
メンバーは、クラスインターフェイス関数を使用して変更できます。たとえば、changeUsername
関数はクラスのユーザーから string
引数を受け取り、その値を private
メンバー–username
に格納します。クラスの private
メンバーへのアクセスを許可されている他のクラスや関数を区別する friend
キーワードもあることに注意してください。これらの関数は、上記のクラスの一部ではなく、外部にすることができます。ただし、アクセス指定子を誤って使用すると、コンパイラエラーが発生する可能性があります。
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
class BaseClass {
public:
BaseClass() = default;
explicit BaseClass(string user, string nm)
: username(std::move(user)), name(std::move(nm)) {}
~BaseClass() = default;
void changeUsername(const string& s) { username.assign(s); };
string& getUsername() { return username; };
string& getName() { return name; };
private:
string username;
string name;
};
int main() {
BaseClass base("buddy", "Buddy Bean");
cout << "base -> name: " << base.getName() << endl;
cout << "base -> username: " << base.getUsername() << endl;
base.changeUsername("jolly");
cout << "base -> username: " << base.getUsername() << endl;
exit(EXIT_SUCCESS);
}
出力:
base -> name: Buddy Bean
base -> username: buddy
base -> username: jolly