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

C++ 为什么==重载可以访问参数的私有成员,c++,operator-overloading,access-specifier,C++,Operator Overloading,Access Specifier,可能重复: 考虑以下(部分)代码: 代码已编译,结果似乎正确。但是,在操作符重载实现的if部分中,我们直接访问其参数的私有成员-const Group&g,但是这样的访问不是无效的吗?否,因为操作符==是组的成员。它就在函数名中。这意味着它可以访问该类的任何对象的private成员 如果您试图将其作为自由函数编写,则不会编译: bool areEqual(const Group& g1, const Group& g2) { return g1.id == g2.id;

可能重复:

考虑以下(部分)代码:


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

否,因为
操作符==
组的成员。它就在函数名中。这意味着它可以访问该类的任何对象的
private
成员

如果您试图将其作为自由函数编写,则不会编译:

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

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


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

您的
运算符==
组的成员。成员函数可以访问该类的任何
private
成员,不仅可以访问
this
,还可以访问它们可以访问的任何实例

如果您考虑一下,这种行为是必要的,因为否则访问控制将使两个或多个实例(
swap
、复制构造函数、运算符)的交互方法不可能实现,除非对象具有任何成员变量的公共访问器,这在这种方法中使用。从设计的角度来看,这往往是不可取的。此外,它还将访问控制的门槛提高到很高(“如果我只是将该成员公之于众,我可以省去我的痛苦……”)


总结这段代码是完全有效的(尽管我不明白为什么与简单地使用
return g.id==this->id;
)相比,
return g.id==this->id
有什么问题?
很好地匹配了这个问题。@sbi-它有一个不必要的
this->
@Pete我通常使用
this->
来增强可读性。我删除
this->
来增强可读性<代码>
我明白你的意思,但如果你能指出为什么说明符在类型级别而不是实例级别运行,我将非常感激?一定有原因。@WeaklyTyped如果它们不在类型级别操作,则除非所有数据都是公共的或有“getter”,否则您将无法复制构造或赋值对于每一个数据成员,@弱类型:因为C++是静态类型的检查语言,所以静态地判断访问是否仍然在实例中(停顿问题)是不可能的。例如,成员函数
class T{private:int bar;public:void foo(T*T){T*=T->bar;}void spam(){foo(this);}
–foo可以从“外部”调用使用
this
指针从类或内部执行。在编译时,不可能静态检查是否发生这种情况。这也是juanchopanza所说的。谢谢!这让事情变得非常清楚。:)
bool areEqual(const Group& g1, const Group& g2) {
    return g1.id == g2.id;
}