运算符重载

转载 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++ 运算符重载

  • 2015-06-19 14:52
  • 1.74MB
  • 下载

【C++】运算符重载

这是C++的特色,也是C++比较难的一个基本语法,但是,如果你把运算符重载看成一个特殊的类方法,且这个类方法的名称就是运算符,一切就变得简单了。 下面用一个简单的程序说明这个问题: 声明两个3x3二维...

C++运算符重载

  • 2015-09-07 20:40
  • 213KB
  • 下载

运算符重载分析与实例

运算符重载时的几个关键点: 1. 首先,运算符重载不会改变运算符的优先级和结合性。 2. 运算符的重载不能改变运算符的运算对象数。因此,重载函数的形参个数(包括成员函数的隐式指针this)...

运算符重载

  • 2014-03-25 22:01
  • 349KB
  • 下载

C++运算符重载

  • 2013-08-07 21:29
  • 1.47MB
  • 下载

第08周:1.2:类的友元函数+复数类中的运算符重载

/* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 作 者:王颖 * 完成日期:2014 年 4 月 14 日 * 版 本 号...

运算符重载详解

  • 2014-06-07 22:08
  • 740KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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