#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のトップページをご覧ください。