C++ での private と protected クラスメンバの使用
-
C++ でクラスの利用者がアクセスできないクラスメンバを示すために
private
プロパティを使用する -
派生クラスやフレンドクラスのメンバ関数がアクセス可能なクラスメンバを示すために
protected
プロパティを使用する
この記事では、C++ で private
と protected
のクラスメンバを正しく使用する方法について、複数の方法を示します。
C++ でクラスの利用者がアクセスできないクラスメンバを示すために private
プロパティを使用する
private
キーワードは、カプセル化機能を実装するための C++ 言語の基本的な部分の 1つです。カプセル化の主な目的は、クラスの利用者のために強制的なインタフェースを作成し、特定のメンバのみへの直接アクセスを制限することです。クラス・インターフェースを定義することは、クラスのユーザーがデータ・メンバーを直接変更したりアクセスしたりする必要はなく、与えられたオブジェクトに対してこれらの操作を行うように設計されたパブリック・メソッドを呼び出す必要があることを意味します。
アクセス制御には一般的に 3つのキーワードがあります: public
、private
、protected
です。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