第八天2017/04/17(2、❤String类的源代码)

来源:互联网 发布:c语言有什么用途 编辑:程序博客网 时间:2024/06/05 18:16
改进版本:    1.operator+运算符进行了重新定义:修复了执行完s1+s2后,会把s1修改的bug---返回String    2.operator+=运算符进行了重新定义:资源利用 -->operator+ ---返回String&    3.连等操作 a=b=c; ---返回引用String&    4.[]、<<、>> ---返回值作左值,返回引用&【注解】    为什么operator+返回String,而operator+=返回String&?答:根据用户的需求---> 因为operator+=执行完后,左值被修改,而operator+执行完后,左值不能被修改。
//String.h#ifndef _STRING_H_#define _STRING_H_#include <iostream>using namespace std;class String{public://构造函数    String();    String(int n,char c);    String(const char *source);//析构函数    ~String();//拷贝构造函数    String(const String& s);//-------------------------------------------------------------------//重载 =  :返回的是String&,“连等a=b=c”    String& operator=(char *s);    String& operator=(const String& s);//-------------------------------------------------------------------//重载 +  :返回的是String (s=s1+s2;因为如果用String&,会使在执行完+后,s1的值也发生变化)    //friend String operator+(const String& s1,const String& s2);    String operator+(const String& s);      //friend String operator+(const String& s,const char* str);    String operator+(const char* s);  //重载 += :返回的是String&    //friend String& operator+=(String& s1, const String& s2);      String& operator+=(const String& s);    //friend String& operator+=(String& s,const char* str);    String& operator+=(const char* str);//-------------------------------------------------------------------//重载 [] :返回的是char&    char& operator[](int i);    const char& operator[](int i) const;//重载 <<  >> :返回的是ostream&    friend ostream& operator<<(ostream &out,String &s);    friend istream& operator>>(istream &in ,String &s);//-------------------------------------------------------------------//friend函数:重载> < == !=     friend bool operator<(const String& s1,const String& s2);    friend bool operator>(const String& s1,const String& s2);    friend bool operator==(const String& s1,const String& s2);    friend bool operator!=(const String& s1,const String& s2);//属性    int lenght();    char* get_data();private:    int size;  //除了'\0'字符外的字符个数    char *data;};#endif =====================================================================================//String.cpp#include "String.h"//构造函数String::String()  //即使是空字符串,也要进行分配内存空间,因为空字符串有一个字符'\0'{    size = 0;      data = new char[1];    *data = '\0';  //空字符串只有一个元素 '\0'}String::String(int n,char c) //创建一个字符串:由n个c和一个'\0'组成{    size = n;    data = new char[n+1]; //分配n+1个空间    char *ch = data; //用ch指针对data中的每一个字符赋值    while(n>0) //n个c    {        *ch = c;        ch++;        n--;    }    *ch = '\0';  }String::String(const char *source){    if(source == NULL)  //如果source是NULL    {        size = 0;        data = new char[1];        *data = '\0';    }    size = strlen(source);    data = new char[size+1];    strcpy(data,source);}//析构函数String::~String(){    if(data != NULL)    {        delete []data;        data = NULL;        size = 0;    }}//拷贝构造函数String::String(const String& s) {    size = s.size;    data = new char[size+1];    strcpy(data,s.data);    }//重载 = :返回值是String&String& String::operator=(char *s){    if(data != NULL)    {        delete []data;    }    size = strlen(s);    data = new char[size+1];    strcpy(data,s);    return *this;}//重载 = :返回值是String&String& String::operator=(const String& s){    if(this == &s)        return *this;    if(data != NULL)        delete []data;    size = s.size;    data = new char[size+1];    strcpy(data,s.data);    return *this;}//=============================================================================//重载 + :返回值是String,返回的应该是一个临时对象//下面四种case分别从友元函数、成员函数角度去实现operator+函数//case1://String operator+(const String& s1,const String& s2) //友元函数//{//  String tmp; //创建一个临时变量//  tmp.size = strlen(s1.data)+strlen(s2.data);//  tmp.data = new char[tmp.size+1];//  strcpy(tmp.data,s1.data);//  strcat(tmp.data,s2.data);//  return tmp; //返回临时对象,返回类型是String//}String String::operator+(const String& s) //成员函数{    String tmp;//创建一个临时变量    tmp.size = size+s.size;    tmp.data = new char[tmp.size+1];    strcpy(tmp.data,data);    strcat(tmp.data,s.data);    return tmp;}//case2://String operator+(const String& s,const char* str) //友元函数//{//  String tmp;//  tmp.size = s.size+strlen(str);//  tmp.data = new char[tmp.size+1];//  strcpy(tmp.data,s.data);//  strcat(tmp.data,str);//  return tmp;//}String String::operator+(const char* s)  //成员函数{    String tmp;    tmp.size = size+strlen(s);    tmp.data = new char[tmp.size+1];    strcpy(tmp.data,data);    strcat(tmp.data,s);    return tmp;}//重载 += :返回值是String//case1://String& operator+=(String& s1, const String& s2)   //友元函数//{//  //s1.size = s1.size+s2.size;//  //char *tmp = new char[s1.size+1];//  //strcpy(tmp,s1.data);//  //if(s1.data!=NULL)//  //  delete []s1.data;//  //strcat(tmp,s2.data);//  //s1.data = tmp;//  //return s1;//////调用上面已经实现的的operator+//  s1 = s1+s2;//  return s1;//}String& String::operator+=(const String& s) //成员函数{    size = size+s.size;    char *tmp = new char[size+1];    strcpy(tmp,data);    if(data!=NULL)        delete []data;    strcat(tmp,s.data);    data = tmp;    return *this;////调用上面已经实现的的operator+    //*this = *this+s;      //return *this;}//case2://String& operator+=(String& s,const char* str) //友元函数//{////调用上面已经实现的的operator+//  s = s+str;//  return s;//}String& String::operator+=(const char* str) //成员函数{    size = size+strlen(str);    char *tmp = new char[size+1];    strcpy(tmp,data);    if(data!=NULL)        delete []data;    strcat(tmp,str);    data = tmp;    return *this;////调用上面已经实现的的operator+//  *this = *this+str;   //  return *this;}//=============================================================================//重载 []char& String::operator[](int i) //传入的是下标,返回的是字符的引用{    return data[i];}const char& String::operator[](int i) const{    return data[i];}//重载 <<  >>ostream& operator<<(ostream &out,String &s){    out<<s.data;    return out;}istream& operator>>(istream &in ,String &s){    in>>s.data;    return in;}//friend函数:重载> < == !=bool operator<(const String& s1,const String& s2){    if(strcmp(s1.data,s2.data)<0)        return true;    else        return false;}bool operator>(const String& s1,const String& s2){    if(strcmp(s1.data,s2.data)>0)        return true;    else        return false;}bool operator==(const String& s1,const String& s2){    if(strcmp(s1.data,s2.data)==0)        return true;    else        return false;}bool operator!=(const String& s1,const String& s2){    if(strcmp(s1.data,s2.data)!=0)        return true;    else        return false;}//属性int String::lenght(){    return size;}char* String::get_data(){    return data;}=====================================================================================//test.cpp#include "String.h"int main(){    String s1("AAA");    String s2("BBB");//连加操作:返回值是String    cout<<"测试连加操作:"<<endl;    String s3 = s1+s2+"CCC";      cout<<"s1="<<s1<<",s2="<<s2<<",s3="<<s3<<endl;//+=    cout<<"测试+=操作:"<<endl;    s1 += s2;    cout<<"s1 += s2的结果:"<<"s1="<<s1<<",s2="<<s2<<endl;    s1 += "QQQ";    cout<<"s1 += QQQ 的结果:"<<"s1="<<s1<<endl;//连等操作:返回值是String&    cout<<"测试连等操作:"<<endl;    String s4 = s1 = s3 = s2 ;    cout<<"s1="<<s1<<",s2="<<s2<<",s3="<<s3<<",s4="<<s4<<endl;}
1 0
原创粉丝点击