- 1、本文档共21页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章 操作符重载
重载是C++多态性的体现之一。当定义新的数据类型之后,C++原有操作符提供的操作在语义往往不能满足对新的数据类型的对象进行操作,因此必须对C++原有操作符的操作语义进行扩充,这就是重载的应用需求背景。
8.1操作符重载概述
当在同一作用域内声明两个或多个相同的名字(即标识符)时,称该名字被重载。在同一作用域内的两个声明,如果声明的名字相同但是数据类型不同,则称这两个声明为重载声明。C++规定,只有函数声明可以被重载,对象声明或类型声明不允许重载。换言之,C++的这一规定将重载严格限制在函数范畴。
当重载的函数被调用时,从诸个可调用的重载函数(viable functions)中究竟调用那一个函数则由调用时实参的类型与函数声明时形参的类型相比较结果的一致性决定。这个选择与决定的过程称为重载解析。在C++中,根据函数的定义者是谁可以将函数分为两类。一类是由程序员定义的函数,它们往往被称为用户自定义函数,另一类则是系统提供的函数。就系统提供的函数而言,根据它们的调用方式,又可以进一步分为两类。一类是与用户自定义函数调用方式相同的系统函数,它们往往称为库函数或类库中的成员函数;另一类则沿用自然语言和数学语言的使用习惯,在各类表达式中完成相应的运算,它们往往称为操作符或运算符,但实际上是系统的预定义函数或操作符函数。例如对整型对象x、y,x+y实际表示对预定义函数‘+’的调用。x和y是预定义函数‘+’的参数,但一般习惯上称为‘+’的左操作数和右操作数。由于操作符实际上也是函数,不同的只在于操作符是系统的预定义函数,因此操作符和用户自定义函数一样也可以重载。
以加法操作‘+’为例,C++提供的‘+’操作如果不考虑类库支持,则只能进行整数或实数的加法运算,若考虑类库支持则能够进行一般复数的运算。如果用复数来表示电路中的电流和电压,根据电路理论,只有电流和电流才能进行相加减的运算;同理,只有电压和电压才能进行相加减的运算。因此,为了将复数用于电路计算,可以象下面的例子那样设计一个用于电路计算的复数类,并且对加法操作的语义进行扩充。
例8-1 设计一个能够用于电路计算的复数类,并重载加法操作。
#include iostream.h
struct complex
{
complex(double re=0.0,double im=0.0,char ch1=U );
complex operator+(complex c);//声明重载加法操作
void show();
private:
double real,imag;
char ch;
};
complex::complex(double re,double im,char ch1 )
{
real=re;imag=im;ch=ch1;
coutconstructor is called!endl;
}
complex complex::operator+(complex c)
{ //定义重载加法操作,扩充加法操作的语义
double x,y;
if(ch==c.ch){
x=real+c.real;y=imag+c.imag;
return complex(x,y,ch);
}
else
coutcant execute the plus opetating!endl;
return complex(0,0,U);
}
void complex::show()
{
coutch=;
if(imag=0)
coutreal+imagiendl;
else
coutrealimagiendl;
}
void main(void)
{
complex c1(0,0,I),c2(1.5,2.3,I),c3(2.7,-9.2,I);
c1=c2+c3;//可以用c1=c2.operator+(c3)来替换
c1.show();
}
程序的运行结果为;
constructor is called!
constructor is called!
constructor is called!
constructor is called! //return语句中通过构造函数实现类型转换
I=4.2-6.9i
程序在complex类中声明了一个字符数据成员ch,并且对加法运算进行了重载。C++规定,当进行操作符重载时,要在操作符前面冠以关键字operator。因此在对‘+’进行重载时就用了operator+作为加法操作的函数调用符。重载后的加法操作要求参与相加的两个对象的ch成员值相同时才允许进行加法操作,否则认为出错。编译器将表达式c2+c3的理解成为c2.operator+(c3)。事实上,用c2.operator+(
您可能关注的文档
最近下载
- 2024年党纪学习教育“学党纪、知党纪、明党纪、守党纪”党课讲稿7篇.docx VIP
- DB34∕T 5019-2015 细水雾灭火系统设计、施工与验收规范.pdf
- 计算机网络课程设计---模拟Ethernet帧的发送过程.pdf VIP
- 江西省高校教师职业道德修养课程考试试卷及答案.pdf VIP
- 不出资合伙人合同协议书.docx VIP
- 中药材种植中药材基地建设及整体实施方案.pdf
- 2025-2030年中国电子制造服务(EMS)行业市场运行格局及前景战略研判报告.docx
- 粤教版《国际理解教育》全册教学设计教案(小学版).pdf
- 2024年中国数字经济发展研究报告-中国信息通信研究院.docx
- 摄影艺考真题集锦(带答案).pdf VIP
文档评论(0)