C++ での private と protected クラスメンバの使用

胡金庫 2023年10月12日
  1. C++ でクラスの利用者がアクセスできないクラスメンバを示すために private プロパティを使用する
  2. 派生クラスやフレンドクラスのメンバ関数がアクセス可能なクラスメンバを示すために protected プロパティを使用する
C++ での private と protected クラスメンバの使用

この記事では、C++ で privateprotected のクラスメンバを正しく使用する方法について、複数の方法を示します。

C++ でクラスの利用者がアクセスできないクラスメンバを示すために private プロパティを使用する

private キーワードは、カプセル化機能を実装するための C++ 言語の基本的な部分の 1つです。カプセル化の主な目的は、クラスの利用者のために強制的なインタフェースを作成し、特定のメンバのみへの直接アクセスを制限することです。クラス・インターフェースを定義することは、クラスのユーザーがデータ・メンバーを直接変更したりアクセスしたりする必要はなく、与えられたオブジェクトに対してこれらの操作を行うように設計されたパブリック・メソッドを呼び出す必要があることを意味します。

アクセス制御には一般的に 3つのキーワードがあります: publicprivateprotected です。public プロパティの後に定義されたメンバは、クラスのすべてのユーザがアクセス可能です。一方、private 指定子はクラスのメンバ関数のみがアクセスできるメンバを定義します。次の例では、main 関数のコードは CustomString 型の変数を宣言できますが、そのメンバ str にアクセスするには public プロパティで定義された getString メソッドを呼び出す必要があります。

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class CustomString {
 public:
  CustomString() = default;
  explicit CustomString(const string& s) : str(s) { num = s.size(); }

  virtual ~CustomString() = default;

  string& getString() { return str; };

 private:
  string str;

 protected:
  int num{};
};

int main() {
  CustomString str1("Hello There 1");

  cout << "str1: " << str1.getString() << endl;

  exit(EXIT_SUCCESS);
}

出力:

str1: Hello There 1

派生クラスやフレンドクラスのメンバ関数がアクセス可能なクラスメンバを示すために protected プロパティを使用する

アクセス制御に利用できるもう一つのキーワードは protected プロパティで、後に宣言されたメンバをクラスメンバ関数、派生クラスメンバ、さらにはフレンドクラスからもアクセスできるようにします。後者の 2つは基底クラスオブジェクトから直接 protected メンバにアクセスすることはできず、むしろ派生クラスオブジェクトからアクセスすることができないことに注意してください。次の例は CustomString から派生した CustomSentence クラスを示しているが、後者のクラスの num メンバは protected メンバです。したがって、CustomString オブジェクトからはアクセスできません。つまり、getSize 関数は CustomString クラスの一部ではないので、CustomSentence オブジェクトのみがこのメソッドを呼び出して num の値を取得することができます。

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class CustomString {
 public:
  CustomString() = default;
  explicit CustomString(const string& s) : str(s) { num = s.size(); }

  virtual ~CustomString() = default;

  string& getString() { return str; };

 private:
  string str;

 protected:
  int num{};
};

class CustomSentence : public CustomString {
 public:
  CustomSentence() = default;
  explicit CustomSentence(const string& s) : sent(s) { num = s.size(); }
  ~CustomSentence() override = default;

  int getSize() const { return num; };
  string& getSentence() { return sent; };

 private:
  string sent;
};

int main() {
  CustomString str1("Hello There 1");
  CustomSentence sent1("Hello There 2");

  cout << "str1: " << str1.getString() << endl;
  cout << "sent1: " << sent1.getSentence() << endl;
  cout << "size: " << sent1.getSize() << endl;

  exit(EXIT_SUCCESS);
}

出力:

str1: Hello There 1
sent1: Hello There 2
size: 13
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C++ Class