运算符重载

运算符重载的作用是什么?

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

运算符重载允许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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值