Version 16.04
メンバのスコープ
「今回は、これまで触れなかった、メンバのスコープについて説明します」
『スコープ?』
「 public とか private とかのこと」
// Data.h
// CDataクラス。
class CData
{
public: // ←これ。
// メンバ変数。
int m_iValue;
// メンバ関数。
void Output();
};
『あ、それのこと。でも前に教わらなかったっけ』
「 Version 11.16 ( No.216 ) で説明したけど、あの時はちょっと早足だっ
たから、おさらいも兼ねて」
『はーい』
「まず、クラスのメンバ変数やメンバ関数は〈どこからアクセスできるか〉
ということを選ぶことができます。この〈どこからアクセスできるか〉を、
【スコープ】と言います」
『スコープって Version 5.20 ( No.085 ) でやったね』
「そう、あのスコープと同じ、メンバ変数やメンバ関数にどこからなら
アクセスできるか、っていうのがスコープ。スコープには3種類あります」
・public
どこからでもアクセスできる。
・private
自クラスのメンバ関数からのみアクセスできる。
・protected
自クラスと派生クラスからアクセスできる。
「この public とかのことを【アクセス修飾子】と言います。アクセス
修飾子には、この3つがある、ということです」
『最後の protected の説明が解らないんですけど』
「うん、これは今のところは忘れて。もうちょっとしたらちゃんと説明する
から。まずは、 public と private についてちゃんと理解するのが大事」
『はいはい』
「この public とか private といったアクセス修飾子は、以下のような形で
設定します」
class クラス
{
アクセス修飾子:
// ここにメンバ変数やメンバ関数等。
}
「つまり、クラスの中で public: や private: とすることで指定できます」
『よーするにコロン付けるわけね』
「そういうこと。アクセス修飾子は、書いた所から下に向けて何行も効力を
持ちます。効力は、クラスの外に出るか、他のアクセス修飾子が出てくるま
で続きます」
『つまり、』
// CDataクラス。
class CData
{
public: // ↓ここ以降 public 。
// メンバ変数。
int m_iValue; // ←これは public 。
// メンバ関数。
void Output(); // ←これも public 。
};
『ってことだよね』
「そういうこと! 他のアクセス修飾子が出てくると変わるから」
// CDataクラス。
class CData
{
public: // ↓ここ以降 public 。
// メンバ変数。
int m_iValue; // ←これは public 。
private: // ↓ここ以降 private 。
// メンバ関数。
void Output(); // ←これは private 。
};
「となります。あと、アクセス修飾子が出てくるまでの部分は private に
なります」
// CDataクラス。
class CData
{
// ↓ここ以降 private 。
// メンバ変数。
int m_iValue; // ←これは private 。
public: // ↓ここ以降 public 。
// メンバ関数。
void Output(); // ←これは public 。
};
『デフォルトは private だってこと?』
「そういうこと。それはなぜか、も含めて、これらの機能について説明しま
す。まず、 CData クラスはこんな感じに」
// Data.h
// CDataクラス。
class CData
{
public:
// publicメンバ変数。
int m_iPublic;
private:
// private
int m_iPrivate;
public:
// テスト用メンバ関数。
void Access();
};
「この m_iPublic と m_iPrivate の両方のメンバ変数がテスト対象です」
『どこからアクセスできるか、っていうのね』
「まず、 public も private も、同じクラスのメンバ関数からならアクセス
できます」
// Data.cpp
#include <Windows.h>
#include <stdio.h>
#include "Data.h"
// CData クラスの Access() メンバ関数の定義。
void CData::Access()
{
// public メンバ変数にアクセスします。
m_iPublic = 100;
// private メンバ変数にアクセスします。
m_iPrivate = 100;
}
『お、普通にアクセスできる』
「対して、 CData クラスの外からの場合、 public ならアクセスできるけど
private の場合にはアクセスできません」
// Main.cpp
#include <Windows.h>
#include <stdio.h>
#include "Data.h"
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
// CDataクラスの変数を宣言します。
CData cData;
// public メンバ変数にアクセスします。
cData.m_iPublic = 100;
// private メンバ変数にアクセスします。
cData.m_iPrivate = 100;
// コンパイルエラー:
// error C2248: 'm_iPrivate' : private メンバ
// (クラス 'CData' で宣言されている)にアクセスできません。
return 0;
}
『お、 private メンバ変数にアクセスできないね』
「このように、通常の関数や、 CData クラス以外のクラスのメンバ関数か
ら、 CData クラスの private メンバにはアクセスできない、というわけで
す」
『つまり、 public なら外からアクセスできるし、 private は外からは
アクセスできない、ってことだよね』
「うーん、ちょっと違うかな。実は、 private メンバには、こういう形で
アクセスすることもできるんです」
// CData クラスの Access() メンバ関数の定義。
void CData::Access()
{
CData cData;
// private メンバ変数にアクセスします。
cData.m_iPrivate = 100;
}
『あれ、 cData 変数経由で private メンバ変数にアクセスしてる……』
「これができるのは、 CData クラスのメンバ関数の中だから」
『! そういうことなの!? じゃあ、 private メンバ変数だから
cData.m_iPrivate ってできない、っていうわけじゃないんだ』
「そういうこと。あくまでどの関数でしているか、が重要ってことだね」
/*
Preview Next Story!
*/
『む、なんか全部教わってないかも』
「 protected とかその他の点について触れてないね」
『ってことは次回に続く?』
「続きます」
『というわけで次回』
< Version 16.05 ごく一般的なクラス >
「につづく!」
『あのー、この章どのくらい続きます?』
「半年で終わるといいんだけど……」