#pragma twice

KAB-studio > プログラミング > #pragma twice > 331 Version 16.04 メンバのスコープ

#pragma twice 331 Version 16.04 メンバのスコープ

前のページへ 表紙・目次へ 次のページへ

 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 ごく一般的なクラス >
「につづく!」
『あのー、この章どのくらい続きます?』
「半年で終わるといいんだけど……」
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。