欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-29 20:52:26
重载运算符 基本概念 问题:对于int,float可以进行算数运算,但是对于一个自定义的类的对象进行算术运算,就不知道具体怎么运算了。 所以有了自定义运算符的概念。 1,自定义运算符其实就是一个以operator开头的函数,它可以是: 一个类的成员函数 普通的非函数 2,有一元运算符,比如++,还有 ......

重载运算符 基本概念

问题:对于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

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

本人微信:xiaoshitou5854