#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;
}