关闭

运算符重载

标签: 工作c++string语言c
1044人阅读 评论(0) 收藏 举报
运算符重载的作用是什么?

它允许你为类的用户提供一个直觉的接口。

运算符重载允许C/C++的运算符在用户定义类型(类)上拥有一个用户定义的意义。重载的运算符是函数调用的语法修饰:

 

 class Fred {
 public:
   
// ...
 };
 
 #if 0
 
   
// 没有运算符重载:
   Fred add(Fred, Fred);
   Fred mul(Fred, Fred);
 
   Fred f(Fred a, Fred b, Fred c)
   {
     return add(add(mul(a,b), mul(b,c)), mul(c,a));    
// 哈哈,多可笑...
   }
 
 #else
 
   
// 有运算符重载:
   Fred operator+ (Fred, Fred);
   Fred operator* (Fred, Fred);
 
   Fred f(Fred a, Fred b, Fred c)
   {
     return a*b + b*c + c*a;
   }
 
 #endif

 


  运算符重载的好处是什么?

通过重载类上的标准运算符,你可以发掘类的用户的直觉。使得用户程序所用的语言是面向问题的,而不是面向机器的。

最终目标是降低学习曲线并减少错误率。

 

运算符重载使得类的用户的工作更简易,而不是为类的开发者服务的!

考虑一下如下的例子:

 

 class Array {
 public:
   int& operator[] (unsigned i);      
// 有些人不喜欢这种语法
   
// ...
 };
 
 inline
 int& Array::operator[] (unsigned i)  
// 有些人不喜欢这种语法
 {
   
// ...
 }

有些人不喜欢operator关键字或类体内的有些古怪的语法。但是运算符重载语法不是被期望用来使得类的开发者的工作更简易。它被期望用来使得类的用户的工作更简易:

 

 int main()
 {
   Array a;
   a[3] = 4;   
// 用户代码应该明显而且易懂...
 }

记住:在一个面向重用的世界中,使用你的类的人有很多,而建造它的人只有一个(你自己);因此你做任何事都应该照顾多数而不是少数。

 

什么运算符能/不能被重载?

大多数都可以被重载。C的运算符中只有 . ? :(以及sizeof,技术上可以看作一个运算符)。C++增加了一些自己的运算符,除了::.*,大多数都可以被重载。

这是一个下标运算符的示例(它返回一个引用)。先没有运算符重载:

 

 class Array {
 public:
   int& elem(unsigned i)        { if (i > 99) error(); return data[i]; }
 private:
   int data[100];
 };
 
 int main()
 {
   Array a;
   a.elem(10) = 42;
   a.elem(12) += a.elem(13);
 }

现在用运算符重载给出同样的逻辑:

 

 class Array {
 public:
   int& operator[] (unsigned i) { if (i > 99) error(); return data[i]; }
 private:
   int data[100];
 };
 
 int main()
 {
   Array a;
   a[10] = 42;
   a[12] += a[13];
 }
我能重载 operator== 以便比较两个 char[] 来进行字符串比较吗?

 不行:被重载的运算符,至少一个操作数必须是用户定义类型(大多数时候是类)。

但即使C++允许,也不要这样做。因为在此处你应该使用类似 std::string的类而不是字符数组,因为数组是有害的。因此无论如何你都不会想那样做的。

 

 

0
0

猜你在找
【套餐】Hadoop生态系统零基础入门
【套餐】嵌入式Linux C编程基础
【套餐】2017软考系统集成项目——任铄
【套餐】Android 5.x顶级视频课程——李宁
【套餐】深度学习入门视频课程——唐宇迪
【直播】广义线性模型及其应用——李科
【直播】从0到1 区块链的概念到实践
【直播】计算机视觉原理及实战——屈教授
【直播】机器学习之凸优化——马博士
【直播】机器学习&数据挖掘7周实训--韦玮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:151526次
    • 积分:2254
    • 等级:
    • 排名:第16634名
    • 原创:59篇
    • 转载:34篇
    • 译文:1篇
    • 评论:16条
    文章分类
    最新评论