2017-10-06 125 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在该类的范围内。