当作为朋友的类具有相同的名称成员变量

时间:2016-04-14 14:48:56

标签: c++ oop friend

在C ++中,当我有以下

时会发生什么
class House
{
public:
    House();
    ~House();

private:
    int* m_peopleInside;

friend class Room;
}; 

然后在House的构造函数中设置

m_peopleInside = new int[5];
m_peopleInside[4] = 2;

class Room
{
public:
    Room();
    ~Room();

    Update();

private:
    int* m_peopleInside;
}; 

然后在Room.Update()中使用m_peopleInside这样的东西。

&m_peopleInside[4];

我的理解是,朋友班将允许Room类访问House类的私人成员。那么将使用哪个m_peopleInside?

我应该补充一点,在这种情况下,m_peopleInside被用作数组。

3 个答案:

答案 0 :(得分:2)

这是一个实例变量。所以它需要一个实例来行动。如果没有提供实例,那么它与this->m_peopleInside相同,这意味着它引用了调用该函数的实例。所以,例如,如果这是你的功能:

void Room::Update() {
    // these two are the same, they null the member of the Room object
    m_peopleInside = nullptr;
    this->m_peopleInside = nullptr;

    House h;
    // should be pretty obvious what this does
    h.m_peopleInside = nullptr;
}

答案 1 :(得分:1)

  

据我所知,朋友班将允许Room班级访问House班级的私人成员。

这是正确的。

  

那么将使用哪个m_peopleInside

要访问m_peopleInside对象的House成员,您需要一个House类型的对象或指针。

In {{ 1}},如果你只是使用Room::update(),它将是m_peopleInside的成员变量,而不是Room

答案 2 :(得分:0)

当您在“Room.Update()”中使用“m_peopleInside”时,您肯定会使用“Room”的数据成员。您对“朋友”课程的理解并不正确。为了说清楚,假设你在“Room”类的一个方法中有一个来自“House”类的对象“x”,例如“Update()”。那么,下面的代码在这里是正确的方法:

cout << x.m_peopleInside;

虽然“m_peopleInside”在“House”中是私有的,但可以从Room的方法访问,因为“House”类声明“Room”是他的朋友。