Win98SE vc++6.0
class Hoge
{
private:
int m_pow;
Hoge *m_p;
public:
Hoge()
{
m_p = new Hoge;
m_p->m_pow; // ポイント
}
~Hoge()
{
delete m_p;
}
};
私が理解しているクラスの private のアクセス方法です。
1.メンバ値、メンバ関数は、外部からはアクセス出来ない。
2.自分自身(this)のクラスからは、アクセス出来る。
なぜ、m_pow は private なのに m_p->m_pow は、アクセス出来るの?
よろしくお願いします。
>1.メンバ値、メンバ関数は、外部からはアクセス出来ない。
正しくは、「自クラス」と「friend」以外からはアクセスできなのですね。
m_pは、実行時には自分のインスタンスではありませんが、
自クラスなのでOKです。
既にレスがついていますが、
クラスとインスタンスは分けて考える必要があります。
クラスを使っていると同じクラスなのにメンバー変数の値が
違うとか逆にインスタンスは違うのにとか話が出てきますが、
この辺はクラスとインスタンスの区別がうまく出来ていない
所為だと思います。
この辺は、C++言語を使う上で付いてまわる話なので
良く理解しておく事をお勧めします。
> 2.自分自身(this)のクラスからは、アクセス出来る。
Hoge()は「自分自身のクラス」の関数だからアクセスできていいわけです。
# あれ? このクラスはコンストラクトした時点で新たにインスタンスを作成して、
# その結果、またコンストラクタが呼ばれて、...
# まあ、意味のないコードなんでしょうけど。
どうも三人の方、御返信ありがとうございます。
まず、このクラスはご指摘のように実験クラスとして作成した物ですので
意味のないコードですが、無限生成 ( new ) とは気づきませんでした。
御指摘、ありがとうございます。
最終確認させて頂くと、私は、今まで自クラスは、this-> のような形式で、
自分自身を参照できるのであれば private アクセスはできると思っていましたが、
Hoge 型クラスのメンバ関数内で Hoge 型を参照するのであれば、
void Hoge::Test( Hoge *pHoge ) pHoge->m_pow のように
private もアクセスできると言う考え方で宜しいのでしょうか。?
ちなみに、誤解されたらあれなので派生されたクラスでは、継承元の基底クラスの
private なメンバは、アクセスはできないと言うことは知っております。
アクセス修飾子(private/protected/public)はインスタンスに対してではなく、クラス
に対して適用されます。
privateは自分自身(インスタンス)ではなく、自分の属するクラス内でアクセス可能てこ
とです。
なるほど、私は今まで一方的にインスタンスに対してのアクセスで考えており、
クラス( 設計図 )に対してのアクセスで、当てはめて考えれば理解することが
できました。
どうもありがとう御座いました。