c/c++ 重载运算符 基本概念
程序员文章站
2022-04-22 23:26:20
重载运算符 基本概念 问题:对于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
本人微信:xiaoshitou5854
上一篇: 网友称“聊天宝”太恶心 罗永浩回应
下一篇: 三国时期名叫张苞的有几人?他们结局如何?