#include <iostream> using namespace std; class String { public: String(); //默认的构造函数 ~String(){ delete []str; len=0; //cout<<"析构函数执行"<<endl; } 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; } //当运算符重载函数定义为成员函数时,二元运算符只带一个参数 //将这个函数定义为友元函数即可 friend bool operator<(const String&str1, const String&str2) { if(strcmp(str1.str, str2.str) < 0){ return 1; }else return 0; } friend bool operator>(const String&str1, const String&str2) { if(strcmp(str1.str, str2.str) > 0){ return 1; }else return 0; } friend bool operator==(const String&str1, const String&str2) { if(strcmp(str1.str, str2.str) == 0){ return 1; }else return 0; } //这里是可以修改的 char &operator[](unsigned short int length); char operator[](unsigned short int length)const; //复制构造函数 String (const String&r); //重载赋值运算符= String &operator=(const String &s); String operator+(const String&s); //重载相加运算符 void operator+=(const String&s); //重载相加运算符 private: String(unsigned short int); //构造带值的string 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'; }; String::String(unsigned short int lenght) { //cout<<"带一个int参数的构造函数"<<endl; len = lenght; str = new char[len+1]; for(int i=0; i<=len; i++){ str[i] = '\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; //注意按引用返回,也就是别名 } String String::operator+(const String &s) { //cout<<"operator+执行......"<<endl; int total = len + s.getlen(); String temp(total); int i, j; for(i=0; i<len; i++){ temp[i] = str[i]; } for(j=0; j<s.getlen(); j++, i++){ temp[i] = s[j]; } return temp; } void String::operator+=(const String&s) { //cout<<"这里执行的是相+=运算符"<<endl; int total = len + s.getlen(); String temp(total); int i, j; for(i=0; i<len; i++){ temp[i] = str[i]; } for(j=0; j<s.getlen(); j++,i++){ temp[i] = s[j]; } *this = temp; } //3 类书类 /* #include "String.h" class Book { public: Book(); Book(char*, char*, char*, float); //不能修改返回值,在函数内也不能修改,也不想调用复制构造函数,按地址传递 const String& GetTitle()const{ return title; } const String& GetAuthor()const{ return author; } const String& GetNumber()const{ return number; } float GetPrice()const{ return price; } void SetTitle(const String& s){ title = s; } void SetAuthor(const String& s){ author = s; } void SetNumber(const String& s){ number = s; } void SetPrice(float p){ price = p; } void SetTotal(const String&t, const String&a,const String&n, float p) { title = t; author = a; number = n; price = p; } private: String title; //书名 String author; //作者 String number; //编号 float price; //价格 }; //创建一本空图书 Book::Book():title(""),author(""),number(""),price(0){}; //创建一本有所有内容的图书 Book::Book(char* t, char* a, char* n, float p) { title = t; author=a; number = n; price=p; } int main() { Book love("love","Jack","001",35.5); cout<<"书名:"<<love.GetTitle()<<endl; cout<<"作者:"<<love.GetAuthor()<<endl; cout<<"编号:"<<love.GetNumber()<<endl; cout<<"价格:"<<love.GetPrice()<<endl; love.SetPrice(55.5); cout<<"价格:"<<love.GetPrice()<<endl; love.SetTotal("hate","mak","002",39.9); cout<<"书名:"<<love.GetTitle()<<endl; cout<<"作者:"<<love.GetAuthor()<<endl; cout<<"编号:"<<love.GetNumber()<<endl; cout<<"价格:"<<love.GetPrice()<<endl; Book hoat; hoat = love; cout<<"书名:"<<hoat.GetTitle()<<endl; cout<<"作者:"<<hoat.GetAuthor()<<endl; cout<<"编号:"<<hoat.GetNumber()<<endl; cout<<"价格:"<<hoat.GetPrice()<<endl; if(love.GetNumber() == hoat.GetNumber()){ cout<<"两本书的编号相同"<<endl; }else{ cout<<"两本书的编号不相同"<<endl; } hoat.SetNumber("003"); if(love.GetNumber() == hoat.GetNumber()){ cout<<"两本书的编号相同"<<endl; }else{ cout<<"两本书的编号不相同"<<endl; } return 0; } */