Wea*_*ped 10 c++ operator-overloading access-specifier
可能重复:
为什么可以通过类实例更改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;
}
Run Code Online (Sandbox Code Playgroud)
代码编译和结果似乎正确.但是,在if运算符重载实现的部分中,我们直接访问其参数的私有成员 - const Group& g但是这样的访问不是无效的吗?
Gri*_*zly 20
你operator==是Group班上的一员.成员函数可以访问private该类的任何成员,不仅适用于this,而且适用于他们可以访问的任何实例.
如果你考虑这个行为是必要的,因为否则访问控制会使两个或多个实例(swap,复制构造函数,运算符)的交互方法变得不可能,除非该对象具有任何成员变量的公共访问器,一个方法.从设计的角度来看,这通常是不可取的.此外,它会将访问控制的标准提高到高("如果我只是让那个成员公开,我可以免除我的痛苦......").
结束这段代码是完全有效的(虽然我不明白为什么这if是必要的,与简单使用相比return g.id == this->id;)
dat*_*olf 14
访问限定符不控制实例级别的访问,而是控制类型级别的访问.类型T的实例的任何成员函数都可以访问同一类型T的任何其他实例的所有私有成员.
由于operator==是一个成员函数,它可以访问它所属的类的实例的所有成员变量.
不,因为operator==是其中的一员Group.它就在函数名中.这意味着它可以访问该类private的任何对象的成员.
如果您尝试将其编写为自由函数,则无法编译:
bool areEqual(const Group& g1, const Group& g2) {
return g1.id == g2.id;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7392 次 |
| 最近记录: |