zoukankan      html  css  js  c++  java
  • c++--运算符重载

    第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; }
  • 相关阅读:
    Lambda表达式、依赖倒置
    ASP.NET vNext 概述
    Uname
    RHEL4 i386下安装rdesktop【原创】
    Taxonomy of class loader problems encountered when using Jakarta Commons Logging(转)
    How to decompile class file in Java and Eclipse
    先有的资源,能看的速度看,不能看的,抽时间看。说不定那天就真的打不开了(转)
    Google App Engine 学习和实践
    【VBA研究】VBA通过HTTP协议实现邮件轨迹跟踪查询
    js正則表達式语法
  • 原文地址:https://www.cnblogs.com/cygalaxy/p/7050247.html
Copyright © 2011-2022 走看看