第14章 重载运算与类型转换
1 class Sales_data 2 { 3 /*重载<<和+运算符*/ 4 friend ostream& operator<<(ostream &os,const Sales_data &item); 5 //friend Sales_data operator+(const Sales_data &lhs,const Sales_data &rhs); 6 public: 7 /*重载+=*/ 8 Sales_data& operator+=(const Sales_data &rhs); 9 /*成员重载+*/ 10 //Sales_data operator+(const Sales_data& rhs); 11 12 /*拷贝构造函数和拷贝赋值运算符(注意区别重载赋值运算符)*/ 13 Sales_data(const Sales_data&); 14 Sales_data& operator=(const Sales_data &rhs); 15 16 /*构造函数*/ 17 Sales_data()=default; 18 Sales_data(int l,int r):units_sold(l),revenue(r){} 19 private: 20 int units_sold; 21 int revenue; 22 }; 23 24 /*友元外部声明*/ 25 ostream& operator<<(ostream &os,const Sales_data &item); 26 //Sales_data operator+(const Sales_data &rhs,Sales_data &lhs); 一句声明错,导致一个小时调试 27 28 /*拷贝构造函数和拷贝赋值运算符*/ 29 Sales_data::Sales_data(const Sales_data &items) 30 { 31 units_sold=items.units_sold; 32 revenue=items.revenue; 33 } 34 Sales_data& Sales_data::operator=(const Sales_data &rhs) 35 { 36 if(this!=&rhs) 37 { 38 //free(); //如果类Sales_data中包含需要手动释放的成员,则需要先“释放当前内存”。 39 units_sold=rhs.units_sold; 40 revenue=rhs.revenue; 41 } 42 return *this; 43 } 44 45 /*非成员,重载+*/ 46 Sales_data operator+(const Sales_data &lhs,const Sales_data& rhs) 47 { 48 Sales_data sum=lhs; //把lhs拷贝给sum 49 sum += rhs; 50 //sum.units_sold=lhs.units_sold+rhs.units_sold; 51 //sum.revenue=lhs.revenue+rhs.revenue; 52 return sum; //返回拷贝 53 } 54 55 /*成员,重载+=*/ 56 Sales_data& Sales_data::operator+=(const Sales_data &rhs) 57 { 58 //cout<<"+="<<endl; 59 units_sold+=rhs.units_sold; 60 revenue+=rhs.revenue; 61 return *this; 62 } 63 64 /*友元定义,重载<<*/ 65 ostream& operator<<(ostream &os,const Sales_data &item) 66 { 67 os<<item.units_sold<<" "<<item.revenue; 68 return os; 69 } 70 71 //也可以成员重载+ 72 /* 73 Sales_data Sales_data::operator+(const Sales_data& rhs) 74 { 75 Sales_data item=*this; 76 item += rhs; 77 //sum.units_sold=lhs.units_sold+rhs.units_sold; 78 //sum.revenue=lhs.revenue+rhs.revenue; 79 return item; //返回拷贝 80 } 81 */ 82 83 //主函数 84 int main() 85 { 86 Sales_data lhs(10,1); 87 Sales_data rhs(20,2); 88 89 //const Sales_data lhs(10,1); 90 //const Sales_data rhs(20,2); 91 Sales_data sum; 92 93 sum=lhs+rhs; 94 cout<<sum<<endl; 95 96 return 0; 97 }
重载函数调用运算符:
class PrintString { public: PrintString(istream &in=cin):is(in){};
string operator()() //函数调用运算符重载 { string line; if(!getline(is,line)) //读取一行用getline { line=""; } return line; } private: istream &is; }; /*题意:从istream中读取一行输入,然后返回一个表示所读内容的string.如果读取失败,返回空string。*/ int main() { PrintString PS; string s=PS(); //调用“函数对象”,返回值赋值给s cout<<s<<endl; return 0; }