首页 技术 正文
技术 2022年11月22日
0 收藏 391 点赞 2,204 浏览 2360 个字

重载运算符 基本概念

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,104
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,580
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,428
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,200
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,835
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,918