• C++运算符重载详解


    前提:C++运算符重载无疑是C++中既基础又实用的一种方式,但对于一个初学者来说又不那么容易搞清楚,个人感觉原因主要是:

    1、运算符的类内重载和类外重载的区别 

    2、一些如:const 、friend、inline关键字的用法不太熟悉


    关注:简要介绍一下这几个关键字用法

    inline:这里的所有inline关键字都可以取消(当然是在撇开inline的作用不谈),inline只是为了指定函数为内联函数,是表达式类宏定义的一种替代,他取代这种表达式形式的宏定义,它消除了宏定义的缺点,同时又很好地继承了宏定义的优点。关于宏定义的优缺点这里不作介绍。

    friend:用friend定义的函数为友元函数,友元函数不是类的成员函数,但它需要在类的内部进行定义。作用是以一个非成员函数的身份访问非public成员函数

    const:在本日志中两种含义:

    1、bool operator==(const Sales_item &,const Sales_item &);//这里const说明传递过来的参数在函数内不可以改变.

    2、bool same_isbn(const Sales_item &)const;//常成员函数, 常成员函数是不能改变成员变量值的函数。


    主题:说了上面这么多之后,正式进入主题。

    一、一元运算符(单目运算符),如:++、--

    此类运算符重载在类成员函数重载不带参数,在类外重载需要带一个参数(也可以不带,这时候也是把类当做一个运算符,这时候需要带域操作符“ :: ”)

    二、二元运算符(双目运算符),如:+、+=、=

    此类运算符重载在类成员函数重载带一个参数(实际两个,另外一个是类本身),在类外重载需要带两个参数(也可以是一个,这时候也是把类当做一个运算符,这时候需要带域操作符“ :: ”)

    三、三元运算符(三目运算符),a>b?a:b

    此类运算符不能重载

    四、特殊的二元运算符,如>>、<<

    此类运算符和其他二元运算符一样,只不过要注意返回值和参数类型


    注意:当非类成员函数在类外定义,要操作类中非Public成员变量,必须申明为类的友元函数

    #ifndef SALES_ITEM_H_
    #define SALES_ITEM_H_

    #include <iostream>
    #include <String>

    /// Start class
    class Sales_item
    {
    public:
    Sales_item():units_sold(0),revenue(0.0){}
    Sales_item(const std::string &book):isbn(book),units_sold(0),revenue(0.0){}
    Sales_item(std::istream & in){in >> *this;}
    virtual ~Sales_item(){}
    double avg_price() const;
    bool same_isbn(const Sales_item &)const;
    bool same_units_sold(const Sales_item &)const;
    bool same_revenue(const Sales_item &)const;

    Sales_item & operator+=(const Sales_item &);
    friend std::istream & operator>>(std::istream &,Sales_item &);
    friend std::ostream & operator<<(std::ostream &,const Sales_item &);

    // 二元运算符重载的成员函数只能有一个参数,所以不能放此处

    // Sales_item operator+(const Sales_item &,const Sales_item &);
    // bool operator==(const Sales_item &,const Sales_item &);
    // bool operator!=(const Sales_item &,const Sales_item &);
    private:
    std::string isbn;
    unsigned units_sold;
    double revenue;
    };
    /// End class

    Sales_item operator+(const Sales_item &,const Sales_item &);
    bool operator==(const Sales_item &,const Sales_item &);
    bool operator!=(const Sales_item &,const Sales_item &);

    /// Class function
    inline Sales_item & Sales_item::operator+=(const Sales_item & rhs)
    {
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;
    return *this;
    }

    Sales_item operator+(const Sales_item & lhs,const Sales_item & rhs)
    {
    Sales_item ret(lhs);
    ret += rhs;
    return ret;
    }

    bool operator==(const Sales_item & lhs,const Sales_item & rhs)
    {
    return lhs.same_isbn(rhs) && lhs.same_units_sold(rhs) && lhs.same_revenue(rhs);
    }

    bool operator!=(const Sales_item & lhs,const Sales_item & rhs)
    {
    return !(lhs == rhs);
    }

    inline std::istream & operator>>(std::istream &in,Sales_item &s)
    {
    double price;
    in >> s.isbn >> s.units_sold >>price;
    if(in)
    s.revenue = s.units_sold * price;
    else
    s = Sales_item();
    return in;
    }

    inline std::ostream & operator<<(std::ostream &out,const Sales_item &s)
    {
    out << s.isbn << " " << s.units_sold << " " << s.revenue << " " << s.avg_price();
    return out;
    }

    inline double Sales_item::avg_price() const
    {
    if(units_sold)
    return revenue/units_sold;
    else
    return 0;
    }

    inline bool Sales_item::same_isbn(const Sales_item &rhs)const
    {
    return isbn == rhs.isbn;
    }

    inline bool Sales_item::same_units_sold(const Sales_item &rhs)const
    {
    return units_sold == rhs.units_sold;
    }

    inline bool Sales_item::same_revenue(const Sales_item &rhs)const
    {
    return revenue == rhs.revenue;
    }
    /// End class function

    #endif


  • 相关阅读:
    IPC总结学习
    机器学习中的范数规则
    机器学习的几个误区-转载
    来几道大数据的面试题吧
    海量数据随机抽样问题(蓄水池问题)
    字符串类算法题目总结
    RPC学习
    如何做出健壮的系统设计
    关于bind函数和connect函数的测试结论
    [置顶] Codeforces Round #197 (Div. 2)(完全)
  • 原文地址:https://www.cnblogs.com/herbertchina/p/4306824.html
Copyright © 2020-2023  润新知