接3例5.3 void complex print( ∥显示复数的实数部分和虚数鄙分 i cout<<real; if(imagOcout<<+, if(imag=o)cout<<imag<< in" void maino complex A1(2346),A2(3.628),A3A4A5A6;∥定义六个复 数类对象 A3=A1A2;∥复数相加 程序运行结果如下: A4=A1-A2;∥复数相减 2.3+4.6i A5=A1*A2;∥复数相乘 A6=A1/A2;∥复数相除 3.6+28i Al.print( ∥输出复数A1 5.9+7.4i A2. printo ∥输出复数A2 1.3+18i A3 print0;输出复数相加的结6+231 A4. print( 输出复数相减的结果1017308+0486538i A5 print;输出复数相乘的结果A5 A6. printo ∥输出复数相除的结果A6 16
16 接3 例5.3 void complex::print() //显示复数的实数部分和虚数部分 { cout<<real; if(imag>0)cout<<"+"; if(imag!=0)cout<<imag<<"i\n"; } void main() { complex A1(2.3,4.6),A2(3.6,2.8),A3,A4,A5,A6; //定义六个复 数类对象 A3=A1+A2; //复数相加 A4=A1-A2; //复数相减 A5=A1*A2; //复数相乘 A6=A1/A2; //复数相除 A1.print(); //输出复数A1 A2.print(); //输出复数A2 A3.print(); //输出复数相加的结果A3 A4.print(); //输出复数相减的结果A4 A5.print(); //输出复数相乘的结果A5 A6.print(); //输出复数相除的结果A6 } 程序运行结果如下: 2.3+4.6i 3.6+2.8i 5.9+7.4i -1.3+1.8i -4.6+23i 1.017308+0.486538i
在主函数man()中的语句 A3=A1+A2 A4=A1-A2 A5=A1*A2 A6=A1A2; 所用的运算符“+、“-”、“*”、“/”是重载后的运算符。程序 执行到这四条语句时C++将其解释为: A3=A1. operator +(A2); A4=A1. operator-(A2); A5=A1. operator *(A2) A6=A1.operator /A2); 由此我们可以看出,成员运算符函数peao@实际上是由双目 运算符左边的对象A1调用的,尽管双目运算符函数的参数表只 有一个操作数A2,但另一个操作数是由对象A通过ths指针隐 含地传递的。以上两组语句的执行结果是完全相同的。一般而言, 采用成员函数重载双目运算符@后,可以用以下两种方法来使用: aa@ bb ∥隐式调用 aa operator@(b);∥显式调用 指针隐含地传递。因此,它的参数表中只有一个操作数bs 成员运算符函数 operator@所需的一个操作数由对象a通过thi
17 在主函数main()中的语句 A3=A1+A2; A4=A1-A2; A5=A1*A2; A6=A1/A2; 所用的运算符“+” 、 “-” 、 “*” 、 “/”是重载后的运算符。程序 执行到这四条语句时C++将其解释为: A3=A1.operator +(A2); A4=A1.operator -(A2); A5=A1.operator *(A2); A6=A1.operator /(A2); 由此我们可以看出,成员运算符函数operator @实际上是由双目 运算符左边的对象A1调用的,尽管双目运算符函数的参数表只 有一个操作数A2,但另一个操作数是由对象A1通过this指针隐 含地传递的。以上两组语句的执行结果是完全相同的。一般而言, 采用成员函数重载双目运算符@后,可以用以下两种方法来使用: aa @ bb; //隐式调用 aa.operator @(bb); //显式调用 成员运算符函数operator @ 所需的一个操作数由对象aa通过this 指针隐含地传递。因此,它的参数表中只有一个操作数bb
3.单目运算符重载 对单目运算符而言,成员运算符函数的参数表中没有参数,此时当 前对象作为运算符的一个操作数。 例5.4重载单目运算符“++”的例子 include <iostream. h> class coord int x,y; public: coord(int i=o, intj=0); void print(; coord operator++0;∥声明成员运算符函数 operator++() coord: coord(int i, int j) x=i;y=j:] void coord: printo icout<< X:<<X<< y:<<y<<endl; coord coord: operator+t0)∥定义成员运算符函数 operator++() ++x; y, return *this
18 3.单目运算符重载 对单目运算符而言,成员运算符函数的参数表中没有参数,此时当 前对象作为运算符的一个操作数。 例5.4 重载单目运算符“++”的例子 #include <iostream.h> class coord{ int x,y; public: coord(int i=0,int j=0); void print(); coord operator ++(); //声明成员运算符函数operator ++() }; coord::coord(int i,int j) {x=i;y=j;} void coord::print() {cout<<" x:"<<x<<",y:"<<y<<endl;} coord coord::operator ++() //定义成员运算符函数operator ++() { ++x; ++y; return *this; }
接1例5.4 void maino i coord ob(10, 20) ob. printo +tob ∥隐式调用成员运算符函数 operator++() ob. printo ob operator++(;W显式调用成员运算符函数 operator++() ob. print(; 程序运行结果如下: x:10,y:20 x:11,y:21 X:12,y=22 本例主函数man()中调用成员运算符函数 operator++()采用 了两种方法:++ob;与 ob operator++0 两者是等价的,其执行效果是完全相同的 从本例还可以看出,当成员函数重载单目运算符时,没有参数被显 式地传递给成员运算符函数。参数是通过this指针隐含地传递给 函数的。 19
19 接1 例5.4 void main() { coord ob(10,20); ob.print(); ++ob; //隐式调用成员运算符函数operator++( ) ob.print(); ob.operator ++(); //显式调用成员运算符函数operator ++() ob.print(); } 程序运行结果如下: x:10, y:20 x:11, y:21 x;12, y=22 本例主函数main()中调用成员运算符函数operator++()采用 了两种方法: ++ob; 与 ob.operator++() 两者是等价的,其执行效果是完全相同的。 从本例还可以看出,当成员函数重载单目运算符时,没有参数被显 式地传递给成员运算符函数。参数是通过this指针隐含地传递给 函数的
一般而言 采用成员函数重载单目运算符时,可以用以下两种方法来使用 @a;∥隐式调用 aa operator@O;∥显式调用 成员运算符函数 operato@所需的一个操作数由对象a通过ths 指针隐含地传递。因此,在它的参数表中没有参数。 说明: (1)运算符重载函数 operator@()可以返回任何类型,甚至可 以是vod类型但通常返回类型与它所操作的类的类型相同,这样 可以使重载运算符用在复杂的表达式中。例如,在例5.3中,可 以将几个复数连续进行加、减、乘、除的运算。 (2)在重载运算符时,运算符函数所作的操作不一定要保持c++ 中该运算符原有的含义。例如,可以把加运算符重载成减操作, 但这样容易造成混乱。所以保持原含义,容易被接受,也符合人 们的习惯。 (3)在C+中,用户不能定义新的运算符,只能从C++已有的运 算符中选择一个恰当的运算符重载。 (4)C+编译器根据参数的个数和类型来决定调用哪个重载函数。 因此,可以为同一个运算符定义几个运算符重载函数来进行不同 的操作
20 一般而言 采用成员函数重载单目运算符时,可以用以下两种方法来使用: @aa; //隐式调用 aa.operator @(); //显式调用 成员运算符函数operator @所需的一个操作数由对象aa通过this 指针隐含地传递。因此,在它的参数表中没有参数。 说明: (1)运算符重载函数operator @()可以返回任何类型,甚至可 以是void类型但通常返回类型与它所操作的类的类型相同,这样 可以使重载运算符用在复杂的表达式中。例如,在例5.3中,可 以将几个复数连续进行加、减、乘、除的运算。 (2)在重载运算符时,运算符函数所作的操作不一定要保持C++ 中该运算符原有的含义。例如,可以把加运算符重载成减操作, 但这样容易造成混乱。所以保持原含义,容易被接受,也符合人 们的习惯。 (3)在C++中,用户不能定义新的运算符,只能从C++已有的运 算符中选择一个恰当的运算符重载。 (4)C++编译器根据参数的个数和类型来决定调用哪个重载函数。 因此,可以为同一个运算符定义几个运算符重载函数来进行不同 的操作