C++运算符重载(一)

       C++允许在自己的类中,或是在全局作用域中重定义运算符的含义。由于很多面向对象的语言没有提供这种能力,因此你可能会低估这种特性在C++中的作用。C++中运算符的概念十分广泛,甚至包含[](数组索引)、()(函数调用)、类型转换以及内存分配和释放例程。可以通过运算符重载来改变语言运算符对自定义类的行为。能让自己的类具有内建类型的类似行为,甚至可以编写看上去类似于数组、函数或指针的类。在博主的《C++运算符重载》系列博文中会对我们常用的运算符提供重载的实例,希望大家能有所收获。额,本篇博文就让我们一起来探讨一下重载运算符的概念吧。

重载运算符的概念

重载运算符的原因

       在学习重载运算符之前,首先需要了解为什么需要重载运算符。不同的运算符有不同的理由,但是基本的指导原则是为了让自定义类的行为和内建类型的行为一样。自定义类的行为越接近内建类型,就越便于这些类的客户使用。例如,在之前《灵活而奇特的C++语言特性——引用(下)》一篇博文中,我们曾写过一个自己的MyString,在类中重载了”+”运算符,它能很方便的完成字符串的拼接。重载运算符的第二个原因是为了获得对程序行为的更大控制权。例如,可以对自定义类重载内存分配(operator new)和内存释放(operator delete),来精确控制每个新对象的内存分配和内存回收。

运算符重在的限制

①不能添加新的运算符符号,只能重定义语言中已经存在的运算符的意义。

②有少数运算符不能重载,”.”(对象成员访问)、”::”(作用域解析运算符)、”sizeof”、”?:”(三目运算符)和”.*”( 成员指针运算符)。

③不能修改运算符的优先级和结合性。

④不能对内建类型重定义运算符。

⑤可以重载具有双重意义的运算符(”*”、”-”和”+”)的两个意义。

运算符重载的选择

重载为类方法还是全局函数

       首先,要决定运算符应该实现为类的方法还是全局函数(通常是类的友元)。如何选择呢?在选择之前,我们需要理解这两个选择之间的区别。当运算符是类的方法时,运算符表达式的左侧必须是这个类的对象。当运算符是全局函数时,运算符表达式的左侧可以是不同类型的对象。并不是所有的运算符都会给你选择的机会,有些运算符天生就属于上述两种中的一种,不能再将其重载为另外一种。“[]”(下标运算符)、“->”(解除引用运算符)、“()”(函数调用运算符和转换运算符)、“=”(赋值运算符)只能重载为成员函数。“<<”(流插入运算符)、“>>”(流提取运算符)只能重载为非成员函数。

参数的类型

       参数类型的选择有一些限制,大多数运算符不能修改参数的数量。应该按引用接受每一个非基本类型的参数。除非要真正修改参数,否则将每一个参数都设置为const。

返回值类型

       C++不根据返回类型来解析重载,因此,在编写重载运算符时,可以指定任意返回类型。然而,可以做某件事情并不意味着应该做这件事情。这种灵活性可能会导致令人迷惑的代码,例如比较运算符返回指针,算法运算符返回bool类型。当然,我们可以这样做,但是我们不应该编写这样的代码。如果你想写着玩的话,那就无可厚非啦。引用和const标记的决策也适用于返回类型。如果运算符构造了一个新的对象,那么必须按值返回新的对象。如果不构造新对象,那么可以返回调用这个运算符的对象的引用,或者返回其中一个参数的引用。可以作为左值修改的返回值必须是非const。否则,这个值应该是const。

行为

       在重载的运算符中,可以提供任意需要的实现,但是你不能扭曲运算符原有的意义。例如,让“+”运算符实现减法。我们应该保持运算符原有的意义,实现类似的操作。

不要重载的运算符

        还是那句话,可以做某件事情并不意味着应该做这件事情。避免重载二元布尔运算符operator &&和operator ||,因为这样会使C++的短路求值规则失效。取地址运算符(operator &)的重载一般没有什么特别的用途,如果重载会导致混乱,因为这样做会以可能异常的方式修改基础语言的行为(获得变量的地址)。整个STL大量使用了运算符重载,但从未重载取地址运算符。最后,不要重载逗号运算符(operator ,)。C++中的逗号运算符也称为序列运算符,用于分隔一条语句中的多个表达式,确保从左至右的求值顺序。几乎没有什么正当理由需要重载这个运算符。

 

        C++运算符重载的概念就将到这里,本篇全是概念性的知识,没有需要涉及到程序的,博主就没有附上程序实例。相信大家对这些概念以及熟悉了吧。如果想了解更多关于C++运算符重载的知识,请关注博主的《C++运算符重载》系列博文,在那里我们将会通过程序实例去探讨C++运算符重载的魅力,相信你在那里会有不一样的收获。当然,如果你对C++很感兴趣的话,那么请关注博主的《漫谈继承技术》和《灵活而奇特的C++语言特性》系列博文,在那里你也许会发现C++更大的魅力,让你对这门博大精深的语言更加爱不释手。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值