2016-09-09 25 views
3

これはなぜ機能しますか?クラスは自動的に自分自身の友人ですか?

#include <stdio.h> 

class ClassA 
{ 
public: 
    ClassA(int id) : my_id(id) { }; 

    ClassA * makeNewA(int id) 
    { 
     ClassA *a = new ClassA(id); 
     printf("ClassA made with id %d\n", a->getId()); 
     return a; 
    }; 

private: 
    int getId() { 
     return my_id; 
    }; 

private: 
    int my_id; 
}; 

int main() 
{ 
    ClassA a(1); 
    ClassA *b = a.makeNewA(2); 
    return 0; 
} 

それは良いアイデアかどうかに関係なく、なぜ機能するのですか? public関数ClassA::makeNewA(int)は新しいClassAをインスタンス化し、新しいオブジェクトを使用してプライベート関数getId()を呼び出します。クラスは自動的に自分自身の友人ですか?

おかげ

+0

クラスは常に自分自身の友人です。 – Shravan40

+0

これは、C++のカプセル化がオブジェクトレベルではなく、クラスレベルであることを考える良い方法かもしれません。 –

+0

@NirFriedman:厳密にはそうでないことを除いて - 同じメンバを継承したオブジェクトからでも、別のオブジェクトの 'protected'メンバにアクセスすることはできません。 – MSalters

答えて

5

はい、クラスのpublicメソッドは、そのメソッドが別のインスタンスに作用している場合でも、独自のprivateメンバーにアクセスできるように意図的なものです。

私は、クラスが自動的に自分自身の「友人」だと言えるでしょう。

2

静的であるかどうかにかかわらず、すべてのクラスメソッドは自動的に クラスの「フレンド」です。 Friendは、外部関数とクラスがクラスに にアクセスできるようにするために使用されます。クラスは常に独自の "友人"です。

1

基本的には、はい、クラスは自身の友人ですが、より良い説明は、次のようになります。クラス単位ではなく、オブジェクトごとにC++のアクセス制御作品で

。 (thereからコピーされた)、これは、アクセス制御も上で動作します(あなたが友人を持たないで)例Javaのために、他の言語にも適用されること

クラスごと基礎。

関連する問題