字符串的操作函數

#ifndef _My_String_
#define _My_String_


#include <iostream>


class MyString
{
private:
int size;
char *data;


public:
void print()
{
std::cout<<data<<std::endl;
}


int length()
{
return size;
}


public:
MyString();//默認構造函數
MyString(const char *source);//普通構造函數
MyString(const MyString &s);////普通構造函數
MyString(int n, char c);//普通構造函數
MyString &operator=(char *s);//重載=操作,實現字符串賦值
MyString &operator=(const MyString &s);//重載=操作,實現對象賦值
~MyString();//析構函數
char &operator[](int i);//重載[],實現數組運算
const char &operator[](int i)const;//const
MyString &operator+=(const MyString &s);//實現+=操作符,實現與對象相加
MyString &operator+=(const char *s);//實現+=操作符,實現與字符串相加
friend bool operator<(const MyString &left, const MyString &right); //重載<,比較兩個對象的大小
friend bool operator>(const MyString &left, const MyString &right);

friend std::ostream& operator<<(std::ostream &out, MyString &s);//重載<<操作符,實現輸出流
friend std::istream &operator>>(std::istream &in, MyString &s);////重載>>操作符,實現輸入流




};


#endif



#define _CRT_SECURE_NO_WARNINGS//如果在vs上面運行就加上,在Linux上面就去掉
#include <string.h>
#include "MyString.h"
#include <iostream>
using namespace std;


//默認的普通構造函數,只有一個含有‘\0’的空字符
MyString::MyString()
{
data = new char[1];
*data = '\0';
size = 0;
}


//當source不爲空時,給對象賦值爲source字符串
MyString::MyString(const char *source)
{
if (source == NULL)
{
data = new char[1];
*data = '\0';
size = 0;
}
else
{
size = strlen(source);
data = new char[size+1];
strcpy(data, source);
}
}


//複製構造函數,該對象的內容爲s對象的相同
MyString::MyString(const MyString &s)
{
data = new char[s.size + 1];
strcpy(data, s.data);
size = s.size;
}


//默認的普通構造函數,含有n個相同字符的字符串
MyString::MyString(int n, char c)
{
data = new char[n+1];
size = n;
char *temp = data;
while (n--)
 *temp++ = c;
*temp = '\0';
}


//重載=操作符,s爲目標字符串,該對象的內容與s相同
MyString& MyString::operator=(char *s)
{
if (data != NULL)
 delete [] data;

size = strlen(s);
data = new char[size+1];
strcpy(data, s);


return *this;
}


//重載=操作符,目標爲MyString對象,實現拷貝s對象的內容
MyString& MyString::operator=(const MyString &s)
{
if (this == &s)
 return *this;


if (data != NULL)
 delete [] data;


size = strlen(s.data);
data = new char[size+1];
strcpy(data, s.data);


return *this;
}


//析構函數,釋放內存
MyString::~MyString()
{
if (data != NULL)
{
delete [] data;
data = NULL;
size = 0;
}
}


//重載[]操作符,返回下表爲i的char
char &MyString::operator[](int i)
{
return data[i];
}


//const指針
const char &MyString::operator[](int i)const
{
return data[i];
}


//重載+=操作符,實現對象相加
MyString& MyString::operator+=(const MyString &s)
{
int len = size + s.size +1;
char *temp = data;
data = new char[len];
size = len-1;
strcpy(data, temp);
strcat(data, s.data);
delete [] temp;


return *this;
}


//重載+=操作符,實現對象與s的內容相加
MyString& MyString::operator+=(const char *s)
{
if (s == NULL)
 return *this;
int len = size + strlen(s) + 1;
char *temp = data;
data = new char[len];
size = len-1;
strcpy(data, temp);
strcat(data, s);
delete [] temp;


return *this;
}


//重載<<運算符,實現輸出流,注意,這裏ostream不能是const
ostream &operator<<(ostream &out, MyString &s)
{
for (int i = 0; i < s.length(); i++)
 out<<s[i];


return out;
}


istream &operator>>(istream &in, MyString &s)
{
char p[1024];
in.getline(p, 1024);
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;
}



//主函數

#define _CRT_SECURE_NO_WARNINGS//如果在vs上面運行就加上,在Linux上面就去掉
#include <iostream>
#include "MyString.h"
using namespace std;


int main(int argc, char *argv[])
{
MyString s("hello");
MyString ss(s);
MyString sss(10, 'c');



s = sss;//重載=號操作符

s.print();
ss.print();
sss.print();


char c = s[3];//操作[]操作符
cout<<c<<endl;


s += sss;//操作+=操作符


s.print();


s += "AAAAAAAAAAAAAA";////操作+=操作符
s.print();
 
cout<<s<<endl;
 
cout << "s < ss ? " << (s < ss)<<endl;
 
cout <<"s > sss ? " <<(s > sss)<<endl;




cout<<"input you input string"<<endl;


 
cin >> s;//重載>>運算符 注意---> >>和<<運算符只能是友元函數


cout<<s<<endl;//重載<<運算符  注意---> >>和<<運算符只能是友元函數

cout<<"hello world"<<endl;


system("pause");


return 0;
}






























































發佈了54 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章