#include <iostream>
#include <cstring>
using namespace std;
class String{
public:
String(const char *str = NULL); //构造函数
String(const String &str); //拷贝构造函数
~String(); //析构函数
String operator+(const String &str) const; //重载+运算符
String& operator=(const String &str); //重载=运算符
String& operator+=(const String &str); //重载+=运算符
bool operator==(const String &str) const; //重载==运算符
char& operator[](int n) const; //重载[]运算符
size_t size() const; //字符串长度
const char* c_str() const; //返回字符串常量
friend istream& operator>>(istream &is, String &str); //重载输入
friend ostream& operator<<(ostream &os, String &str); //重载输出
private:
char *data;
size_t length;
};
String::String(const char *str){
if(!str){
length = 0;
data = new char[1];
*data = '\0';
}
else{
length = strlen(str);
data = new char[length + 1];
memcpy(data, str, length + 1);
}
}
String::String(const String &str){
length = str.size();
data = new char[length + 1];
memcpy(data, str.data, length + 1);
}
String::~String(){
length = 0;
delete []data;
}
String String::operator+(const String &str) const{
String new_str;
new_str.length = length + str.size();
new_str.data = new char[new_str.length + 1];
strcpy(new_str.data, data);
strcat(new_str.data, str.data);
return new_str;
}
String& String::operator=(const String &str){
if(this == &str){
return *this;
}
delete []data;
length = str.size();
data = new char[length + 1];
memcpy(data, str.data, length + 1);
return *this;
}
String& String::operator+=(const String &str){
length += str.size();
char *new_str = new char[length + 1];
strcpy(new_str, data);
strcat(new_str, str.data);
delete []data;
data = new_str;
return *this;
}
bool String::operator==(const String &str) const{
if(length != str.size()){
return false;
}
return strcmp(data, str.data)?false:true;
}
char& String::operator[](int n) const{
if(n >= length){
return data[length - 1];
}
return data[n];
}
size_t String::size() const{
return length;
}
const char* String::c_str() const{
return data;
}
istream& operator>>(istream &is, String &str){
char buf[1024];
is >> buf;
str.length = strlen(buf);
memcpy(str.data, buf, str.length + 1);
return is;
}
ostream& operator<<(ostream &os, String &str){
os << str.data;
return os;
}
int main(){
String str1, str3, str4;;
String str2 = " world!";
cin >> str1;
cout << str1[3] << endl;
str3 = str1 + str2;
str4 += str3;
if(str3 == str4){
cout << "equal!" << endl;
}
cout << str3.size() << endl;
const char *c = str3.c_str();
cout << c << endl;
cout << str4 << endl;
return 0;
}