C++的运算符重载(转)

C++的运算符重载

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) 当需要重载运算符具有可交换性时,选择重载为友元函数。

转载于:https://www.cnblogs.com/Wilson-Kwok/archive/2012/11/21/2781406.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 用户界面---样式和主题(Styles and Themes)(二)

样式属性 理解了样式是如何定义的之后&#xff0c;就需要学习<item>元素都定义了那些有效的样式属性类型。你可能已经熟悉了像layout_width和textColor属性&#xff0c;但是还有更多的可以使用的样式属性。 查找应用于指定的View对象的最好的地方是对应的类参考&#xff…

Android应用程序结构总结

2019独角兽企业重金招聘Python工程师标准>>> Android应用程序结构分析 由于是初学者&#xff0c;对于Android应用程序的结构的认识是一穷二白的&#xff0c;对于开发Android应用程序&#xff0c;必须先了解其程序的结构和作用。一下就用一个简单的例子来解剖&#…

递归--整数划分问题

问题描述&#xff1a; 将正整数n表示成一系列正整数之和&#xff1a;nn1n2…nk&#xff0c;其中n1≥n2≥…≥nk≥1&#xff0c;k≥1。正整数n的这种表示称为正整数n的划分。 问题1&#xff1a; 输出整数n的所有可能的划分&#xff0c;如&#xff1a; 输入&#xff1a;6 输出&am…

嵌入式软件开发注意事项一

嵌入式软件开发注意事项一1、首先对测试板进行各方面硬件性能的测试&#xff1a;电源测试&#xff0c;时钟测试等等。要确保硬件最基本的几个性能是正常的&#xff0c;否则后面真的无法进行软件的开发&#xff0c;因为如果你没有确保硬件的正确性&#xff0c;那么后面进行软件调…

Oracle 表空间与数据文件

-- --Oracle 表空间与数据文件 -- /* 一、概念 表空间&#xff1a;是一个或多个数据文件的逻辑集合 表空间逻辑存储对象&#xff1a;永久段-->如表与索引 临时段-->如临时表数据与排序段 回滚段-->用于事物回滚或闪回内存的撤销数据 表空间分类&#xff1a;系统表空间…

简单的深度优先遍历和广度优先遍历

代码来源于《啊哈&#xff01;算法》。 1、深度优先遍历&#xff1a; &#xff08;1&#xff09;无权值 #include<stdio.h> int book[101],n, e[1001][1001], sum; void DFS(int cur) {int h;sum;printf("%d ", cur);//目前所在点进行的操作&#xff0c;可以…

【 2013华为杯编程大赛成都第三组前两题试题及答案】

2013-09-12 16:41:24 题目描述 某省会城市街道纵横交错&#xff0c;为了监控路灯的运行状况&#xff0c;每条街道使用一个数字字符串标识该街道上所有路灯的运行状况。假设路灯只有如下3种状态&#xff08;分别用数字0, 1, 2标识&#xff0c;一盏路灯只对应其中一种状态&#x…

webrtc笔记(1): 基于coturn项目的stun/turn服务器搭建

webrtc是google推出的基于浏览器的实时语音-视频通讯架构。其典型的应用场景为&#xff1a;浏览器之间端到端(p2p)实时视频对话&#xff0c;但由于网络环境的复杂性(比如&#xff1a;路由器/交换机/防火墙等&#xff09;&#xff0c;浏览器与浏览器很多时候无法建立p2p连接&…

ADS中startup.s文件启动分析

映像文件分析&#xff0c;ADS 中startup.s 文件启动分析&#xff0c;学嵌入式开发ADS 必看2010-04-17 10:21声明&#xff1a; 我也是转来的&#xff0c;不是原创&#xff0c;由于别人是网易的日志&#xff0c;不能直接转&#xff0c;所以…… 感谢原创&#xff01;让我明白了st…

String Statistics(2008年珠海市ACM程序设计竞赛)

String Statistics 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 描述 You have an n n matrix of lower-case letters. You start from somewhere in the matrix, walk in one of the eight directions (left, right, up, down, up-left, up-right, …

从0-1背包问题学习回溯法、分支界限法、动态规划

一、0-1背包问题的描述 下面将使用回溯法、分支界限法、动态规划法来分析和解决此问题。 二、回溯法 &#xff08;1&#xff09;算法步骤 &#xff08;2&#xff09;代码如下&#xff08;没有裁剪函数&#xff09;&#xff1a; 用i和n来判断结束与否&#xff0c;是因为解空间…

高可用性的HDFS—Hadoop分布式文件系统深度实践

《高可用性的HDFS—Hadoop分布式文件系统深度实践》基本信息作者&#xff1a; 文艾 王磊 出版社&#xff1a;清华大学出版社 ISBN&#xff1a;9787302282587上架时间&#xff1a;2012-5-14出版日期&#xff1a;2012 年5月开本&#xff1a;16开页码&#xff1a;371版次&#xff…

推荐:解析“extern”

http://blog.csdn.net/keensword/article/details/401114 写的很不错转载于:https://www.cnblogs.com/ATually/archive/2012/04/05/2432826.html

【字符串问题】求一个字符串中重复出现的最长的子串

2013-09-14 15:34:16 用后缀数组求一个字符串中重复出现的最长的子串。 用C中的string类可以很方便地进行操作&#xff0c;需将后缀数组保存在vector<string>&#xff0c;如下面代码中的string版本所示&#xff0c;但这样就会因为<string>有很大的开销&#xff1b;…

关于scanf和的问题

简单地说&#xff0c;如果使用scanf函数把一个字符串读进一个字符数组中&#xff0c;不要使用&&#xff1b;读取其他基本变量类型时&#xff0c;在变量名之前添加&。或者说&#xff0c;字符串名字本身就是一个地址了&#xff0c;所以不用取地址符。 如以下代码&#xf…

Oracle lower() Upper()函数

即将某字段信息中的字母转成小写、大写的方法。 将 user表里的user_name字段信息中含有字母的全部转成大写的方法&#xff1a; update user set  user_nameUpper(user_name) 同理得到将 user表里的user_name字段信息中含有字母的全部转成小写的方法&#xff1a; update user …

【作品】超级玛丽射击版

【下载地址】稍后上传 【以下内容摘自试验报告&#xff0c;可能狗屁不通&#xff0c;尽情谅解】 &#xff0d;游戏介绍: 简单的射击游戏,键盘控制动作[角色的移动,跳跃等],鼠标控制攻击的位置方向, 单击鼠标即射击,同时可以设置游戏规定时间,时间到则结束游戏. &#xff0d;游戏…

嵌入式系统Linux内核开发工程师必须掌握的三十道题

嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理&#xff0c;那么你就可以算得上是基本合格的Linux内核开发工程师&#xff0c;试试看&#xff01; 1) Linux中主要有哪几种内核锁&#xff1f; Linux的内核锁主要是自旋锁和信号…

MySQL锁的用法之行级锁

2019独角兽企业重金招聘Python工程师标准>>> 行级锁是MySQL中粒度最小的一种锁&#xff0c;他能大大减少数据库操作的冲突。但是粒度越小&#xff0c;实现的成本也越高。MYISAM引擎只支持表级锁&#xff0c;而INNODB引擎能够支持行级锁&#xff0c;下面的内容也是针…