快速业务通道

C++的算符重载

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

算符重载的作用是什么?它允许你为类的用户提供一个直觉的接口。 算符重载允许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

算符重载的好处是什么?

通过重载类上的标准算符,你可以发掘类的用户的直觉。使得用户程序所用的语言是面向问题的,而不是面向机器的。 最终目标是降低学习曲线并减少错误率。

有什么算符重载的实例?这里有一些算符重载的实例:

myString + yourString 可以连接两个 std::string 对象

myDate++ 可以增加一个 Date 对象

a * b 可以将两个 Number 对象相乘

a[i] 可以访问 Array 对象的某个元素

x = *p 可以反引用一个实际“指向”一个磁盘记录的 "smart pointer" —— 它实际上在磁盘上定位到 p 所指向的记录并返回给x。

但是算符重载使得我的类很丑陋;难道它不是应该使我的类更清晰吗?算符重载使得类的用户的工作更简易,而不是为类的开发者服务的! 考虑一下如下的例子:

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

我能为“幂”运算创建一个 operator** 吗?不行。 运算符的名称、优先级、结合性以及元数都是由语言固定的。在C++中没有operator**,因此你不能为类类型创建它。

如果还有疑问,考虑一下x ** y与x * (*y)等同(换句话说,编译器假定 y 是一个指针)。此外,算符重载只不过是函数调用的语法修饰。虽然这种特殊的语法修饰非常美妙,但它没有增加任何本质的东西。我建议你重载pow(base,exponent)(双精度版本在中)。

顺便提一下,operator^可以成

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号