cppchap5第五章算符重载与入出流操作

上传人:xiao****1972 文档编号:84818203 上传时间:2019-03-04 格式:DOC 页数:17 大小:187KB
返回 下载 相关 举报
cppchap5第五章算符重载与入出流操作_第1页
第1页 / 共17页
cppchap5第五章算符重载与入出流操作_第2页
第2页 / 共17页
cppchap5第五章算符重载与入出流操作_第3页
第3页 / 共17页
cppchap5第五章算符重载与入出流操作_第4页
第4页 / 共17页
cppchap5第五章算符重载与入出流操作_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《cppchap5第五章算符重载与入出流操作》由会员分享,可在线阅读,更多相关《cppchap5第五章算符重载与入出流操作(17页珍藏版)》请在金锄头文库上搜索。

1、第五章 算符重载与入出流操作http:/ 和cout)算符并配以格式说明的方法。所有这些也都是C+语言利用它特有的流式类的基本手段为用户提供的便捷的入出手段。1 C+语言的运算符重载(Operator Overloading) 其实算符重载并非在C+语言中才有,C中的“*”号就是一种重载算符。比如: int i = 20,*p; p = &i; i = *p *2 ;等表达式中的星号随其位置的不同而引起的操作也不同,这也可以被认为是一种重载。1.1 C+语言类中的算符重载 第三章已经讨论了C+语言函数的重载的概念。在C+语言中,大多数的运算符号也可以当作函数名的一部分来使用,这就奠定了算符重载

2、的基础。声明算符重载的格式是: operator C+语言支持的算符(参数描述表) 将前一章最后例27中的类成员函数add()和sub()分别改写为算符函数后可呈例1的形式:例1:# include 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 Comple

3、x &sub_2)return Complex(r-sub_2.r, i - sub_2.i);void operator!();void Complex:operator!() if (i=0) printf (“% .2f + % .2fin”,r,i); else printf(“% .2f % .2fin”,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=”

4、); !c;本例分别作了一元算符!和二元算符+、-的函数重载。例中一元算符!已按它原有的形式(也必须用原有的形式)写在操作对象左面。而二元算符都有意按“operator +”做为函数名写在其对象和参量之间。在对算符函数引用时,C+语言规定作为声明重载算符前的关键字“.operator”可以被省略,其后的“()”也可以被省略。括号内的参数则可直接写在算符之后。这样上例main()函数内的两个引用就可以分别改写成非常简单、熟悉的形式了:c=a+b ;c=b-a ;可见算符重载使程序的书写大为简化了。上例的运算甚至可以连算,例如写出:“c=a+b+a ;”的形式来,若仍用例中函数的写法,此句将十分冗

5、长且不易读懂。使用算符重载和原算符的关系式时必须注意以下几点:算符的分类与算符的限制 须再强调,算符重载是重复利用C+语言的原有算符,并非取消相应算符的原有功能(以运算对象类型区分其功能)。为避免发生二义性,算符重载并不是对全部C+语言所支持的所有算符都通用。下面几种算符就不允许重载:“sizeof、.、*、:、?、:”。而“=、()、-”四种算符只能作为类中的成员函数才能被重载。此外不能利用算符重载创造新算符。重载后的算符语义不能发生本质的改变 由上例可见,算符重载普遍适用于一、二元算符,而且被重载的算符仍保留原有的特性以及原有的优先顺序(如先乘除后加减,先右后左等)。如在引用算符重载函数的

6、省略形式时,“!”必须出现在被操作对象的左侧;参数应将移至“”内等。例2:# include # include class Studentchar name10;float score3;static unsigned int sum ; public:void operator (const Student&);Student (char *na,float ma = 0.,float en = 0.,float ph = 0.) score0 = ma; scord1 = en; score2 = ph; strcpy (name,na); void operator !() if(su

7、m0) cout”Mat:”score0/sum”Eng:”score1/sum ”Phy:”score2/sumn; ;void Student:operator (const Student &s)unsigned int i;float nt = 0.;for(i=0;i3;i +) scorei+=s.scorei;nt+=s .scorei; couts.name :nt/3 . n; sum +;unsigned int Student:sum = 0;void main ()int i ; Student sa=Student(“Wang”,60,70,80), Student(

8、“Li ”,70,80,90), Student(“Zhang”,50,60,70),total (“Total”);for(i=0;i3;i+)totalsai;!total;本例中为了说明类数组的使用,全部对象都用了数组,但请注意初始化的形式。重载算符函数“”是用来求每个学生的平均分的,并用一个静态变量sum记录已参加计算的学生人数,同时分类累加,最后以“!”重载输出总的平均成绩。算符重载功能必须同类发生联系 尽管算符重载是做为一种函数名而存在并以函数重载的方式实现的,但算符重载却不能脱离C+语言的核心类而单独使用。这就意味着算符重载函数要么做为一个类中成员出现,要么做为一个类的友元(即全

9、局且带有类对象参数)函数出现。这是其与普通函数的最本质的区别,因而下面的语法就是错误的:void operator (int I,char c)1.2 类外的算符重载 前面讨论的算符重载都是做为一个类的成员函数出现的。所以使用时就必须通过一个类对象才被允许。但若遇到一个类对象数据与一个非类的数据发生运算就会产生问题。如上面所举的复数运算例中,应如何给对象的实部成员数据加上一个实常数(如a+b+2.72)呢?为一常数在诸多的类中增加成员函数不仅没有必要,而且在实际编程中甚至是不可能的。在很大程度上,只能将相关的算符重载函数声明为非类属的全局函数了。C+语言限定在类外的算符重载函数只能是二元函数,

10、其中的一个参数必须是一个类属的(如引用、指针等)。据此及上一章的讨论而推论,这个类外的算符重载函数也必须作为一个友元函数在类中声明。否则该函数是不可能访问一个类对象的成员的。这样的算符重载便解决了诸如上面的“a+b+2.72”之类的问题。为了满足加、减法的交换律(即a + b + 2.72 = 2.72 + a + b),当然可以再声明一个参数位置互换的类外同一算符的重载函数。这样前面例子就可变为下例的形式:例3:# include class Complexdouble r,i;friend void operator!(complex&);friend Complex operator+(

11、const Complex&,const double);friend Complex operator+(const double,const Complex&); 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); ;void operator !(Complex &ob)if (ob.i=0)printf( “%.2f+%.2fin”,ob.r,ob.i);else prin

12、tf(“%.2f%.2fin”,ob.r,ob.i);inline Complex operator+(const Complex &add,const double d) /第一重载return Complex (add.r+d,add.i);inline Complex operator+(const double d,const Complex &add) /第二重载return add+d;/调用前面的operator+()以节省时空。void main()Complex a(3.,9.),b(7.,8.),c(0.,0.);c=a+b+2.72;/Means:a.operator+(

13、operator+(a,b),2.72);printf (“a+b+2.72=”); !c;c=2.72+a+b;/省略“operator”及各()后用加号代替参数间的逗号printf (“2.72+a+b=”); !c;本例中的减法函数被省略是为突出主题,请读者上机自己编制减法函数并体会类外算符的重载设计方法。由此看出友元函数在此种条件下的重要用途。通常这种类外算符重载函数都声明为内联(inline)附加类。这是因为此类函数一般不大,但却被频繁引用。当然将一个计算方法转换成严密的算符重载函数,主要依靠设计者自己对算法的掌握程度。但若一旦出现漏洞,编译器也会报出错误,使设计者及时发现并补救。2 C+语言类数据类型的转换(class type cast) 由于类数据类型是用户自己定义的,原在C语言中的那些隐含、强制类型转换就自然会失去作用。本节所述内容便是用于解决如何设计自定义的类强制类型转换问题的方法。2.1 类外数据向类对象中成员数据的转换 此种转换比较容易,由于类中可定义多个重载的构造函数,利用这些构造函数便可

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号