| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 517 人关注过本帖
标题:=、( )、[]、->4个运算符只能用类运算符重载,不能用友元运算符来重载,请举 ...
只看楼主 加入收藏
全世界安静
Rank: 2
等 级:论坛游民
帖 子:104
专家分:65
注 册:2012-6-4
结帖率:31.58%
收藏
 问题点数:0 回复次数:1 
=、( )、[]、->4个运算符只能用类运算符重载,不能用友元运算符来重载,请举例解释,感激!
如题!
搜索更多相关主题的帖子: 用友 
2012-06-17 16:36
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
我只能讲讲个人理解。
其实友元的目的是为了在类外访问类的私有成员。所以这里重载不涉及友不友元的问题,只涉及一个运算符是否可以实现成非成员函数的形式(当然如果可以,那它就需要必要的访问权限)。

对于单元运算符,比如 -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。这两个形式很专用了,你能想出重载成非成员函数的意义吗?
2012-06-17 18:36
快速回复:=、( )、[]、->4个运算符只能用类运算符重载,不能用友元运算符来重载 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036940 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved