2011-01-31 11 views
0

例えば、privateデータメンバのクラスがある場合、そのクラスの外部にアクセスできない、またはそのクラスのobjectsの外部にアクセスできないと言うことができますか?C++ - プライベートデータのメンバ

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

+0

@LaszloG:これらのリンクは、 [gotw](http://www.gotw.ca/gotw/076.htm)/ [this](http://bloglitb.blogspot.com/2010_07_01_archive)に興味があるかもしれません。 html) –

+0

?申し訳ありませんが、私は何とか '@'関数と間違えてしまいました... –

+0

@Eclipse:あなたの答えを元に戻してください、私はupvoteします(私に思い出させるコメントを残す)。ダンはメンバーアクセスオペレータ( '.'、' - ''、 '。*'、 ' - > *')を聞いたことがないばかげたダウンボット者です。 –

答えて

2

privateは、クラスのメンバ関数(および任意のネストされた型)が任意のクラスのインスタンスで指定されたデータメンバにアクセスできることを意味します。

+1

downvoteの理由は? –

3

技術的に言えば、上記のいずれもありません。 "このクラスへのプライベートアクセスを持つエンティティのみがこれらの変数にアクセスできます。"

これは そのタイプ のオブジェクト、その型のメンバ関数、そのタイプの 友人、そのタイプの友人のメンバ関数が含まれています...実は

、技術的に言えば、オブジェクトがアクセスすることができません彼らには行動がないので何でも。

0

クラスのコード(派生クラスを含む)の外部ではアクセスできません。宣言されたエンティティは例外です。friend。クラスのコード(クラスメンバ関数)がクラス(個々のオブジェクトではない)にバインドされるので、アクセシビリティはクラスレベルで評価されます。それがプライベートの場合

class Foo 
{ 
private: 
    int secret; 
    Foo * other; 

public: 
    explicit Foo(Foo* other_) : other(other_), secret(42) {} 
    Foo() : other(0), secret(0) {} 

    int Peek(void) { return secret; } 
    int neighborPeek(void) 
    { 
     if (other) 
      return other->secret; // this is OK, we're still inside the class 
     else 
      return -1; 
} 

int main() 
{ 
    Foo aFoo, bFoo(&aFoo); 
    std::cout << bFoo.neighborPeek(); // will dump aFoo's secret. 

    return 0; 
} 
+0

私は間違っていないとreinterpret_castingとポインタを使ってアクセスできませんか?もちろん、それはひどい考えです。 – Marlon

+0

reinterpret_castには理由の長い名前が付いています。本当に別の方法がないとき以外は使用しないでください。また、プリプロセッサで悪意のあるアクセストリックを行うこともできますし、より緩和されたアクセスルールで同等のデータ構造を模擬することもできます。C/C++ではほとんどすべてが_possible_ですが、より高いレベルで何かが間違っていた! (そしてもちろん、カプセル化を破っただけなので、アップストリームの実装変更に対するコードの安定性のためにすべての賭けは外されています)。 – andybuckley

1

、その後、(強調追加):

そのそれ が宣言されているクラスのメンバー や友人でのみ使用することができます。

- Stroustupの "The C++ Programming Language"とドラフト標準の1つです。

C++では、データ自体には他のメカニズムによって常にアクセスできます。目標は、たとえ悪意のあるアクセスがまだ実行可能であっても、偶発的なアクセスを妨げることです。

関連する問題