点击这里给我发消息 点击这里给我发消息

C++双目运算符重载

添加时间:2013-12-7
    相关阅读: 程序 框架 C++
 

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

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

先建立一个String类:
#include <iostream>
using namespace std;
class String
{
   public:
   String( ){p=NULL;}  //默认构造函数
   String(char *str); //构造函数
   void display( );
   private:
   char *p;//字符型指针,用于指向字符串
};

String∷String(char *str)  //定义构造函数
{p=str;} //使p指向实参字符串

void String∷display( )  //输出p所指向的字符串
{cout<<p;}

int main( )
{
   String string1(″Hello″),string2(″Book″);
   string1.display( );
   cout<<endl;
   string2.display( );
   return 0;
}
运行结果为
Hello
Book
 

有了这个基础后,再增加其他必要的内容?现在增加对运算符重载的部分?为便于编写和调试,先重载一个运算符“>”?程序如下:
#include <iostream>
#include <string>
using namespace std;
class String
{
   public:
   String( ){p=NULL;}
   String(char *str);
   friend bool operator>(String &string1,String &string2);//声明运算符函数为友元函数
   void display( );
   private:
   char *p;//字符型指针,用于指向字符串
};
String∷String(char *str)
{p=str;}

void String∷display( )  //输出p所指向的字符串
{cout<<p;}
bool operator>(String &string1,String &string2)//定义运算符重载函数
{
   if(strcmp(string1.p,string2.p)>0)
      return true;
   else return false;
}

int main( )
{
   String string1(″Hello″),string2(″Book″);
   cout<<(string1>string2)<<endl;
}
程序运行结果为1?
这只是一个并不很完善的程序,但是,已经完成了实质性的工作了,运算符重载成功了?其他两个运算符的重载如法炮制即可?

扩展到对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个运算符重载函数:
bool operator>(String &string1,String &string2) //对运算符“>”重载
{
   if(strcmp(string1.p,string2.p)>0)
      return true;
   else
      return false;
}

bool operator<(String &string1,String &string2) //对运算符“<”重载
{
   if(strcmp(string1.p,string2.p)<0)
      return true;
   else
      return false;
}

bool operator==(String &string1,String &string2) //对运算符“==”重载
{
   if(strcmp(string1.p,string2.p)==0)
      return true;
   else
      return false;
}
再修改主函数:
int main( )
{
   String string1(″Hello″),string2(″Book″),string3(″Computer″);
   cout<<(string1>string2)<<endl;//比较结果应该为true
   cout<<(string1<string3)<<endl;//比较结果应该为false
   cout<<(string1==string2)<<endl;  //比较结果应该为false
   return 0;
}
运行结果为
1
0
0
结果显然是对的?到此为止,主要任务基本完成?

再进一步修饰完善,使输出结果更直观?下面给出最后的程序?
#include <iostream>
using namespace std;
class String
{
   public:
   String( ){p=NULL;}
   String(char *str);
   friend bool operator>(String &string1,String &string2);
   friend bool operator<(String &string1,String &string2);
   friend bool operator==(String &string1,String &string2);
   void display( );
   private:
   char *p;
};
String∷String(char *str)
{p=str;}

void String∷display( )  //输出p所指向的字符串
{cout<<p;}

bool operator>(String &string1,String &string2)
{
   if(strcmp(string1.p,string2.p)>0)
      return true;
   else
      return false;
}

bool operator<(String &string1,String &string2)
{
   if(strcmp(string1.p,string2.p)<0)
      return true;
   else
      return false;
}

bool operator==(String &string1,String &string2)
{
   if(strcmp(string1.p,string2.p)==0)
      return true;
   else
      return false;
}

void compare(String &string1,String &string2)
{
   if(operator>(string1,string2)==1)
      {string1.display( );cout<<″>″;string2.display( );}
   else
      if(operator<(string1,string2)==1)
         {string1.display( );cout<<″<″;string2.display( );}
      else
         if(operator==(string1,string2)==1)
            {string1.display( );cout<<″=″;string2.display( );}
   cout<<endl;
}
int main( )
{
   String string1(″Hello″),string2(″Book″),string3(″Computer″),string4(″Hello″);
   compare(string1,string2);
   compare(string2,string3);
   compare(string1,string4);
   return 0;
}
运行结果为
Hello>Book
Book<Computer
Hello==Hello

增加了一个compare函数,用来对两个字符串进行比较,并输出相应的信息?这样可以减轻主函数的负担,使主函数简明易读?通过这个例子,不仅可以学习到有关双目运算符重载的知识,而且还可以学习怎样去编写C++程序?

这种方法的指导思想是: 先搭框架,逐步扩充,由简到繁,最后完善?边编程,边调试,边扩充?千万不要企图在一开始时就解决所有的细节?类是可扩充的,可以一步一步地扩充它的功能?最好直接在计算机上写程序,每一步都要上机调试,调试通过了前面一步再做下一步,步步为营?这样编程和调试的效率是比较高的?读者可以试验一下?


单目运算符只有一个操作数,如!a,-b,&c,*p,还有最常用的++i和--i等?重载单目运算符的方法与重载双目运算符的方法是类似的?但由于单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数,则还可省略此参数?

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册