c/c++ 過載運算子 基本概念
阿新 • • 發佈:2018-12-16
過載運算子 基本概念
問題:對於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; }