第8单元类与对象(I) 159 cout << C3=<< c3 Realo<<+j"<< c3. Imago<< endl c3=c3+6.5; cout < C3+ 6.5=<< c3. Realo<<" +j"<< c3. Imago<< endl 输出:C1=3+14 C3=8+j10 C3+6.5=14.5+j10 分析:在本例中,对运算符“+”进行了两次重载,分别用于两个复数的加法运算 和一个复数与一个实数的加法运算 可以看出,运算符重载事实上也是一种函数重载,但运算符重载的参数个数有限制。例 如,对于双目运算符的重载须有且仅能有一个参数,该参数即为运算的右操作数,而左操作 数则为该类的对象本身。这一点可以从函数的定义中清楚地看出 在运算符重载函数的定义中,由程序员给出了该运算符重载的具体操作。该具体操作并 不要求与所重载之运算符的意义完全相同。 个重载了的运算符虽然其具体操作发生了变化,但其用法与该运算符的原始定义完全 一样。应当说明的是:无论运算符重载的具体定义如何,重载了的运算符的优先级与结合性 仍保持与其原始运算符的相同 自学内容 84类模板 类是对问题空间的抽象,而类模板则是对类的抽象,即更高层次上的抽象。与函数模板 相似,程序中可以通过高度抽象首先声明一个模板类,然后通过使用不同的实参生成不同类 的对象。模板类的声明方法为: template< class<类型参数》〉 class<类名〉 模板类的具体内容与普通类没有本质上的区别,只是在其成员中要用到模板类型参数 例如: template <class T> class Any Type
第 8 单元 类与对象(II) - 159 - cout << "C3 = " << c3.Real() << "+j" << c3.Imag() << endl; c3 = c3+6.5; cout << "C3 + 6.5 = " << c3.Real() << "+j" << c3.Imag() << endl; } 输 出: C1 = 3+j4 C2 = 5+j6 C3 = 8+j10 C3+6.5 = 14.5+j10 分 析:在本例中,对运算符“+”进行了两次重载,分别用于两个复数的加法运算 和一个复数与一个实数的加法运算。 可以看出,运算符重载事实上也是一种函数重载,但运算符重载的参数个数有限制。例 如,对于双目运算符的重载须有且仅能有一个参数,该参数即为运算的右操作数,而左操作 数则为该类的对象本身。这一点可以从函数的定义中清楚地看出。 在运算符重载函数的定义中,由程序员给出了该运算符重载的具体操作。该具体操作并 不要求与所重载之运算符的意义完全相同。 一个重载了的运算符虽然其具体操作发生了变化,但其用法与该运算符的原始定义完全 一样。应当说明的是:无论运算符重载的具体定义如何,重载了的运算符的优先级与结合性 仍保持与其原始运算符的相同。 自学内容 8.4 类模板 类是对问题空间的抽象,而类模板则是对类的抽象,即更高层次上的抽象。与函数模板 相似,程序中可以通过高度抽象首先声明一个模板类,然后通过使用不同的实参生成不同类 的对象。模板类的声明方法为: template <class <类型参数>> class <类名> { … … }; 模板类的具体内容与普通类没有本质上的区别,只是在其成员中要用到模板类型参数。 例如: template <class T> class AnyType {
第8单元类与对象(I) 160- blie Any type (t a, t b): x(a), y(b)1 T GetXo freturn x: 1 T GetYO return y: 上面声明的模板类中,所有的成员函数都是内联函数。如果在类外定义模板类的成员函数, 则必须遵循以下语法: template< class<类型参数》〉 返回值类型〉<类名><类型参数》:〈函数名>(<参数表>) 如果模板中有多个类型参数,则无论具体的成员函数是否用到它们,所有的参数类型必须在 类名后一一列出。 使用模板类的第一步就是声明一个模板类的对象,其方法为: 类名〉<<类型实参》><对象 其中<类型实参>是任何已存在的数据类型,也可以是非模板类。如果模板类带有多个参数类 型,则除缺省参数外的所有参数都必须给出其实参类型。 [例8-3]声明一个通用的栈类。 / Example8-3:通用的栈类 include iostream. h> template <class t, int 10 Stack T m tStack [n] int m nmaxelement Int m nlop AnyStack(: m nMaxElement (n), m nTop(0)1 O freturn Top: 1 BOOL Push (T) BOOL POp (t&) template <class T, int n> OoL AnyStack <T, n>:: Push(T elem)
第 8 单元 类与对象(II) - 160 - T x, y; public: AnyType(T a, T b): x(a), y(b){} T GetX(){return x;} T GetY(){return y;} }; 上面声明的模板类中,所有的成员函数都是内联函数。如果在类外定义模板类的成员函数, 则必须遵循以下语法: template <class <类型参数>> <返回值类型> <类名> <<类型参数>>::<函数名>(<参数表>) { … … } 如果模板中有多个类型参数,则无论具体的成员函数是否用到它们,所有的参数类型必须在 类名后一一列出。 使用模板类的第一步就是声明一个模板类的对象,其方法为: <类名> <<类型实参>> <对象>; 其中<类型实参>是任何已存在的数据类型,也可以是非模板类。如果模板类带有多个参数类 型,则除缺省参数外的所有参数都必须给出其实参类型。 [例 8-3] 声明一个通用的栈类。 // Example 8-3: 通用的栈类 #include <iostream.h> template <class T, int n = 10> class AnyStack { T m_tStack[n]; int m_nMaxElement; int m_nTop; public: AnyStack():m_nMaxElement(n), m_nTop(0){} int GetTop(){return Top;} BOOL Push(T); BOOL Pop(T&); }; template <class T, int n> BOOL AnyStack <T, n>::Push(T elem) {