1. 程式人生 > >c++ string 函式的過載

c++ string 函式的過載

用C++實現一個String類,它具有比較,連線,輸入,輸出功能,並且提供一些測試例項說明如何使用這個類。注意不要使用MFC,STL以及其他庫。

解析:

要實現這些功能,需要過載的運算子:

1 < >,==和 != 比較運算子。

2 +=連線運算子以及賦值運算子。

3 輸出,輸入運算子。

mystring.h  檔案

  1. #ifndef STRING_H
  2. #define STRING_H
  3. #include <ostream>
  4. #include <istream>
  5. usingnamespace std;  
  6. class mystring{  
  7. public:  
  8.     mystring();//預設建構函式
  9.     mystring(int n,char c);//普通建構函式
  10.     mystring(constchar* source); //普通建構函式
  11.     mystring(const mystring &s); //複製建構函式
  12.     mystring& operator =(const mystring &s); //過載"="實現物件賦值
  13.     mystring& operator =(constchar *s);//過載"="實現字串賦值
  14.     ~mystring();//解構函式
  15.     char
     & operator [](int i);//過載[],實現陣列運算
  16.     constchar & operator [](int i) const;//過載[],實現陣列運算(物件為常量)
  17.     mystring & operator +=(const mystring & s);//過載+=,實現與物件相加
  18.     mystring & operator +=(constchar *s);//過載+=,實現與字串相加
  19.     friend ostream& operator <<(ostream &out,mystring &s);
    //過載<<,實現輸出流
  20.     friend istream& operator >>(istream &in,mystring &s);//過載>>,實現輸入流
  21.     friendbool operator <(const mystring &left,const mystring &right);//過載<
  22.     friendbool operator >(const mystring &left,const mystring &right);//過載>
  23.     friendbool operator ==(const mystring &left,const mystring &right);//過載==
  24.     friendbool operator !=(const mystring &left,const mystring &right);//過載!=
  25.     constchar *getdata() const;//獲取data指標
  26.     int getlength() const;//
  27. protected:  
  28. private:  
  29.     int size;//data表示的字串長度
  30.     char *data;//指向字串資料
  31. };  
  32. #endif

mystring.cpp檔案

  1. // 運算子過載.cpp : 定義控制檯應用程式的入口點。
  2. //
  3. #include "stdafx.h"
  4. #include "mystring.h"
  5. #include <iostream>
  6. usingnamespace std;  
  7. mystring::mystring(){  
  8.     data=newchar[1];//空字元只含有'\0'一個元素
  9.     *data='\0';  
  10.     size=0;  
  11. }  
  12. mystring::mystring(int n, char c){  
  13.     data=newchar[n+1]; //含有n個相同字元的字串
  14.     for (int i=0;i<n;i++)  
  15.     {  
  16.         data[i]=c;  
  17.     }  
  18.     data[n]='\0';  
  19.     size=n;  
  20. }  
  21. mystring::mystring(constchar *source){//字串內容與source相同
  22.     if (source==NULL) //source為NULL
  23.     {  
  24.         data=newchar [1];  
  25.         *data='\0';  
  26.         size=0;  
  27.     }  
  28.     else//source內容不為NULL
  29.     data=newchar[strlen(source)+1];  
  30.     strcpy(data,source);//複製source字串
  31.     size=strlen(source);  
  32.     }  
  33. }  
  34. mystring::mystring(const mystring &s){//複製建構函式,字串內容與物件s的相同
  35.     data=newchar[s.size+1];  
  36.     strcpy(data,s.data);  
  37.     size=s.size;  
  38. }  
  39. mystring& mystring::operator =(const mystring &s){ //賦值函式
  40.     if (this==&s)//如果物件s就是自己,直接返回
  41.     {  
  42.         return *this;  
  43.     }  
  44.     if (data!=NULL)//釋放data堆記憶體
  45.     {  
  46.         delete [] data;  
  47.     }  
  48.     data =newchar[s.size+1];//分配堆記憶體
  49.     strcpy(data,s.data);//複製物件s的字串成員
  50.     return *this;  
  51. }  
  52. mystring& mystring::operator =(constchar *s){//=過載
  53.     if (data!=NULL)  
  54.     {  
  55.         delete [] data;  
  56.     }  
  57.     size=strlen(s);  
  58.     data =newchar[size+1];  
  59.     strcpy(data,s);  
  60.     return *this;  
  61. }  
  62. mystring::~mystring(){  
  63.     if (data!=NULL) //data不為NULL,釋放堆記憶體
  64.     {  
  65.         delete [] data;  
  66.         data=NULL;  
  67.         size=0;