【问题标题】:How do instance objects see the private members of function's an object parameter?实例对象如何看到函数的对象参数的私有成员?
【发布时间】:2018-03-18 13:56:15
【问题描述】:

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

在任何其他情况下;我将无法调用对象的私有成员。

我想知道为什么会这样。

谢谢。 (:

【问题讨论】:

  • 我很困惑,您正在访问您班级的私人成员吗?这有什么问题?
  • 那么,您问为什么可以从Passenger 类中访问Passenger 类的私有成员?什么?考虑阅读good book
  • 它是可访问的,因为对象本身是作为对函数的引用传递的。

标签: c++ object reference private-members


【解决方案1】:

privateprotected 的定义并不限制您从同一类中访问这些类型的属性或函数

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

【讨论】:

    【解决方案2】:

    这是因为私有成员是类的私有成员,而不是实例。

    这与询问您为什么可以访问 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 在类的范围内。

    【讨论】:

      猜你喜欢
      • 2023-01-18
      • 2016-01-20
      • 2023-03-11
      • 1970-01-01
      • 2013-12-30
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多