博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++Primer : 第十四章 :运算符重载与类型转化基本概念
阅读量:2432 次
发布时间:2019-05-10

本文共 2097 字,大约阅读时间需要 6 分钟。

重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成。和其他函数一样,重载的运算符也包含返回类型、参数列表以及函数体。

重载运算符函数的参数数量与该运算符作用的运算对象数量一样多。一元运算符有一个参数,二元运算符有两个。对于二元运算符来说,左侧运算对象传递给第一个参数,而右侧运算对象传递给第二个参数。除了重载的函数调用运算符operator()之外,其他重载运算符不能含有默认实参。

如果一个运算符是成员函数,则它的第一个(左侧)运算对象绑定到隐式的this指针上,因此,成员运算符函数的(显式)参数数量比运算符的运算对象总数少一个。

对于一个运算符函数来说,它或者是类的成员,或者至少含有一个类类型的参数。对于一个重载的运算符来说,其优先级和结合律与对应的内置运算符保持一致。

直接调用一个重载的运算符函数

//一个非成员运算符函数的等价调用data1 + data2;                //普通的表达式operator+(data1, data2);      //等价的函数调用

这两次调用是等价的,它们都调用了非成员函数operator+,传入data1作为第一个实参、传入data2作为第二个实参。

data1 += data2;            //基于“调用”的表达式data1.operator+=(data2);    //对于成员运算符函数的等价调用

这两条语句都调用了成员函数operator+=,将this绑定到data1的地址上,将data2作为实参传入了函数。

使用与内置类型一致的含义
1、如果类执行IO操作,则定义移位运算符使其与内置IO保持一致。
2、如果类的某个操作是检查相等性,则定义operator==;如果类有了operator==,意味着它通常也应该有operator!=。
3、如果类包含一个在内的单序比较操作,则定义operator<;如果类有了operator<,则它也应该含有其他关系操作。
4、重载运算符的返回类型通常情况下应该与内置版本的返回类型兼容:逻辑运算符和关系运算符应该返回bool,算术运算符应该返回一个类类型的值,赋值运算符和复合运算符则应该返回左侧运算对象的一个引用。
赋值和复合赋值运算符
赋值运算符的行为与复合版本的类似:赋值之后,左侧运算对象和右侧对象的值相等,并且运算符应该返回它左侧运算对象的一个引用。
选择作为成员或者非成员
1、赋值(=)、下标([])、调用(())和成员访问箭头(->)运算符必须是成员。
2、复合赋值运算符一般来说应该是成员,但并非必须,这一点与赋值运算符略有不同。
3、改变对象状态的运算符或者与给定类型密切相关的运算符,如递增、递减和解引用运算符,通常应该是成员。
4、具有对称性的运算符可能转换任意一端的运算对象,例如算术、相等性、关系和位运算符等,因此它们通常是普通的非成员函数。
如果我们想提供含有类对象的混合类型表达式,则运算符必须定义成非成员函数。
当我们把运算符定义成成员函数时,它的左侧运算对象必须是运算符所属类的一个对象。例如:

string s = "world";string t = s + "!";    //正确,我们能把一个const char*加到一个string对象中,如果+是string成员,则产生错误string u = "hi" + s;

如果operator+是string类的成员,则上面的第一个加法等价于s.operator+(“i”)。同样的,“hi”+s等价于"hi".operator+(s)。显然"hi"的类型是const char*,这是一种内置类型,根本没有成员函数。

因为string将+定义成了普通的非成员函数,所以"hi"+s等价于operator+(“hi”, s)。和任何其他函数调用一样,每个参数都能被转化成形参类型。唯一的要求是至少有一个运算对象是类类型,并且两个运算对象都能准确无误地转化成string。

在什么情况下重载的运算符与内置运算符有所区别?在什么情况下重载的运算符又与内置运算符一样?

不同点:
重载操作符必须具有至少一个class或枚举类型的操作数
重载操作符不保证操作数的求值顺序
相同点:
对于优先级和结合性以及操作数的数目都不变

为Sales_data编写重载的输入、输出、加法和复合赋值运算符的声明

class Sales_data {
friend std::istream& operator>>(std::istream&, Sales_data&); friend std::ostream& operator<<(std::ostream&, const Sales_data&);public: Sales_data& operator+=(const Sales_data&);};Sales_data operator+(const Sales_data&, const Sales_data&);

转载地址:http://stxmb.baihongyu.com/

你可能感兴趣的文章
websphere笔记
查看>>
使用 WebSphere Process Server 关系开发集成解决方案(2)
查看>>
最新最全的Portlet 通信过程详解
查看>>
在LINUX中安装WEB SPHERE5.1的正确方法
查看>>
WebSphere简单故障排查
查看>>
ITCAM for Websphere v6.0与ITM v6.1集成的快速指南
查看>>
数据泵 TTS(传输表空间技术)
查看>>
DATA GUARD架构(一)
查看>>
weblogic管理2 - 创建并启动一个managed server
查看>>
linux下开机自动开启单机oracle
查看>>
weblogic管理1——创建 和 删除一个domain
查看>>
EJB 的理解
查看>>
祝贺您
查看>>
oracel 10.2 NFS mount RMAN备份出错
查看>>
10G rman CATALOG BACKUPPIECE
查看>>
理解UNDO表空间
查看>>
AIX 文件系统的loglv
查看>>
分享后
查看>>
帮帮忙Veritas为什么连不上oracle
查看>>
ssh 信任,免密码到远程机器
查看>>