重载()
现在我学到重载运算副了,对于重载(),有一点想法:
类::operator()(参数表)
总能用一个函数表示:
函数(类*,参数表)
前者远没有后者更容易理解,用起来也没有方便和直观的感觉,那么为什么还要绕个弯用重载的()呢?其它的运算副都有使用上的优点,有存在的价值,也就是代替函数表示的好处,只有这个(),我想不出来。是不是可以说("Ineffectiv C++ Item2001"):
“永远不会也不要重载()”????
希望使用过重载()的老师,给个例子,表现()的实用价值。
问题点数:60、回复次数:13Top
1 楼tjm()回复于 2001-08-25 16:30:44 得分 0
xiexieTop
2 楼zjlsct()回复于 2001-08-25 16:41:25 得分 0
关注Top
3 楼onetwothree(onetwothree)回复于 2001-08-26 08:10:40 得分 20
首先, 程序设计语言的设计有一个"普遍性"原理, 如果没有特殊理由, 就不要规定特殊情况. 既然C++允许运算符重载, 那么如没有特殊理由, 也就不应该禁止对某个运算符的重载. 有的运算符确实不能重载, 例如圆点运算符, 条件运算符等, 那都有特殊理由. 对()就没什么特殊理由.
其次, ()是唯一允许多个参数的运算符, 因此就有许多特殊的用处. 在标准库里也有广泛应用, 例如其中的function object就是STL的一个基础技术.
另外, 是否重载运算符与效率无关. 用运算符重载也不会降低效率(与tjm提出的另一种方式相比), 至少可以做得一样高效.
像所提的那样写外部函数(用一个类指针)就背离了OOP, 写大量外部函数也使程序难以管理, 而OOP就是为了帮助人组织程序. 成员函数可以访问类的private部分, 外部函数不行. 把这种函数定义为外部函数再定义为友员又没有任何合理的理由.Top
4 楼tjm()回复于 2001-08-27 20:01:35 得分 0
xiexieTop
5 楼tjm()回复于 2001-08-30 23:02:55 得分 0
upTop
6 楼tjm()回复于 2001-09-03 21:14:36 得分 0
upTop
7 楼qqchen79(知秋一叶)回复于 2001-09-04 01:07:32 得分 20
首先必须承认,C++就功能而言并不比C高明(废话,就像任何语言就功能而言都是汇编的子集一样)。所以,operator()并不会给你带来什么高深莫测的功能。相反,C++中的operator()是希望能够简化你的部分工作。
其实与Operator()对应的不应该是普通的函数,而是——函数指针,这里最常见的例子就是通用排序了:
如果你要在C中写一个通用的排序算法,应该怎么写?你需要用户提供一个用于比较的函数,所以必须使用一个函数指针作为参数,记得函数指针的丑陋的typedef吗?是不是可读性查了一些呢?
void csort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
如果改用C++写,不用函数指针而是用operator()(其实就是onetwothree说的functor啦),至少可读性就已经好多了!
template<class RanIt, class Pred>
void cppsort(RanIt first, RanIt last, Pred pr);
//不好意思,用了模版,但主要是看类Pred, 它实现了operator(),由于比较。
//有Pred作参数,应该比上面那一串好看多了吧?
例外,使用operator()的确比用函数指针更快,不信?C函数库中的qsort和STL中的sort那个快呢?试试就知道了!sort大约会快50%左右,而这恰恰是operator()的好处,神奇吧?(上面的csort和cppsort就是一这两个函数的原型)
结论:("Ineffectiv C++ Item2001"):prefer operator() to function pointer.Top
8 楼tjm()回复于 2001-09-04 01:26:30 得分 0
qqchen79(知秋一叶) 实在高,这次没白UP(已经UP三次了)。
关于快的问题我还不太理解,因为什么原因会快?
Top
9 楼qqchen79(知秋一叶)回复于 2001-09-04 03:12:10 得分 20
用于比较的函数一版就只有那么一两句话,比如:
return (lhs > rhs)?true:false;
对于C语言sort版本来说,sort接受的是一个函数指针,也就是编译期间无法确定究竟是调用哪一个函数,编译器也就无能为力了。
对于C++的sort版本,嗯...先看代码吧!
struct cmp_int
{
bool operator()(int lhs, int rhs) {
return (lhs > rhs) ? true : false;
}
};
sort(&intarray[0], &intarray[size], cmp_int);
编译器可以明确,sort模版的这个实例调用的一定是cmp_int::operator()。然后,“唔,这么小的函数,似乎很合适inline噢”,编译器想着想着,就...Top
10 楼fsb_12345(myself)回复于 2001-09-04 09:48:18 得分 0
C++书上例子很多呀Top
11 楼tjm()回复于 2001-09-04 14:52:00 得分 0
再加点分Top
12 楼krerix(^o^)回复于 2001-09-05 02:20:47 得分 0
学习一下:)Top
13 楼zhiqiu(http://www.bsdlover.cn(找兼职,谁有需求?))回复于 2001-09-05 06:38:22 得分 0
真佩服qqchen79,重载()我也看过,大概理解,可你能说得这么透彻,让小弟我既佩服又嫉妒啊^-^Top





