C++ でクラスのプライベートメンバーにアクセスする

胡金庫 2023年10月12日
  1. クラスメンバーを C++ で private アクセス指定子を使用してカプセル化する
  2. C++ で public 関数を使用してクラスのプライベートメンバーを取得する
C++ でクラスのプライベートメンバーにアクセスする

この記事では、C++ でクラスのプライベートメンバーにアクセスする方法のいくつかの方法について説明します。

クラスメンバーを C++ で private アクセス指定子を使用してカプセル化する

アクセス指定子は、カプセル化と呼ばれるオブジェクト指向プログラミングのコア機能を実装するために使用されます。その結果、クラスの特定のデータメンバーへの直接アクセスを制限し、基本的にクラスデータを操作するためのインターフェイスを構築します。C++ は、publicprivateprotected のようないくつかのアクセス指定子キーワードを提供します。これらは通常、対応するアクセシビリティで修飾する必要があるクラスのメンバーの前にあります。

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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Class