重载运算符 基本概念

问题:对于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. Linux指令装图像化界面

    1.对yum进行配置安装.//这是重点 [root@localhost ~]# yum groupinstall "GNOME Desktop" "Graphical A ...

  2. 【Scala篇】--Scala中集合数组,list,set,map,元祖

    一.前述 Scala在常用的集合的类别有数组,List,Set,Map,元祖. 二.具体实现 数组   1.创建数组 new Array[Int](10) 赋值:arr(0) = xxx Array[ ...

  3. BBS论坛(四)

    4.1.cms登录页面csrf保护 (1)Perfect_bbs.py from flask_wtf import CSRFProtect CSRFProtect(app) 添加csrf保护后,现在再 ...

  4. 记Javascript一道题的理解

    代码如下: function Foo(){ getName = function(){ console.log("1"); } return this; } Foo.getName ...

  5. 使用 Nginx 在 Linux 上托管 ASP.NET Core 应用程序

    本文于2019年04月10日将标题「CentOS7 部署 ASP.NET Core应用程序」修改为「使用 Nginx 在 Linux 上托管 ASP.NET Core 应用程序」. 环境准备 VMwa ...

  6. 用Maxima画出一些有趣的图

    Maxima可以画出Chaos.Duffing .Fern.Lorenz.Rossler .Portraits .Mandelbrot.Staircase.Triangles等有趣的图... Chao ...

  7. 利用好浏览器的空闲时间 --- requestIdleCallback

    页面流畅与 FPS 页面是一帧一帧绘制出来的,当每秒绘制的帧数(FPS)达到 60 时,页面是流畅的,小于这个值时,用户会感觉到卡顿. 1s 60帧,所以每一帧分到的时间是 1000/60 ≈ 16 ...

  8. Java基础17:Java IO流总结

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  9. Java开发知识之Java入门

    Java开发知识之Java入门 一丶了解JAVA的版本 JAVA 有三个版本 JAVA SE: 标准版,开发桌面跟商务应用程序 JAVA SE 包括了Java的核心类库,集合,IO 数据库连接 以及网 ...

  10. SmartSql 性能评测

    BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17134 Intel Core i7-6700K CPU 4.00GHz (Skylake), 1 CPU, 8 ...