实例对象如何看到函数的私有成员是一个对象参数?

时间:2017-10-06 17:38:24

标签: c++ object reference private-members

头文件(.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()中调用该对象的成员?

在任何其他情况下;我无法打电话给对象的私人成员。

我想明白为什么会这样。

感谢。 (:

2 个答案:

答案 0 :(得分:1)

privateprotected的定义不会限制您从同一类中访问中的那些属性或函数。

这是一个Passenger函数,因此它可以完全访问所有内容。游戏中有两个对象实例并不限制您。 private并不意味着其他实例无法触及它,只能触及其他类。

答案 1 :(得分: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);
}

如您所见,Inner访问Outer的私人成员,而不是朋友。这只是因为Inner在类的范围内。