// 34用過載輸入運算子函式實現字串的輸入
/*
#include <iostream>
using namespace std;
class String
{
public:
String(); //預設的建構函式
String(const char*const ch); //構造帶值的string
int getlen()const { return len;} //讀取長度
//const char *getstr()const{ return str;} //讀取字串
//過載輸出函式
friend ostream&operator<<(ostream &o, const String &s)
{
o<<s.str;
return o;
}
friend istream&operator>>(istream &i, String &s)
{
i>>s.str;
return i;
}
//這裡是可以修改的
char &operator[](unsigned short int length);
char operator[](unsigned short int length)const;
//複製建構函式
String (const String&r);
//過載賦值運算子=
String &operator=(const String &s);
private:
unsigned short int len;
char *str;
};
//建立一個空的str變數
String::String()
{
len = 0;
str = new char[1];
str[0] = '\0';
};
String::String(const char*const ch)
{
cout<<"帶一個引數的建構函式"<<endl;
len = strlen(ch);
str = new char[len+1];
for(int i=0; i<len; i++){
str[i] = ch[i];
}
str[len] = '\0';
};
char & String::operator[](unsigned short int length)
{
if(length > len){
return str[len-1]; //返回可見字元的值
}else{
return str[length];
}
};
char String::operator[](unsigned short int length)const
{
cout<<"下標運算子const執行"<<endl;
if(length > len){
return str[len-1]; //返回可見字元的值
}else{
return str[length];
}
};
String::String (const String&rs)
{
len = rs.getlen();
str = new char[len+1];
for(int i=0; i<len; i++){
str[i] = rs[i];
//這裡因為我們構造一個新物件並且用舊物件來為它賦值,很明顯,不會修改舊物件的值,所以舊物件rs在呼叫operator[]const函式的時候,不用將指定字串的地址返回,只需要要按值返回這個字元即可
//第二次過載的operator[]運算子函式,按值返回的一個字元,同時在函式體前面加了一個const
//表示該函式可以操作const物件,也就是rs
//這樣由於2個同名的函式,它的型別不同,一個可操作const物件,一個不可以,這樣就可以做到了對函式的過載
}
str[len]='\0';
cout<<"複製建構函式完成:"<<str<<endl;
};
String& String::operator=(const String &s)
{
cout<<"operator=執行"<<endl;
if(this == &s)
{
return *this;
}else{
delete []str; //刪除左邊的字串
len = s.getlen();
str = new char[len+1];
for(int i=0; i<len; i++){
str[i] = s[i];
}
str[len] = '\0';
}
return *this; //注意按引用返回,也就是別名
}
int main()
{
String s;
cin>>s;
cout<<s<<endl;
return 0;
}*/