2017-10-06 7 views
0

ヘッダーファイル(.H):インスタンスオブジェクトは、関数のprivateメンバーをオブジェクトパラメータとどのように見ますか?

bool canTravelWith(const Passenger&) const; 

実装ファイル(.CPP):

bool Passenger::canTravelWith(const Passenger& x) const 
    { 
     bool canTravel = false; 

     //if both passengers have the same destination on the same date... 
     if (strcmp(x.m_destination,this->m_destination) == 0 && x.m_year == this->m_year && x.m_month == this->m_month && x.m_day == this->m_day) 
     { 
      canTravel = true; 
     } 

     return canTravel; 
    } 

やあみんな、

作品上記のコードではなく場合は、私が知りたいと思ったことはありますパラメータのオブジェクトのメンバーは非公開でアクセスされます。私のcanTravelWith()の中でそのオブジェクトのメンバーをどのように呼び出すことができますか?

その他の場合。私はオブジェクトのプライベートメンバーを呼び出すことはできません。

なぜそれがわかりますか?

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

+1

私は混乱しています、あなたはあなたのクラスのプライベートメンバーにアクセスしていますか?その問題は何ですか? –

+1

「Passenger」クラスのプライベートメンバーに「Passengerクラス」のメンバーにアクセスできるのはなぜですか?何? [良い本](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を読むことを検討してください。 –

答えて

1

privateprotectedの定義同じクラス内からプロパティや関数のそれらの種類にアクセスするからあなたを制限しない

これは、すべてのものへの完全なアクセス権を持っているので、それPassenger機能ですprivateは、他のインスタンスが他のクラスにしか手で触れないことを意味しません。

0

これは、プライベートメンバーがインスタンスではなくクラスのプライベートメンバーであるためです。

これはthisというプライベートメンバーにアクセスできる理由を尋ねるのと同じことです。thisは、関数にパラメータとして渡された単純に非表示のポインタなので、同じことです。また

bool Passenger::canTravelWith(const Passenger& x) const 
{ 
    Passenger const* ptr = this; 

    // ptr is this, of course I can access private stuff! 
    (void) ptr->m_destination; 

    if (rand() % 10) { 
     ptr = &x; 
    } 

    // Is the compiler will really try to guess if ptr 
    // still points to this? privateness is a compile time 
    // property of the class, not runtime. 
    (void) ptr->m_destination; 
} 

、プライベートメンバにアクセスすることは全くのインスタンスを必要としません:

struct Passenger { 
private: 
    static constexpr int value() { return 42; } 

public: 
    static constexpr int v = value(); 
}; 

を見てわかるように、私たちが作成している、の視点でこれを入れて、このコードを検討する

彼の値は私的な静的関数から来た静的変数です。しかし、私たちはクラスのスコープにいるので、私たちはそれにアクセスすることができます。

struct Outer { 
private: 
    int value = 42; 

public: 
    struct Inner { 
     int getPrivate(Outer& o) { return o.value; } 
    }; 
}; 

int main() { 
    Outer o; 
    Outer::Inner i; 

    int v = i.getPrivate(o); 
} 

あなたが見ることができるように、OuterInnerアクセスプライベートメンバー、友人であることwhithout:ここで別の例です。これは、単にInnerがクラスのスコープの内側にあるためです。

関連する問題