• c/c++ 重载运算符 基本概念


    重载运算符 基本概念

    问题:对于int,float可以进行算数运算,但是对于一个自定义的类的对象进行算术运算,就不知道具体怎么运算了。

    所以有了自定义运算符的概念。

    1,自定义运算符其实就是一个以operator开头的函数,它可以是:

    • 一个类的成员函数
    • 普通的非函数

    2,有一元运算符,比如++,还有元运算符,比如+。

    • 自定义运算符函数为类的成员函数:二元运算符(a1 + b1)的左侧的对象(a1),绑定到隐式的this指针上;二元运算符的右侧的对象(b1),绑定到operator函数的第一个参数上。

      a1 + b1;
      a1.operator+(b1);
      
      string s = "aa";
      string b = a + "dd";//实际调用的是a.operator+("dd");
      string a = "b" + s;//实际调用的是operator+("b", s);因为"b"是const char*,所以它没有成员方法operator+
      
    • 自定义运算符函数为普通的非函数:二元运算符(a1 + b1)的左侧的对象(a1),绑定到operator函数的第一个参数上;二元运算符的右侧的对象(b1),绑定到operator函数的第二个参数上。

      a1 + b1;
      operator+(a1, b1);
      string s = "aa";
      string a = "b" + s;//实际调用的是operator+("b", s);因为"b"是const char*,所以它没有成员方法
      

    3,例子(重载的输入,输出,+,+=)

    sample.h

    #ifndef CP5_CH14_EX14_02_H
    #define CP5_CH14_EX14_02_H
    
    #include <string>
    #include <iostream>
    
    class Sales_data{
      friend std::istream& operator>>(std::istream&, Sales_data&);
      friend std::ostream& operator<<(std::ostream&, const Sales_data&);
      friend Sales_data operator+(const Sales_data&, const Sales_data&);
    
    public:
      Sales_data(const std::string& s, unsigned n, double p):
        bookNo(s), units_sold(n), revenue(p){}
      Sales_data():Sales_data("",0, 0.0f){}
      Sales_data(std::istream&);
    
      Sales_data& operator+=(const Sales_data&);
      std::string isbn() const {return bookNo;}
    private:
    
      inline double avg_price() const;
      std::string bookNo;
      unsigned units_sold = 0;
      double revenue = 0.0;
    };
    
    
    std::istream& operator>>(std::istream&, Sales_data&);
    std::ostream& operator<<(std::ostream&, const Sales_data&);
    Sales_data operator+(const Sales_data&, const Sales_data&);
    
    inline double Sales_data::avg_price() const {
      return units_sold ? revenue / units_sold : 0;
    }
    
    
    
    #endif // CP5_CH14_EX14_02_H
    

    sample.cpp

    #include "sales.hpp"
    
    Sales_data::Sales_data(std::istream& is) : Sales_data(){
      is >> *this;
    }
    
    std::istream& operator>>(std::istream& is, Sales_data& item){
      double price = 0.0;
      is >> item.bookNo >> item.units_sold >> price;
      if(is){
        item.revenue = item.units_sold * price;
      }
      else{
        item = Sales_data();
      }
      return is;
    }
    
    std::ostream& operator<<(std::ostream& os, const Sales_data& item){
      os << item.bookNo << ":" << item.units_sold << " " <<
        item.revenue << " " << item.avg_price();
      return os;
    }
    
    Sales_data operator+(const Sales_data& s1, const Sales_data& s2){
      Sales_data da = s1;
      da += s2;
      return da;
    }
    
    Sales_data& Sales_data::operator+=(const Sales_data& rhs){
      units_sold += rhs.units_sold;
      revenue += rhs.revenue;
      return *this;
    }
    int main(){
      Sales_data s1(std::cin);
      std::string bn("aa");
      Sales_data s2(bn, 10, 5.2);
      Sales_data s3 = s1 + s2;
      std::cout << s3 << std::endl;
      
    }
    
    

    当重载输入运算符时,应该处理输入错误的情况。

    如果类同时定义算术运算符和相应的复合运算符,则通常使用复合运算符来实现算术运算符。

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    UVA 10820
    Theano 在windows下安装
    [置顶] 扩展方法入门
    Hdu 3887 Counting Offspring Poj 3321 Apple Tree BZOJ 1103 [POI2007]大都市meg
    win7在USB该解决方案不健全音箱
    java堆 (转)
    王立平--android这四个组成部分
    malloc功能具体解释
    楼塔当天领袖acm心理(作为励志使用)
    Lua学习 2) —— Android与Lua互调
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/10126017.html
Copyright © 2020-2023  润新知