- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算符重载与入/出流操作
/downloads67/ebook/241634/cppchap5.doc
在前一章的例27中,当实现复型数c=a+b的运算时是利用类的成员函数进行的。在实用中所期望的是直接利用上式的运算表达式而求解。本章将讨论的算符重载便是解决此类需求的一种技术手段。另一方面本章还将讲述在C++语言中如何使用标准流入/出(cin 和cout)算符并配以格式说明的方法。所有这些也都是C++语言利用它特有的流式类的基本手段为用户提供的便捷的入/出手段。
§1 C++语言的运算符重载(Operator Overloading)
其实算符重载并非在C++语言中才有,C中的“?”号就是一种重载算符。比如:
int i = 20,?p;
p = i;
i = ?p ?2 ;
等表达式中的星号随其位置的不同而引起的操作也不同,这也可以被认为是一种重载。
§1.1 C++语言类中的算符重载
第三章已经讨论了C++语言函数的重载的概念。在C++语言中,大多数的运算符号也可以当作函数名的一部分来使用,这就奠定了算符重载的基础。声明算符重载的格式是:
operator C++语言支持的算符(参数描述表) {…}
将前一章最后例27中的类成员函数add(…)和sub(…)分别改写为算符函数后可呈例1的形式:
例1:
# include ? stdio.h ?
class Complex
{
double r, i ;
public:
Complex (double rs = 0.,double is=0.) {r = rs ; i = is;};
Complex operator+(const Complex add_2){return Complex(r+add_2.r, i + add_2.i);}
Complex operator?(const Complex sub_2){return Complex(r?sub_2.r, i ? sub_2.i);}
void operator!();
};
void Complex::operator!()
{
if (i?=0) printf (“% .2f + % .2fi\n”,r,i);
else printf(“% .2f % .2fi\n”,r,i);
}
void main()
{
Complex a(3.,9.),b(7.,8.),c(0.,0.);
c=a.operator+(b);//当执行完此表达式后将执行析构函数
printf(“a+b =”); !c;
c=b.operator?(a);
printf (“b?a=”); !c;
}
本例分别作了一元算符‘!’和二元算符‘+’、‘-’的函数重载。例中一元算符‘!’已按它原有的形式(也必须用原有的形式)写在操作对象左面。而二元算符都有意按“operator +”做为函数名写在其对象和参量之间。在对算符函数引用时,C++语言规定作为声明重载算符前的关键字“.operator”可以被省略,其后的“()”也可以被省略。括号内的参数则可直接写在算符之后。这样上例main()函数内的两个引用就可以分别改写成非常简单、熟悉的形式了:
c=a+b ;
c=b?a ;
可见算符重载使程序的书写大为简化了。上例的运算甚至可以连算,例如写出:“c=a+b+a ;”的形式来,若仍用例中函数的写法,此句将十分冗长且不易读懂。使用算符重载和原算符的关系式时必须注意以下几点:
①算符的分类与算符的限制
须再强调,算符重载是重复利用C++语言的原有算符,并非取消相应算符的原有功能(以运算对象类型区分其功能)。为避免发生二义性,算符重载并不是对全部C++语言所支持的所有算符都通用。下面几种算符就不允许重载:“sizeof、.、?、::、?、??”。而“=、??、??、??”四种算符只能作为类中的成员函数才能被重载。此外不能利用算符重载创造新算符。
②重载后的算符语义不能发生本质的改变
由上例可见,算符重载普遍适用于一、二元算符,而且被重载的算符仍保留原有的特性以及原有的优先顺序(如先乘除后加减,先右后左等)。如在引用算符重载函数的省略形式时,“!”必须出现在被操作对象的左侧;参数应将移至“??”内等。
例2:
# include ? iostream . h ?
# include ? string . h ?
class Student
{
char name[10];
float score[3];
static unsigned int sum
您可能关注的文档
最近下载
- 电路电流练习.doc VIP
- 安全生产标准重大危险源管理人员培训记录.docx VIP
- 商业写字楼智能化初步设计在2025年的智能化物业管理系统评估报告.docx
- DB32_T 4342-2022工业企业全过程环境管理指南.docx VIP
- 传感器数字式传感器详解.ppt VIP
- 马工程外国文学史第一章古代文学.pptx VIP
- 低空经济行业市场前景及投资研究报告:Joby,Archer,国内eVTOL产业.pdf VIP
- 《数据可视化技术》课件.ppt VIP
- Unit 1 Helping at home 第5课时 Part B Let’s learn&Listen and chant(教学设计)英语人教PEP版四年级上册.pdf
- 《普通遗传学》第9章近亲繁殖和杂种优势.ppt
文档评论(0)