C++中operator+=可直接访问私有成员而operator+需友元的原因是什么
问题核心原因:两个运算符的函数属性不同
operator+= 是类的成员函数,自带私有成员访问权限
你实现的Fraction::operator+=属于Fraction类的成员函数,C++的私有成员访问控制是以类为维度,而非对象维度:同一个类的成员函数,有权限访问任意该类实例的私有成员,不管是当前this指向的对象,还是作为参数传入的同类型对象right,所以不需要友元声明就能直接访问right.numer、right.denom。
你实现的operator+是全局非成员函数,默认无类私有成员访问权限
你写的operator+是定义在类外的全局函数,不属于Fraction类的成员,默认无法访问类的私有成员,所以必须显式声明为类的友元才能获取访问权限,否则就会触发编译错误。
优化建议:无需友元的operator+实现方式
你可以复用已经写好的operator+=来实现operator+,既不用声明友元,也能减少重复代码,更符合封装原则:
const Fraction operator+(const Fraction& left, const Fraction& right) { Fraction res = left; res += right; return res; }
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

