=、( )、[]、->4个运算符只能用类运算符重载,不能用友元运算符来重载,请举例解释,感激!
如题!
我只能讲讲个人理解。
其实友元的目的是为了在类外访问类的私有成员。所以这里重载不涉及友不友元的问题,只涉及一个运算符是否可以实现成非成员函数的形式(当然如果可以,那它就需要必要的访问权限)。
对于单元运算符,比如 -x:
可以解释成成员函数 x.operator-(),也可以解释成非成员函数 operator-(x)。从而也就可以重载成非成员函数。
二元的,比如 x+y:
可以解释成成员函数 x.operator+(y),也可以解释成非成员函数 operator+(x, y)。也是一个道理。
唯一的三元运算符 ?:,很难想像它能重载成什么形式。于是很合理的,它也是一个不能重载的运算符。
赋值运算 x = y:
解释成 x.operator=(y) 肯定是没问题的。难道不能解释成 operator=(x, y) 吗?
应该注意到,编译器会隐式提供一个默认的拷贝成员函数operator=,所以如果当它不适宜时,应当自己定义一个。凡是涉及到拷贝,赋值,就会涉及到很多复杂性。为了让基类的拷贝构造函数呀,operator=等成员函数能够享受到虚函数的语法约束,从而在继承,多态这些地方有用武之地,禁止非成员函数形式的重载是很有效的。
函数调用 x(a, b, c, d, ...):
解释成 x.operator(a, b, c, d, ...) 是合理的。这是防函数机制,没有非成员函数重载形式的必要。
下标运算 a[i],和类成员访问运算 x->y:
分别解释成 a.operator[](i)。( x.operator->())->y。这两个形式很专用了,你能想出重载成非成员函数的意义吗?