重载运算符 基本概念

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

c/c++ 重载运算符 基本概念的更多相关文章

  1. C++ 运算符重载的基本概念

    01 运算符重载的需求 C++ 预定义的运算符,只能用于基本数据类型的运算:整型.实型.字符型.逻辑型等等,且不能用于对象的运算.但是我们有时候又很需要在对象之间能用运算符,那么这时我们就要重载运算符 ...

  2. C#基础知识系列一(goto、i++、三元运算符、ref和out、String和string、重载运算符)

    前言 这两天在网上看到的总结很多,尤其是博客园中的,很多很多,也给了我很多的启发,当然自己也总结过,而且有很多人也给与我一些意见和看法.不管怎样,自己还是先把所谓的基础知识加强巩固下吧. 2014年的 ...

  3. C++ 重载运算符简单举例

    我们可以重定义或重载大部分 C++ 内置的运算符.这样,就能使用自定义类型的运算符. 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的.与其他函数一 ...

  4. C++ 重载运算符和重载函数

    C++ 重载运算符和重载函数 C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是 ...

  5. C++解析七-重载运算符和重载函数

    重载运算符和重载函数C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载.重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列 ...

  6. [C++ Primer] : 第14章: 重载运算符与类型转换

    基本概念 重载运算符是具有特殊名字的函数: 它们的名字由关键字operator和其后要定义的运算符号共同组成. 重载运算符函数的参数数量与该运算符作用的运算对象数量一样多. 对于二元运算符来说, 左侧 ...

  7. C++重载运算符简单总结

    当运算符作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义.明智的使用运算符重载能令我们的程序更易于编写和阅读. 一.基本概念 什么是运算符重载?重载的运算符是具有特殊名字的函数:它们 ...

  8. C++ 重载运算符 继承 多态 (超详细)

    (一)重载运算符: (1)声明与定义格式 一般是类内声明,类外定义,虽然可以在类内定义,但 写前面堆一堆不好看!!! 类内声明: class Demo { 返回值类型 operator 运算符(形参表 ...

  9. c++的重载运算符

    c++中允许重载运算符: 这是我辛苦的结果 #include"iostream"using namespace std;class aaa{ int x;public: aaa() ...

随机推荐

  1. Jedis与Luttuce区别

    如果你在网上搜索Redis 的Java客户端,你会发现,大多数文献介绍的都是 Jedis. 不可否认,Jedis是一个优秀的基于Java语言的Redis客户端. 但是,其不足也很明显:Jedis在实现 ...

  2. 微信小程序入门(五)

    24.MINA框架讲解 MINA框架架构 25.小程序运行机制 小程序在首次打开的时间会比较长,后续再打开启动会很快,那么小程序是如何启动的呢? 运行机制-启动 冷启动 热启动 热启动:假入用户已经打 ...

  3. Python高级特性(一)

    一.切片 L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']取出前三个元素 , 笨方法就是通过下标一个一个获取 [L[0], L[1], L[2]]Pyt ...

  4. PHP分页倒序时,需要注意的问题

    PHP分页倒序请求,如果有新数据加入,下一页会出现重复数据 解决方案: 第一次查询时,给前端返回一个查询时间戳,下一次请求时,把时间戳带过来,只查询比这个时间戳小的数据

  5. macOS的OpenCL高性能计算

    随着深度学习.区块链的发展,人类对计算量的需求越来越高,在传统的计算模式下,压榨GPU的计算能力一直是重点. NV系列的显卡在这方面走的比较快,CUDA框架已经普及到了高性能计算的各个方面,比如Goo ...

  6. mybatis中的动态SQL

    在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体 ...

  7. Lambda in Java VS in C#

    核心+变化 “凡是钱能解决的问题,就不是大问题.有很多问题是钱无法解决的,比如生老病死,比如不再相爱.”,看过<蜗居>的朋友一眼就能认出来.虽然这部电视剧讲的是chugui,但是毫无违和感 ...

  8. SpringMVC中@Controller和@RequestMapping用法和其他常用注解

    一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...

  9. #7 找出数组中第k小的数

    「HW面试题」 [题目] 给定一个整数数组,如何快速地求出该数组中第k小的数.假如数组为[4,0,1,0,2,3],那么第三小的元素是1 [题目分析] 这道题涉及整数列表排序问题,直接使用sort方法 ...

  10. HTTP协议的六种请求方法

    抛砖引玉,聊下概念性的东西先: HTTP协议 (Hyper Text Transfer Protocol) HTTP是一个基于TCP/IP通信协议来传递数据,包括html文件.图像.结果等,即是一个客 ...