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

  • 1
  • 0
  • 约2.53万字
  • 约 17页
  • 2016-05-07 发布于重庆
  • 举报
cppchap5第五章算符重载与入出流操作

算符重载与入/出流操作 /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 ;

文档评论(0)

1亿VIP精品文档

相关文档