private指定したメンバ変数へのアクセスはメンバ関数という関数で行います。
まずは、メンバ変数に値を設定する関数を作ってみます。
<sample program cpp048-01>
#include <iostream> class Sample { public: void SetValue(const int value); private: int m_value; }; int main() { Sample sample; sample.SetValue(15); return 0; } void Sample::SetValue(const int value) { m_value = value; } |
メンバ関数の宣言部分を見てみましょう。
class Sample { public: void SetValue(const int value); private: int m_value; }; |
クラスの中にpublicを追加しました。
隠すべき変数はprivateで宣言しておき、他の場所から呼び出すべき関数はpublicで宣言しています。
※個人的にpublicの方が確認する事が多いと思いますので、privateよりも上に書きます。
クラスの中にはプロトタイプ宣言を書いておき、関数本体はmain関数の下に書きました。
void Sample::SetValue(const int value)
{
m_value = value;
}
|
クラスの外で本体を作っているので「所属」が書かれている事を確認しておいてください。
中身としては、引数valueをメンバ変数であるm_valueに代入しているだけです。
このようにメンバ変数に値を代入する関数を「setter関数」と呼ぶ事があります。
次にメンバ変数の中身を取得する関数を追加してみましょう。
<sample program cpp048-02>
#include <iostream> class Sample { public: void SetValue(const int value); int GetValue(); private: int m_value; }; int main() { Sample sample; sample.SetValue(15); std::cout << sample.GetValue() << std::endl; return 0; } void Sample::SetValue(const int value) { m_value = value; } int Sample:: GetValue() { return m_value; } |
<実行結果>
15 続行するには何かキーを押してください・・・
GetValue関数を追加しました。
中身はメンバ変数のm_valueを戻すだけの関数です。
実行すると、セットされていた「15」が表示されます。
このように、メンバ変数を取得する関数を「getter関数」と呼ぶ事があります。
メンバ変数はprivateに隠蔽しておき、publicで宣言されたメンバ関数経由でアクセスする。
これが基本的なクラスの考え方です。
※アクセス頻度などを考えて、メンバ変数をpublicにする事もあります。
さて、このような考え方の利点は何でしょうか。
例えば、setter関数だけを作ってgetter関数を作らなければどうなるでしょう?
メンバ変数に値はセット出来ますが、値を取り出す事は出来なくなります。
逆に、getter関数だけを作ってsetter関数を作らなければ、
メンバ変数の値を取り出す事は出来ますが、値をセットする事は出来なくなります。
つまり、メンバ変数に対するアクセス方法を、クラスを作った人がコントロール出来るようになるのです。
ついでに付け加えておくと、クラスの宣言部分とメンバ関数の本体は、将来的にファイル分割します。
クラスの宣言部分をヘッダファイルに、本体はcppファイルに書くようになります。