CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
(图)邪恶的韩国UMPC 使用 Java 编写数据库应用新规范
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

重载()

楼主tjm()2001-08-25 16:30:16 在 C/C++ / C语言 提问

现在我学到重载运算副了,对于重载(),有一点想法:  
  类::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

相关问题

  • 重载!
  • 重载问题!
  • 重载,,,模板。。。。。
  • 关于重载。
  • 函数重载
  • SqlParameterCollection 重载
  • 如何重载==
  • 重载->和()
  • "<<"重载问题
  • "<<"重载问题

关键词

  • c++
  • 函数
  • 指针
  • 编译器
  • 语言
  • 重载
  • 运算符
  • 参数
  • 特殊
  • pred

得分解答快速导航

  • 帖主:tjm
  • onetwothree
  • qqchen79
  • qqchen79

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...

社区焦点:

教你怎样用C#搞笑整人
最懒惰的程序员写的Cache
程序员如何掌握专业英语
Java栈与堆
分享:让人懊恼的面试
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo