C++运算符的重载

来源:互联网 发布:js 数组长度 编辑:程序博客网 时间:2024/06/08 10:03

定义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