第八天2017/04/17(2、❤String类的源代码)
生活随笔
收集整理的這篇文章主要介紹了
第八天2017/04/17(2、❤String类的源代码)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
改進版本:1.對operator+運算符進行了重新定義:修復了執行完s1+s2后,會把s1修改的bug---返回String2.對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;elsereturn false;
}
bool operator>(const String& s1,const String& s2)
{if(strcmp(s1.data,s2.data)>0)return true;elsereturn false;
}
bool operator==(const String& s1,const String& s2)
{if(strcmp(s1.data,s2.data)==0)return true;elsereturn false;
}
bool operator!=(const String& s1,const String& s2)
{if(strcmp(s1.data,s2.data)!=0)return true;elsereturn 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");
//連加操作:返回值是Stringcout<<"測試連加操作:"<<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;
}
總結
以上是生活随笔為你收集整理的第八天2017/04/17(2、❤String类的源代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第八天2017/04/17(1、拷贝构造
- 下一篇: 第八天2017/04/17(3、C++的