当作为朋友的类具有相同名称的成员变量时会发生什么

What happens when Classes that are friends have same name member variables

本文关键字:变量 成员 什么 朋友      更新时间:2023-10-16

在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;
}; 

然后在房间里。Update()我使用m_peopleInside之类的东西。

&m_peopleInside[4];

据我所知,朋友类将允许Room类访问House类的私人成员。那么将使用哪个m_peopleInside?

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

它是一个实例变量。所以它需要一个实例来执行。如果没有提供实例,那么它与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;
}

据我所知,friend类将允许Room类访问House类的私有成员。

这是正确的。

那么将使用哪种m_peopleInside

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

Room::update()中,如果只使用m_peopleInside,它将是Room的成员变量,而不是House

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

cout << x.m_peopleInside;

尽管"m_peopleInside"在"House"中是私有的,但它可以从Room的方法访问,因为类"House"声明"Room"是他的朋友。