2017-11-19 19 views
1

継承クラスは。(ドット)演算子を使用せずにメンバ変数にアクセスできます。オブジェクト名のドット演算子を使用せずに、フレンドクラスのメンバ変数にもアクセスできますか?そうでない場合、なぜですか?フレンド関数は、オブジェクトを作成せずにメンバ変数にアクセスできます

void show(); 

class Test{ 
int a; 
friend void show(); 
} 

void show(){ 
cout<<a; //why this is not possible 
} 

int main(){ 
show(); 
} 
+0

クラスは単なる構造体なので、オブジェクトを初期化するまでメモリには存在しません。 – PeMaCN

+0

派生したクラスメンバ関数は暗黙の 'this'を持っています。 「ドット」または「矢印」はまだ表示されていますが、見えません。友人機能はメンバーではありません。 – StoryTeller

+0

お二人のおかげで、あなたは私の考えを洗練させました。 –

答えて

0

このようなことはできません。継承されたクラスの内部であっても、メンバ関数を持っている場合、コンパイラは暗黙的に暗黙のうちに暗黙のうちに暗黙的にthis引数を持っていました。 友人機能は、クラスの一部ではないため、その機能にアクセスすることはできません。

また、論理的には、クラスのオブジェクトがないと、メンバーを含むメモリがないためアクセスできません。

+0

ありがとうございました。 –

0

クラスの作成オブジェクトなしでメンバー変数を使用する場合は、 ウェイ1:静的変数

void show(); 

class Test { 
    static int a; 
    friend void show(); 
}; 
int Test::a; 
void show() { 

    cout << Test::a; 
} 

int main() { 
    show(); 
} 

ウェイ2:ショー関数の引数に送っクラスTest

void show(); 

class Test { 
    int a; 
    friend void show(Test* test); 
}; 

void show(Test* test) { 
    cout << test->a; 
} 

int main() { 
    show(new Test); 
} 

のオブジェクトへの参照を取得あなたは見つけることができます:

友人の宣言はで表示されますクラス本体を生成し、フレンド宣言が現れるクラスのプライベートおよびプロテクトされたメンバーへの関数または別のクラスアクセスを許可する。

関連する問題