为什么==重载可以访问参数的私有成员

时间:2012-09-18 15:11:55

标签: c++ operator-overloading access-specifier

  

可能重复:
  why private value of the obj can be changed by class instance?

考虑以下(部分)代码:

class Group {
    private:
      int id;

    public:
      void set_id(int);
      int get_id();
      bool operator==(const Group&);
};


bool Group::operator==(const Group& g) {
    if(g.id == this->id) {  /* id is private? */
            return true;
    }

    return false;
}

代码编译和结果似乎正确。但是,在运算符重载实现的if部分中,我们直接访问其参数的私有成员 - const Group& g,但这种访问不是无效的吗?

3 个答案:

答案 0 :(得分:18)

您的operator==Group课程的成员。成员函数可以访问该类的任何private成员,不仅适用于this,还适用于他们可以访问的任何实例。

如果您考虑这种行为是必要的,因为否则访问控制会使两个或多个实例(swap,复制构造函数,运算符)的交互方法成为不可能,除非该对象具有任何公共访问器成员变量,用于此类方法。从设计的角度来看,这通常是不可取的。此外,它会将访问控制的标准提高到高水平(“如果我只是让那个成员公开,我可以免除我的痛苦......”)。

总结此代码是完全有效的(虽然我不明白为什么if是必要的,而不是简单地使用return g.id == this->id;

答案 1 :(得分:14)

访问限定符不控制实例级别的访问权限,而是控制类型级别的访问权限。类型T实例的任何成员函数都可以访问同一类型T的任何其他实例的所有私有成员。

由于operator==是一个成员函数,它可以访问它所属类的实例的所有成员变量。

答案 2 :(得分:5)

不,因为operator==Group的成员。它就在函数名中。这意味着它可以访问该类任何对象的private成员。

如果您尝试将其编写为自由函数,则无法编译:

bool areEqual(const Group& g1, const Group& g2) {
    return g1.id == g2.id;
}