2017-10-06 67 views
0

頭文件(.H):實例對象如何查看函數的私有成員的對象參數?

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訪問私有成員,是內部消除的朋友。這是因爲Inner在該類的範圍內。