C++运算符的重载

定义SaleData类

#ifndef _SALEDATA__
#define _SALEDATA__

#include <string>
#include <iostream>

class SaleData{

    //数据成员
private:
    std::string bookNo;
    unsigned sold = 0;
    double revenue = 0.0;
    //成员函数
public:
    //构造函数
    SaleData() = default; //默认构造函数
    SaleData(const std::string &s) :bookNo(s) {};
    SaleData(const std::string &s, unsigned n, double p) :bookNo(s), sold(n), revenue(n*p) {};
    SaleData(std::istream &is); //只声明,类外定义;

    std::string isbn() const { return bookNo; } //(类中定义的函数为隐藏的inline函数),只在类中声明则不是;

//重载运算符

    SaleData & operator+=(const SaleData &); //SaleData类类型重载复合赋值运算符 += 
    //声明友元
    friend std::istream &operator>>(std::istream &is, SaleData &item); //SaleData类类型重载运算符 >>,输入
    friend std::ostream & operator<<(std::ostream &, const SaleData &); //SaleData类类型重载运算符 >> ,输出
    friend bool operator==(const SaleData &, const SaleData &); //SaleData类类型重载运算符 == ,相等
    friend bool operator!=(const SaleData &, const SaleData &); //SaleData类类型重载运算符 != ,不等
    friend SaleData operator+(const SaleData &, const SaleData &);SaleData类类型重载运算符 + ,相加

};

//后面实现为SaleData类类型重载运算符 >>,输入
std::istream &operator>>(std::istream &is, SaleData &item);
//后面实现为SaleData类类型重载运算符 >>,输出
std::ostream & operator<<(std::ostream &, const SaleData &);
//SaleData类类型重载运算符 == ,相等
bool operator==(const SaleData &, const SaleData &);
//SaleData类类型重载运算符 != ,不等
bool operator!=(const SaleData &, const SaleData &);
//SaleData类类型重载运算符 + ,相加
SaleData operator+(const SaleData &, const SaleData &);

#endif

重载输出运算符<<:参考C++ primer P494
注意:非成员函数要声明为类的友元
例子:

std::ostream & operator<<(std::ostream &os, const SaleData &item)
{
    os << item.isbn() << " " << item.sold << " " << item.revenue << " " << item.avg_value();
    return os;
} 

重载输入运算符>>:参考C++ primer P495

std::istream &operator>>(std::istream &is, SaleData &item)
{
    double price;
    is >> item.bookNo >> item.sold >> price; //
    while (!(is.good()))//检测流是否处于有效状态
    {
        //当输入流遇到错误
        //可以在此添加提示:
        is.clear();//恢复流错误
        //重新输入
        is >> item.bookNo >> item.sold >> price;
    }
    item.revenue = item.sold*price;
    return is;
}

重载相等运算符==:参考C++ primer P497

bool operator==(const SaleData &item1, const SaleData &item2)
{
    //比较每一个数据成员,如果类中的数据成员为其他类类型,则其他类类型必须具有重载了==运算符
    return  item1.isbn() == item2.isbn() &&
            item1.sold == item2.sold &&
            item1.revenue == item2.revenue;
}

重载不等运算符!=:参考C++ primer P497

bool operator!=(const SaleData &item1, const SaleData &item2)
{
    return !(item1 == item2); //事先重载==运算符
}

重载复合赋值运算符 += 参考C++ primer P500
注意:复合赋值运算符和赋值运算符应该为类的成员函数

SaleData &SaleData::operator+=(const SaleData &item)
{
    sold += item.sold;
    revenue += item.revenue;
    return *this;
}

重载运算符 + 参考C++ primer P497

SaleData operator+(const SaleData &item1, const SaleData &item2)
{
    SaleData sum = item1; //事先要重载赋值运算符 =
    sum += item2;//事先要重载复合赋值运算符 +=
    return sum;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值