#include <iostream>
#include <cstring>
using namespace std;
class myString
{
private:
char *str; //记录c风格的字符串
int size; //记录字符串的实际长度
public:
//无参构造
myString():size(16)
{
str = new char[size];
strcpy(str,"");
}
//有参构造
myString(const char *s)
{
size = strlen(s);
str = new char[size+1];
strcpy(str, s);
}
//拷贝构造
myString(myString &other)
{
size = strlen(other.str);
str = new char[size+1];
strcpy(str,other.str);
}
//析构函数
~myString()
{
delete []str;
str = NULL;
cout<<"析构函数"<<endl;
}
//判空函数
bool empty()
{
if(0 == strlen(str))
{
return true;
}
else
{
return false;
}
}
//size函数
int size_t()//size和上面第10行size冲突了,这里是省事
{
return size;
}
//c_str函数
char* c_str()
{
return str;
}
//at函数
char &at(int pos)
{
if(pos <= size){
return str[pos];
}else{
cout<<"异常"<<endl;
}
}
//成员函数版版实现=
myString & operator=( const myString &R )
{
this->size = R.size;
new char[this->size+1];
strcpy(this->str , R.str);
return *this;
}
//重载[]
char &operator[](int pos)
{
if(pos <= size){
return str[pos];
}else{
cout<<"异常"<<endl;
}
}
//重载+
const myString operator+( const myString &R ) const
{
myString temp;
temp.size = this->size+R.size;
temp.str = new char[temp.size+1];
strcat(temp.str , this->str);
strcat(temp.str , R.str);
return temp;
}
//重载==
bool operator==( const myString &R ) const
{
if(0 == strcmp(this->str , R.str))
return true;
return false;
}
//重载>
bool operator>( const myString &R ) const
{
if(0 > strcmp(R.str,this->str))
return true;
return false;
}
//重载<
bool operator<( const myString &R ) const
{
if(0 < strcmp(R.str,this->str))
return true;
return false;
}
//重载>=
bool operator>=( const myString &R ) const
{
if(0 >= strcmp(R.str,this->str))
return true;
return false;
}
//重载<=
bool operator<=( const myString &R ) const
{
if(0 <= strcmp(R.str,this->str))
return true;
return false;
}
//将全局函数设置成友元函数
friend ostream &operator<< (ostream &L,const myString &O);
friend istream &operator>> (istream &L, myString &O);
void show()
{
cout << str << endl;
}
};
//全局函数版实现<<重载
ostream &operator<< (ostream &L,const myString &O)
{
L << O.str;
return L;
}
//全局函数版实现>>重载
istream &operator>> (istream &L, myString &O)
{
// L>>O.size;
// O.str = new char[O.size+1];
L>>O.str;
return L;
}
int main()
{
myString s1;//无参构造
s1.show();
cout << "----------------------" << endl;
myString s2("hello");//有参构造
s2.show();
cout << "----------------------" << endl;
myString s3(s2);//拷贝构造
s3.show();
cout << "----------------------" << endl;
if(s1.empty())//判空函数
{
cout<<"s1 empty"<<endl;
}else
{
cout<<"s1 not empty"<<endl;
}
cout << "----------------------" << endl;
if(s2.empty())//判空函数
{
cout<<"s2 empty"<<endl;
}else
{
cout<<"s2 not empty"<<endl;
}
cout << "----------------------" << endl;
cout<<"length of s2 = "<<s2.size_t()<<endl;//size函数
cout << "----------------------" << endl;
// cout<<s2.c_str()<<endl;//c_str函数
// printf("%s\n",s2);
printf("(C风格) s2 = %s\n",s2.c_str());
cout << "----------------------" << endl;
cout<<s3.at(1)<<endl;//at函数
cout<<s3.at(4)<<endl;
cout << "----------------------" << endl;//重载=
myString s4;
s4 = "xxxxx";
s4.show();
cout << "----------------------" << endl;//重载[]
s2[1] = 'E';
//s2[100] = 'S';
s2.show();
cout << "----------------------" << endl;//重载+
myString s5;
s5 = s3+s4;
s5.show();
cout << "----------------------" << endl;//重载==
myString s6(s3);
cout << (s3 == s6) << endl;
cout << "----------------------" << endl;//重载< > <= >=
s2.show();
s3.show();
cout << (s2 < s3) << endl;
cout << (s2 >= s3) << endl;
cout << "----------------------" << endl;//重载<< >>
myString s7;
cout << "请输入字符串>>> ";
cin >> s7;
// s7.show();
cout << s7 << endl;
return 0;
}