接3例5.3 void complex printo ∥显示复数的实数部分和虚数部 i cout<<real if(imago)cout<<+, if(imag=O)cout<<imag<< in void maino i complex A1(2346),A2(3628),A3,A4,A5,A6;∥定义六个复 数类对象 A3=A1+A2;∥复数相加 A4=A1A2;∥复数相减 程序运行结果如下: A5=A1A2;∥复数相乘 2.3+4.6i A6=A1/A2. ∥复)数相除 3.6+28i A1. printo ∥输出复数A1 5.9+7.4i A2. print(; ∥输出复数A2 A3 printo ∥输出复数相加的结見 1.3+1.8i -4.6+23i A4. print ∥输出复数相减的结 A5. printo ∥输出复数相乘的结果 1.017308+0.486538i 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=A1/A2 所用的运算符“+”、“-”、“*”、“/是重载后的运算符。程序 执行到这四条语句时C++将其解释为: A3=A1. operator +(A2); A4=Al. operator-(A2 A5=A1. operator (A2) A6=A1. operator /(A2) 由此我们可以看出,成员运算符函数 operator@实际上是由双目 运算符左边的对象A1调用的,尽管双目运算符函数的参数表只 有一个操作数A2,但另一个操作数是由对象A1通过this指针隐 含地传递的。以上两组语句的执行结果是完全相同的。一般而言 采用成员函数重载双目运算符@后,可以用以下两种方法来使用 aa@ bb ∥隐式调用 aa operator@(bb);∥显式调用 指针隐含地传递。因此,它的参数表中只有一个操作数bbos 成员运算符函数 operator@所需的一个操作数由对象a通过th
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 coordi int x,y public coord(int i=O,int j=O) void print(; coord operator++0;∥声明成员运算符函数 operator++() coord: coord(int i, int j) x=i;y=j:] void coord: printo icout< X: <<X<< y: <<y<<end; coord coord: operator++0)∥定义成员运算符函数 operator++() {+tx; y return *this. 18
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 ++ob ∥隐式调用成员运算符函数 operator++() ob. printo ob operator++(;∥显式调用成员运算符函数 operator++() ob. printo 程序运行结果如下: x:10,y:20 X 11,y:21 x;12,y=22 本例主函数man()中调用成员运算符函数 operator++()采用 了两种方法:++ob;与ob. perator++() 两者是等价的,其执行效果是完全相同的。 从本例还可以看出,当成员函数重载单目运算符时,没有参数被显 式地传递给成员运算符函数。参数是通过ths指针隐含地传递给 函数的。 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;W隐式调用 aa operator@0;∥显式调用 成员运算符函数 operator@所需的一个操作数由对象aa通过this 指针隐含地传递。因此,在它的参数表中没有参数。 说明: (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++编译器根据参数的个数和类型来决定调用哪个重载函数。 因此,可以为同一个运算符定义几个运算符重载函数来进行不同 的操作