运算符重载

转载 2006年06月07日 02:38:00
运算符重载的作用是什么?

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

运算符重载允许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的类而不是字符数组,因为数组是有害的。因此无论如何你都不会想那样做的。

 

 

C++复数定义和重载运算符

  • 2016年04月12日 20:02
  • 4KB
  • 下载

c++——运算符重载(四) 源码

  • 2015年09月09日 17:12
  • 1.85MB
  • 下载

单目运算符-作为成员重载

单目运算符-作为成员重载 #include "stdafx.h" #include using namespace std; //单目运算符重载 //M# #M ++a a++ //operato...

C++运算符重载

  • 2015年09月07日 20:40
  • 213KB
  • 下载

C++ 运算符重载

  • 2015年06月19日 14:52
  • 1.74MB
  • 下载

作业11: 类_运算符重载

作业11:  类_运算符重载1.设向量X = ( x1 ,x2 ,x3) 和 Y = ( y1 , y2 ,y3 ),则它们之间的加、减和积分别定义为:X + Y = ( x1 + y1 , x2 +...
  • neicole
  • neicole
  • 2011年07月13日 11:37
  • 2746

运算符重载

  • 2014年03月25日 22:01
  • 349KB
  • 下载

运算符重载详解

  • 2014年06月07日 22:08
  • 741KB
  • 下载

QDataStream 运算符重载发送自定义数据结构

Qt4 Gossip: QDataStream 對於純綷的二進位資料,可以使用QDataStream來協助處理,可以直接處理C++基本資料型態、還有許多Qt資料型態,像是QByteArr...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:运算符重载
举报原因:
原因补充:

(最多只允许输入30个字)