为什么 == 重载可以访问参数的私有成员
Why == overloading can access private members of argument
可能的重复项:
为什么 OBJ 的私有值可以通过类实例更改?
请考虑以下(部分)代码:
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
,但这样的访问不是无效吗?
您的operator==
是Group
类的成员。 成员函数可以访问该类的任何private
成员,不仅对于this
,而且对于它们可以访问的任何实例。
如果你考虑一下,这种行为是必要的,因为否则访问控制将使两个或多个实例(swap
,复制构造函数,运算符)的交互方法变得不可能,除非对象具有任何成员变量的公共访问器,这在这种方法中使用。从设计的角度来看,这通常是不可取的。此外,它将把访问控制的标准提高到很高("如果我只是让该成员公开,我可以免除我的痛苦......")。
总结这段代码是完全有效的(尽管与简单地使用 return g.id == this->id;
相比,我不明白为什么if
是必要的)
访问限定符不是在实例级别控制访问,而是在类型级别控制访问。类型 T 的实例的任何成员函数都可以访问同一类型 T 的任何其他实例的所有私有成员。
由于 operator==
是一个成员函数,因此它可以访问其所属类实例的所有成员变量。
不,因为operator==
是Group
的成员。它就在函数名称中。这意味着它可以访问该类的任何对象的private
成员。
如果你试图把它写成一个自由函数,那不会编译:
bool areEqual(const Group& g1, const Group& g2) {
return g1.id == g2.id;
}
相关文章:
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 使用指向成员的指针将成员函数作为参数传递
- 如何将lambda作为模板类的成员函数参数
- 将成员函数指针作为参数传递给模板方法
- c++构造函数成员初始化:传递参数
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 模板化检查是否存在带有参数列表的类成员函数?
- 如何将类成员方法的参数列表自动填充写入可变参数?
- 为什么我需要在成员发起器列表中重复基类的模板参数?
- C++向量默认为成员参数
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 可变参数模板参数扩展 类型为 std::function 的类成员
- 当类成员参数具有相同的名称时,如何定义构造函数?
- 类成员参数中的Constexpr
- 允许通过指向方法的成员参数的指针来推断模板参数所指向的成员类型
- 为什么未调用的模板类成员 *参数* 被实例化
- 如何访问指向C++类模板中成员参数的指针
- 我们是否需要在嵌套类型的成员参数前面加上"::"?
- 设计模式- c++运行时成员参数的实例化