C++双目运算符重载

时间:2014-11-05 19:39    点击:

双目运算符(或称二元运算符)是C++中最常用的运算符。双目运算符有两个操作数,通常在运算符的左右两侧,如3+5,a=b,i<10等。在重载双目运算符时,不言而喻在函数中应该有两个参数。

[例10.4] 定义一个字符串类String,用来存放不定长的字符串,重载运算符“==”、“<”和“>”,用于两个字符串的等于、小于和大于的比较运算。

为了使读者便于理解程序,同时也使读者了解建立程序的步骤,下面分几步来介绍编程过程:
1) 先建立一个String类:

  1. #include <iostream>
  2. using namespace std;
  3. class String
  4. {
  5. public:
  6. String( ){p=NULL;} //默认构造函数
  7. String(char *str); //构造函数
  8. void display( );
  9. private:
  10. char *p;//字符型指针,用于指向字符串
  11. };
  12.  
  13. String::String(char *str) //定义构造函数
  14. {p=str;} //使p指向实参字符串
  15.  
  16. void String::display( ) //输出p所指向的字符串
  17. {cout<<p;}
  18.  
  19. int main( )
  20. {
  21. String string1("Hello"),string2("Book");
  22. string1.display( );
  23. cout<<endl;
  24. string2.display( );
  25. return 0;
  26. }
运行结果为: Hello Book 2) 有了这个基础后,再增加其他必要的内容。现在增加对运算符重载的部分。为便于编写和调试,先重载一个运算符“>”。程序如下:
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class String
  5. {
  6. public:
  7. String( ){p=NULL;}
  8. String(char *str);
  9. friend bool operator>(String &string1,String &string2);//声明运算符函数为友元函数
  10. void display( );
  11. private:
  12. char *p;//字符型指针,用于指向字符串
  13. };
  14. String::String(char *str)
  15. {p=str;}
  16.  
  17. void String::display( ) //输出p所指向的字符串
  18. {cout<<p;}
  19. bool operator>(String &string1,String &string2)//定义运算符重载函数
  20. {
  21. if(strcmp(string1.p,string2.p)>0)
  22. return true;
  23. else return false;
  24. }
  25.  
  26. int main( )
  27. {
  28. String string1("Hello"),string2("Book");
  29. cout<<(string1>string2)<<endl;
  30. }
程序运行结果为1。 这只是一个并不很完善的程序,但是,已经完成了实质性的工作了,运算符重载成功了。其他两个运算符的重载如法炮制即可。 3) 扩展到对3个运算符重载。 在String类体中声明3个成员函数:     friend bool operator> (String &string1, String &string2);     friend bool operator< (String &string1, String &string2);     friend bool operator==(String &string1, String& string2); 在类外分别定义3个运算符重载函数:
  1. bool operator>(String &string1,String &string2) //对运算符“>”重载
  2. {
  3. if(strcmp(string1.p,string2.p)>0)
  4. return true;
  5. else
  6. return false;
  7. }
  8.  
  9. bool operator<(String &string1,String &string2) //对运算符“<”重载
  10. {
  11. if(strcmp(string1.p,string2.p)<0)
  12. return true;
  13. else
  14. return false;
  15. }
  16.  
  17. bool operator==(String &string1,String &string2) //对运算符“==”重载
  18. {
  19. if(strcmp(string1.p,string2.p)==0)
  20. return true;
  21. else
  22. return false;
  23. }
再修改主函数:
  1. int main( )
  2. {
  3. String string1("Hello"), string2("Book"), string3("Computer");
  4. cout<<(string1>string2)<<endl; //比较结果应该为true
  5. cout<<(string1<string3)<<endl; //比较结果应该为false
  6. cout<<(string1==string2)<<endl; //比较结果应该为false
  7. return 0;
  8. }
运行结果为: 1 0 0 结果显然是对的。到此为止,主要任务基本完成。 4) 再进一步修饰完善,使输出结果更直观。下面给出最后的程序。
  1. #include <iostream>
  2. using namespace std;
  3. class String
  4. {
  5. public:
  6. String( ){p=NULL;}
  7. String(char *str);
  8. friend bool operator>(String &string1, String &string2);
  9. friend bool operator<(String &string1, String &string2);
  10. friend bool operator==(String &string1, String &string2);
  11. void display( );
  12. private:
  13. char *p;
  14. };
  15. String::String(char *str)
  16. {p=str;}
  17.  
  18. void String::display( ) //输出p所指向的字符串
  19. {cout<<p;}
  20.  
  21. bool operator>(String &string1, String &string2)
  22. {
  23. if(strcmp(string1.p, string2.p)>0)
  24. return true;
  25. else
  26. return false;
  27. }
  28.  
  29. bool operator<(String &string1, String &string2)
  30. {
  31. if(strcmp(string1.p, string2.p)<0)
  32. return true;
  33. else
  34. return false;
  35. }
  36.  
  37. bool operator==(String &string1, String &string2)
  38. {
  39. if(strcmp(string1.p, string2.p)==0)
  40. return true;
  41. else
  42. return false;
  43. }
  44.  
  45. void compare(String &string1, String &string2)
  46. {
  47. if(operator>(string1, string2)==1)
  48. {string1.display( );cout<<">";string2.display( );}
  49. else
  50. if(operator<(string1, string2)==1)
  51. {string1.display( );cout<<"<";string2.display( );}
  52. else
  53. if(operator==(string1, string2)==1)
  54. {string1.display( );cout<<"=";string2.display( );}
  55. cout<<endl;
  56. }
  57. int main( )
  58. {
  59. String string1("Hello"), string2("Book"), string3("Computer"), string4("Hello");
  60. compare(string1, string2);
  61. compare(string2, string3);
  62. compare(string1, string4);
  63. return 0;
  64. }
运行结果为: Hello>Book Book<Computer Hello==Hello 增加了一个compare函数,用来对两个字符串进行比较,并输出相应的信息。这样可以减轻主函数的负担,使主函数简明易读。 通过这个例子,不仅可以学习到有关双目运算符重载的知识,而且还可以学习怎样去编写C++程序。由于C ++程序包含类,一般都比较长,有的初学C++的读者见到比较长的程序就发怵,不知该怎样着手去阅读和分析它。轮到自己编程序,更不知道从何入 手,往往未经深思熟虑,想到什么就写什么,一口气把程序写了出来,结果一运行,错 误百出,光为找出错位置就花费了大量的时间。根据许多初学者的经验,上面介绍的方法是很适合没有编程经验的初学者的,能使人以清晰的思路进行程序设计,减 少出错机会, 提高调试效率。  这种方法的指导思想是:先搭框架,逐步扩充,由简到繁,最后完善。边编程,边调试,边扩充。 千万不要企图在一开始时就解决所有的细节。类是可扩充的,可以一步一步地扩充它的功能。最好直接在计算机上写程序,每一步都要上机调试,调试通过了前面一 步再做下一步,步步为营。这样编程和调试的效率是比较高的。大家可以试验一下。

来源:未知//所属分类:基础教程/更新时间:2014-11-05 19:39
顶一下
(0)
0%
踩一下
(0)
0%
上一篇:C++运算符重载函数作为类成员函数和友元函数
下一篇:C++重载流插入运算符和流提取运算符
相关内容