C++的运算符重载

分类: C++编程2007-08-31 15:44 26144人阅读 评论(10) 收藏 举报
c++c扩展语言
  C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。 

  运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下:

<返回类型说明符> operator <运算符符号>(<参数表>)
{

     <函数体>

}

 运算符重载时要遵循以下规则:

(1) 除了类属关系运算符"."、成员指针运算符".*"、作用域运算符"::"、sizeof运算符和三目运算符"?:"以外,C++中的所有运算符都可以重载。

(2) 重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。

(3) 运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。

(4) 重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。

(5) 运算符重载不能改变该运算符用于内部类型对象的含义。它只能和用户自定义类型的对象一起使用,或者用于用户自定义类型的对象和内部类型的对象混合使用时。

(6) 运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似,避免没有目的地使用重载运算符。

  运算符函数重载一般有两种形式:重载为类的成员函数和重载为类的非成员函数。非成员函数通常是友元。(可以把一个运算符作为一个非成员、非友元函数重载。但是,这样的运算符函数访问类的私有和保护成员时,必须使用类的公有接口中提供的设置数据和读取数据的函数,调用这些函数时会降低性能。可以内联这些函数以提高性能。)

成员函数运算符

 运算符重载为类的成员函数的一般格式为:

    <函数类型> operator <运算符>(<参数表>)

    {

     <函数体>

    }

  当运算符重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数。因此:

(1) 双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。

(2) 前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。

(3) 后置单目运算符重载为类的成员函数时,函数要带有一个整型形参。

    调用成员函数运算符的格式如下:

    <对象名>.operator <运算符>(<参数>)

    它等价于

    <对象名><运算符><参数>

    例如:a+b等价于a.operator +(b)。一般情况下,我们采用运算符的习惯表达方式。

友元函数运算符

 运算符重载为类的友元函数的一般格式为:

    friend <函数类型> operator <运算符>(<参数表>)

    {

     <函数体>

    }

  当运算符重载为类的友元函数时,由于没有隐含的this指针,因此操作数的个数没有变化,所有的操作数都必须通过函数的形参进行传递,函数的参数与操作数自左至右一一对应。

 调用友元函数运算符的格式如下:

    operator <运算符>(<参数1>,<参数2>)

    它等价于

    <参数1><运算符><参数2>

    例如:a+b等价于operator +(a,b)。

两种重载形式的比较

  在多数情况下,将运算符重载为类的成员函数和类的友元函数都是可以的。但成员函数运算符与友元函数运算符也具有各自的一些特点:

(1) 一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。

(2) 以下一些双目运算符不能重载为类的友元函数:=、()、[]、->。

(3) 类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。

(4) 若一个运算符的操作需要修改对象的状态,选择重载为成员函数较好。

(5) 若运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则只能选用友元函数。

(6) 当运算符函数是一个成员函数时,最左边的操作数(或者只有最左边的操作数)必须是运算符类的一 个类对象(或者是对该类对象的引用)。如果左边的操作数必须是一个不同类的对象,或者是一个内部 类型的对象,该运算符函数必须作为一个友元函数来实现。

(7) 当需要重载运算符具有可交换性时,选择重载为友元函数。

C++的运算符重载 --http://blog.csdn.net/zgl_dm/article/details/1767201相关推荐

  1. C++的运算符重载http://blog.csdn.net/zgl_dm/article/details/1767201

    http://blog.csdn.net/zgl_dm/article/details/1767201 C++的运算符重载 标签: c++c扩展语言 2007-08-31 15:44 38704人阅读 ...

  2. C++的运算符重载 http://blog.csdn.net/zgl_dm/article/details/1767201

    C++的运算符重载 标签: c++c扩展语言 2007-08-31 15:44 37258人阅读 评论(11) 收藏 举报  分类: C++编程(62)  C++中预定义的运算符的操作对象只能是基本数 ...

  3. C++父类与子类关系以及函数重载、覆盖和隐藏规则 http://blog.csdn.net/xingyu19871124/article/details/7640131

    http://blog.csdn.net/xingyu19871124/article/details/7640131 C++父类与子类关系以及函数重载.覆盖和隐藏规则 标签: c++class语言编 ...

  4. http://blog.csdn.net/neiloid/article/details/7037093#

    1. 显示系统中全部Android平台: android list targets 2. 显示系统中全部AVD(模拟器): android list avd 3. 创建AVD(模拟器): androi ...

  5. Android Volley完全解析(二),使用Volley加载网络图片 转载:http://blog.csdn.net/guolin_blog/article/details/174

    转载:http://blog.csdn.net/guolin_blog/article/details/17482165 在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中 ...

  6. 嵌入式c程序易错点(转自http://blog.csdn.net/zhzht19861011/article/details/45508029)

    今天第一次在网上发表博客,虽然是转载的别人的文章,但还是有点小激动.转载的这篇文章里提到的问题很多都自己亲自踩过,有个别还踩过多次(感觉自己有点傻),也许是亲生经历的原因,看完后果断的转了,以后可以经 ...

  7. GitHub 优秀的 Android 开源项目 转自http://blog.csdn.net/shulianghan/article/details/18046021

    原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea 主要介绍那些不错个性化的View,包括Lis ...

  8. https://blog.csdn.net/blmoistawinde/article/details/84329103

    背景     很多场景需要考虑数据分布的相似度/距离:比如确定一个正态分布是否能够很好的描述一个群体的身高(正态分布生成的样本分布应当与实际的抽样分布接近),或者一个分类算法是否能够很好地区分样本的特 ...

  9. numpy的shape用法(转http://blog.csdn.net/by_study/article/details/67633593)

    https://www.bbsmax.com/A/1O5E78b7z7/ https://www.cnblogs.com/lindaxin/p/8074921.html http://blog.csd ...

最新文章

  1. 《Android应用开发攻略》——1.3 从命令行创建 “Hello, World”应用程序
  2. Linux 中模拟延时和丢包的实现
  3. 多个Finder方法的外部内容类型
  4. 科研工作者一般怎么找文献?
  5. c++中的向量容器(vector)
  6. 一个例子学懂搜索引擎(lucene)
  7. 一文读懂 Serverless,将配置化思想复用到平台系统中
  8. 解决atomikos在oracle应用中的XA事务异常 Error in recovery
  9. 《谭浩强C语言程序设计》 · 素数 7-3
  10. 三种新姿势帮你写出精美简历
  11. jspSmartUpload的使用—实现文件上传
  12. dimm和udimm_服务器内存UDIMM与RDIMM有什么区别
  13. 中国天气预报API城市编号
  14. 一文读懂人工智能产业链:基础技术、人工智能技术及人工智能应用
  15. ACE_Message_QueueACE_MT_SYNCH::putq ()使用时需要注意的地方
  16. speedoffice(word)如何修改行间距
  17. 如何向网页中嵌入谷歌英文地图
  18. 程序是如何运行的呢?
  19. Python—循环程序
  20. 淘宝天猫使用内部优惠券购物省钱指南

热门文章

  1. 医学图像分割新网络:Boundary-aware Context Neural Network for Medical Image Segmentation
  2. CSS---按住录音提示框制作
  3. LaTeX—如何把论文模板的关键词从Index Terms 改为Keywords
  4. SQL SERVER使用STUFF函数拼接
  5. java环境配置-jdk
  6. linux线程池的使用
  7. Sheldon Numbers
  8. 区块链社交时代 或许永远不会到来
  9. python爬取微博热搜_Python 超简单爬取微博热搜榜数据
  10. 相机光学(十八)——MTF与SFR