用C++实现一个String类,它具有比较,连接,输入,输出功能,并且提供一些测试实例说明如何使用这个类。注意不要使用MFC,STL以及其他库。
解析:
要实现这些功能,需要重载的运算符:
1 < >,==和 != 比较运算符。
2 +=连接运算符以及赋值运算符。
3 输出,输入运算符。
mystring.h 文件
- #ifndef STRING_H
- #define STRING_H
- #include <ostream>
- #include <istream>
- using namespace std;
- class mystring{
- public:
- mystring();//默认构造函数
- mystring(int n,char c);//普通构造函数
- mystring(const char* source); //普通构造函数
- mystring(const mystring &s); //复制构造函数
- mystring& operator =(const mystring &s); //重载"="实现对象赋值
- mystring& operator =(const char *s);//重载"="实现字符串赋值
- ~mystring();//析构函数
- char & operator [](int i);//重载[],实现数组运算
- const char & operator [](int i) const;//重载[],实现数组运算(对象为常量)
- mystring & operator +=(const mystring & s);//重载+=,实现与对象相加
- mystring & operator +=(const char *s);//重载+=,实现与字符串相加
- friend ostream& operator <<(ostream &out,mystring &s);//重载<<,实现输出流
- friend istream& operator >>(istream &in,mystring &s);//重载>>,实现输入流
- friend bool operator <(const mystring &left,const mystring &right);//重载<
- friend bool operator >(const mystring &left,const mystring &right);//重载>
- friend bool operator ==(const mystring &left,const mystring &right);//重载==
- friend bool operator !=(const mystring &left,const mystring &right);//重载!=
- const char *getdata() const;//获取data指针
- int getlength() const;//
- protected:
- private:
- int size;//data表示的字符串长度
- char *data;//指向字符串数据
- };
- #endif
mystring.cpp文件
- // 运算符重载.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include "mystring.h"
- #include <iostream>
- using namespace std;
- mystring::mystring(){
- data=new char[1];//空字符只含有'\0'一个元素
- *data='\0';
- size=0;
- }
- mystring::mystring(int n, char c){
- data=new char[n+1]; //含有n个相同字符的字符串
- for (int i=0;i<n;i++)
- {
- data[i]=c;
- }
- data[n]='\0';
- size=n;
- }
- mystring::mystring(const char *source){//字符串内容与source相同
- if (source==NULL) //source为NULL
- {
- data=new char [1];
- *data='\0';
- size=0;
- }
- else{ //source内容不为NULL
- data=new char[strlen(source)+1];
- strcpy(data,source);//复制source字符串
- size=strlen(source);
- }
- }
- mystring::mystring(const mystring &s){//复制构造函数,字符串内容与对象s的相同
- data=new char[s.size+1];
- strcpy(data,s.data);
- size=s.size;
- }
- mystring& mystring::operator =(const mystring &s){ //赋值函数
- if (this==&s)//如果对象s就是自己,直接返回
- {
- return *this;
- }
- if (data!=NULL)//释放data堆内存
- {
- delete [] data;
- }
- data =new char[s.size+1];//分配堆内存
- strcpy(data,s.data);//复制对象s的字符串成员
- return *this;
- }
- mystring& mystring::operator =(const char *s){//=重载
- if (data!=NULL)
- {
- delete [] data;
- }
- size=strlen(s);
- data =new char[size+1];
- strcpy(data,s);
- return *this;
- }
- mystring::~mystring(){
- if (data!=NULL) //data不为NULL,释放堆内存
- {
- delete [] data;
- data=NULL;
- size=0;
- }
- }
- char & mystring::operator [](int i){ //[]重载
- return data[i];//取数组下标为i的字符元素
- }
- const char & mystring::operator [](int i) const{
- return data[i];
- }
- mystring & mystring::operator +=(const mystring &s){ //+=重载 连接对象s的字符串成员
- char *temp=data;
- size=s.size+size;
- data =new char[size+1];
- strcpy(data,temp);//复制原来的字符串
- strcat(data,s.data);//连接目标对象内的字符串成员
- delete [] temp;
- return *this;
- }
- mystring & mystring::operator +=(const char *s){//+=重载 连接s字符串
- if (s==NULL)//如果字符串s为NULL,直接返回
- {
- return *this;
- }
- size=strlen(s)+size;
- char *temp=data;
- data =new char[size+1];
- strcpy(data,temp);//复制原来的字符串
- strcat(data,s); //连接目标字符串
- delete [] temp;
- return *this;
- }
- ostream& operator <<(ostream &out,mystring &s){ //重载<<
- out<<s.getdata()<<endl;
- return out;
- }
- istream & operator >>(istream &in,mystring &s){ //重载>>
- char p[50];
- in.getline(p,50);//从输入流接受最多50个字符
- s=p;//调用赋值函数
- return in;
- }
- bool operator <(const mystring &left,const mystring &right){ //重载<
- int i=0;
- while (left[i]==right[i] && left[i]!='\0' && right[i]!='\0'){
- i++;
- }
- return left[i]-right[i]<0?true:false;
- }
- bool operator >(const mystring &left,const mystring &right){ //重载>
- int i=0;
- while (left[i]==right[i] && left[i]!='\0' && right[i]!='\0')
- {
- i++;
- }
- return left[i]-right[i]>0?true:false;
- }
- bool operator ==(const mystring &left,const mystring &right){
- int i=0;
- while (left[i]==right[i] && left[i]!='\0' && right[i]!='\0')
- {
- i++;
- }
- return left[i]==right[i]?true:false;
- }
- bool operator !=(const mystring &left,const mystring &right){
- int i=0;
- while (left[i]==right[i] && left[i]!='\0' && right[i]!='\0')
- {
- i++;
- }
- return left[i]-right[i]!=0?true:false;
- }
- const char * mystring::getdata() const{
- return data;
- }
- int mystring::getlength() const{//字符串长度
- return size;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- mystring str(3,'a'); //普通构造函数测试
- mystring str1(str); //复制构造函数测试
- mystring str2("asdf"); //普通构造函数测试
- mystring str3; //默认构造函数测试
- cout<<"str:"<<str<<endl;
- cout<<"str1:"<<str1<<endl;
- cout<<"str2:"<<str2<<endl;
- cout<<"str3:"<<str3<<endl;
- str3 =str2;//赋值函数测试
- cout<<"str3:"<<str3<<endl;
- str3="12ab";//赋值函数测试
- cout<<"str3:"<<str3<<endl;
- cout<<"str3[2]:"<<str3[2]<<endl; //[]重载函数测试
- str3+="111"; //+=重载函数测试
- cout<<"str3:"<<str3<<endl;
- str3+=str1;//+=重载函数测试
- cout<<"str3:"<<str3<<endl;
- cin>>str1; //>>重载函数测试
- cout<<"str1:"<<str1<<endl;
- mystring t1="1234";
- mystring t2="1234";
- mystring t3="12345";
- mystring t4="12335";
- cout<<"t1==t2?"<<(t1==t2)<<endl; //==重载函数测试
- cout<<"t1<t3?"<<(t1<t3)<<endl;//<重载函数测试
- cout<<"t1>t4?"<<(t1>t4)<<endl; //>重载函数测试
- cout<<"t1!=t4?"<<(t1!=t4)<<endl;//!=重载函数测试
- getchar();
- return 0;
- }