1. 程式人生 > >c/c++ 過載運算子 基本概念

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