C++大学基础教程_11_10_实例研究:String类

来源:互联网 发布:买家怎么进淘宝试衣间 编辑:程序博客网 时间:2024/06/05 15:24
//String.h#ifndef STRING_H_#define STRING_H_#include <iostream>using namespace std;class String{//,将重载运算符<< 和 >> 设为友元函数,二元运算符的重载运算符函数可以作为成员//函数的条件是仅当左操作数是该类所在类的对象时;friend ostream &operator<<(ostream &,const String &);friend istream &operator>>(istream &,String &);public:String(const char * = "");//构造函数,将char型转换成String型String(const String &);//拷贝构造函数~String();const String &operator=(const String &);//两字符串复制函数const String &operator+=(const String &);//两字符串相加const String &operator+=(const char *);//两字符串相加bool operator!();//判断是否为空字符串bool operator==(const String &) const;//判断是否两字符串相等bool operator!=(const String &right) const   //判断两字符串是否不等{return !(*this == right);}bool operator<(const String &) const;bool operator>(const String &right) const //写内联函数的时候忘记写参数,!!!!!{return right < *this;}bool operator<=(const String &right) const{return !(*this > right);}bool operator>=(const String &right) const{return !(*this < right);}char &operator[](int);//重载[],char operator[](int) const;void operator()(int,char) const;//替换某个位置的元素String operator()(int,int = 0) const;//截取两个数字位之间的字符void setString(const char *);//效用函数private:int length;//字符串中字符个数char *sPtr;//指针sPtr,指向代表字符串的额动态内存分配};#endif

//String.cpp#include "String.h"#include <iostream>#include <iomanip>using namespace std;istream &operator>>(istream &input,String &right){char *temp = new char[100];input >> setw(100) >> temp;right = temp;delete [] temp;return input;}ostream &operator<<(ostream &output,const String &right){int i;for(i=0;i<right.length;i++)  //ouput << right.sPtr;output << right.sPtr[i];return output;}void String::setString(const char *string){sPtr = new char[strlen(string)+1];//把这一句写成[strlen(string+1)]                                                  //我是得有多有才!!!if(string!=0){for(int i=0;i<strlen(string);i++)sPtr[i] = string[i];        sPtr[strlen(string)] = '\0';}    /* if(string!=0) strcpy(sPtr,string); */elsesPtr = '\0';}String::String(const char *right):length((right!=0)? strlen(right) : 0) //构造器{cout << "Conversion (and default) constructor: " << right << endl;setString(right);}String::String(const String &s)//拷贝构造函数:length(s.length){cout << "Copy constructor: " << s.sPtr << endl;    setString(s.sPtr);}String::~String(){cout << "Destructor: " << sPtr << endl;delete [] sPtr;}//两字符串复制函数const String &String::operator=(const String &right){cout << "operator= called." << endl;if(&right != this)//if(sPtr != right.sPtr)//防止同一字符串自我复制{delete [] sPtr;length = right.length;/*sPtr = new char[right.length];for(int i=0;i<length;i++)sPtr[i] = right.sPtr[i];*/setString(right.sPtr);}else cout << "Attempted assignment of a string to itself." << endl;return *this;}const String &String::operator+=(const String &right)//两字符串相加{size_t newLength= length + right.length;char *temp = new char[newLength+1];for(int i=0;i<length;i++)  //strcpy(temp,sPtr);temp[i] = this->sPtr[i];strcpy(temp+length,right.sPtr);delete [] sPtr;sPtr = temp;length = newLength;return *this;}const String &String::operator+=(const char *s)//两字符串相加{if(s != 0){size_t newLength = length + strlen(s);    char *temp = new char[newLength+1];strcpy(temp,sPtr);for(int i=length;i<newLength;i++)temp[i] = s[i-length];temp[newLength] = '\0';delete [] sPtr;sPtr = temp;length = newLength;}return *this;}bool String::operator!()//判断是否为空字符串{ //(length == 0)? true: false;if(length == 0)return true;return false;}bool String::operator==(const String &right) const//判断是否两字符串相等{if(length == right.length){for(int i=0;i<length;i++)if(sPtr[i] != right.sPtr[i])return false;    return true;}return false;}//比较两个字符串如abbbbbbb<abbb   false//                            askjdh<hj       true//若两者头部有相同的部分,则比较不同的部分如a<hbool String::operator<(const String &right) const{if(length < right.length){//先判断两个字符串有没有不相同的for(int i=0;i<length;i++){if(sPtr[i] != right.sPtr[i]){if(sPtr[i] < right.sPtr[i])return true;  // abb<abccc ? true   return false;//abb<abac ? false}}    return true;//abb<abbkajsfh ? true}else if(length == right.length){for(int i=0;i<length;i++){if(sPtr[i] != right.sPtr[i]){if(sPtr[i] < right.sPtr[i])return true;  //abbbb<abcdc ? truereturn false; //abbbb<ababb ? false}}return false; //abbbb<abbbb ? false}else  //length > right.length{for(int i=0;i<right.length;i++){if(sPtr[i] != right.sPtr[i]){if(sPtr[i] < right.sPtr[i])return true; //abbbb<abd ? truereturn false; //abbbb<aba ? false}}return false;// abbbb<ab ? false}//end else}//end operator< functionchar &String::operator[](int number)//重载[],{if(number<0 || number>=length){cout << "Error: number " << number << "out of range." << endl;exit(1);}return sPtr[number];}char String::operator[](int number) const{if(number<0 || number>=length){cout << "Error: number " << number << "out of range." << endl;exit(1);}return sPtr[number];}String String::operator()(int index,int subLength) const//截取两个数字位之间的字符{int len;if(index<0 || subLength<0 || index>subLength)return "";else if(index>=0 && subLength<=length)len = subLength;else if(index>=0 && subLength>length)len = length-index;char *tempPtr = new char[len+1];strncpy(tempPtr,&sPtr[index],len);tempPtr[len] = '\0';String tempString(tempPtr);delete [] tempPtr;return tempString;//写成return temPtr运行的时候会出现乱码}void String::operator()(int number,char s) const//替换某个位置的元素{this->sPtr[number] = s;}<pre name="code" class="cpp">//_11_10_main.cpp#include "String.h"#include <iostream>using namespace std;int main(){{//这一对大括号是为了把析构函数的调用弄出来加上去的,可以去掉String str1("happy");String str2(" birthday");String str3;cout << "str1 is \"" << str1 << "\"; str2 is \""                          << str2 << "\"; str3 is \"" << str3 << "\"\n";cout << boolalpha << "The results of comparing str2 and str1:"   << "\nstr2 == str1 yields " << (str2==str1)   << "\nstr2 ! = str1 yields " << (str2!=str1)   << "\nstr2  >  str1 yields " << (str2>str1)   << "\nstr2  <  str1 yields " << (str2<str1)   << "\nstr2 >= str1 yields " << (str2>=str1)   << "\nstr2 <= str1 yields " << (str2<=str1)   << endl;cout << "Testing !str3:" << endl;if(!str3){cout << "str3 is empty;assigning str1 to str3;" << endl;str3 = str1;cout << "str3 is \"" << str3 << "\"\n";}cout << "str1 += str2 yields " << endl;str1 += str2;cout << "str1 = " << str1 << endl;cout << "str1 += \" to you \" yields" << endl;str1 += " to you";cout << "str1 = " << str1 << endl;cout << "The substring of str1 starting at \n"   << "location 0 for 14 characters,str1(0,14), is:\n"   << str1(0,14) << endl;//对应的函数部分有错误提示cout << "The substring of str1 starting at \n"   << "location 15,str1(3,15), is:\n"   << str1(3,15) << endl;String *sPtr0 = new String(str1);cout << "*sPtr0 = " << *sPtr0 << endl;cout << "assigning *sPtr0 to *sPtr0" << endl;*sPtr0 = *sPtr0;cout << "*sPtr0 = " << *sPtr0 << endl;*sPtr0 = str2;//注意咯!!!!!cout << "*sPtr0 = " << *sPtr0 << endl;delete sPtr0;//写成这样就会错误,delete [] sPtr0;因为这是一个指向对象的指针啊啊啊str1(0,'H');str1(6,'B');cout << "str1 after atr1[0] = 'H' and str[6] = 'B' is:\n"   << str1 << endl;}system("pause >> cout");return 0;}


0 0
原创粉丝点击