c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符

标签(空格分隔): c++


前言

我在c++学习的过程中, 对这几个不太常见的运算符重载不太会写。出现了很多bug,而且搜索网上东西也比较少,所以特地写这一篇来分享给大家,同时加深印象。有出错的地方希望给位朋友斧正。


先看例子, 我定义一个类 Int 和我们基础的c++ int是一个意思

using  namespace std;
#include <iostream>
class Int
{
int data;
public:
Int &operator++(); //前置++
operator int(); //转换运算符
Int operator++(int) ; //后置++
Int &operator--() ; //前置--
Int operator--(int) ; //后置--
Int operator-() ; //负号运算符
friend ostream & operator<<(ostream &out, Int& a) ; //输出运算符号
friend istream & operator >> (istream &in, Int& a) ; //输入运算符号 };

1.前置与后置++ 前置–和后置–

首先明确的是咱们c和c++ 的前置++和后置++ 都是重载的++ 那他们的重载怎么写呢?

    Int& Int::operator++() {         //前置++
this->data++;
return *this;
} Int Int::operator++(int) { //后置++
Int tmp(*this);
this->data++;
return tmp;
} Int& Int::operator--() { //前置--
this->data--;
return *this;
} Int Int::operator--(int) { //后置--
Int temp(*this);
this->data--;
return temp;
}

Int& Int::operator++() //前置++

Int Int::operator++(int) //后置++

细心的朋友已经发现了 关键在于后置的重载++ 首先返回的是Int而不是 对象的引用, 然后在最后面(int)加了int参数 。 第一个问题好解决,因为我后置++函数返回的是tmp这个临时对象,在函数结束后被释放了,所以当然不能传引用啦, 对于第二个问题,这个是c++的规定。好吧我也很无语。只要在重载操作符的参数中加上一个int型参数,记住你改成double 都会错的。

前置–和后置–原理与前面相同,代码相似,不予复述。

2类型转换函数

转化运算符, 就是把类的对象转化成其他(基本类型,或其他类型)

    Int::operator int() {           //转换运算符
return data;
}

函数形式里不能有返回值,不能有参数,只能返回要转换的数据类型。 这里int是我要转化的类型所以我括号前是写int 返回的也是int 类型。

用于处理这样的问题

int c = 0;
Int c1(2);
c = c1; //这时 c1调用类型转换函数 对象c1返回了int 赋给变量c

3负号重载

    Int Int::operator-() {     //负号运算符
Int tmp;
tmp.data = -data;
return tmp;
}

函数形式里,不能有参数,返回对象(不能是引用原因和后置++相同)。

记住要用一个临时的tmp来储存变负的对象属性值,返回tmp

下面是错误的写法:

    Int Int::operator-() {     //负号运算符
data = -data;
}

重载-号的意思不是直接改变对象的符号,是返回一个符号相反的对象,举个例子,-5不是说把5改成负数,是得到5的相反数,准确说,负号有两个重载,取反操作符和减号操作符,这个是前者


4输入输出重载

ostream & operator<<(ostream &out, Int& a) {          //输出运算符号
out << a.data;
return out;
} istream & operator >> (istream &in, Int& a) { //输入运算符号
in >> a.data;
return in;
}

提几个小问题吧, 首先所有参数都是引用不是对象(尤其是输入函数不传引用,输入函数不改变值) 然后要记得 istream是用在输入中 不要用反, 不要加作用域运算符。

# c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符的更多相关文章

  1. pytest_前置后置

    今天总结下pytest,pytest简直就是python自动化中的高富帅,各种操作,哈哈 这次总结主要涉及到了以下几点: 1.unittest中的setUp.tearDown.setUpClass.t ...

  2. spring 切面 前置后置通知 环绕通知demo

    环绕通知: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...

  3. AOP 环绕通知 集成了前置 后置 返回通知等功能

    AOP 环绕通知 集成了前置 后置 返回通知等功能

  4. Spring Bean前置后置处理器的使用

    Spirng中BeanPostProcessor和InstantiationAwareBeanPostProcessorAdapter两个接口都可以实现对bean前置后置处理的效果,那这次先讲解一下B ...

  5. unittest的前置后置,pytest的fixture和共享机制conftest.py

    Unittest setUp/tearDown setUp当中得到的变量,用self.xxx = value传递给测试用例 setUpClass/tearDownClass setupClass当中得 ...

  6. C++之运算符重载(前置++和后置++)

    今天在阅读<google c++ 编程风格>的文档的时候,5.10. 前置自增和自减:有一句话引起了我的注意: 对于迭代器和其他模板对象使用前缀形式 (++i) 的自增, 自减运算符.,理 ...

  7. C: printf参数执行顺序与前置后置自增自减的影响

    起源: 今天在了解副作用side-effect的过程中,看到了下面的网页,把我带到了由printf引起的一系列问题,纠结了一整天,勉强弄懂. 第一个代码没什么好解释的.而第二个printf(" ...

  8. Spring -- aop(面向切面编程),前置&后置&环绕&抛异常通知,引入通知,自动代理

    1.概要 aop:面向方面编程.不改变源代码,还为类增加新的功能.(代理) 切面:实现的交叉功能. 通知:切面的实际实现(通知要做什么,怎么做). 连接点:应用程序执行过程期间,可以插入切面的地点. ...

  9. android实现前置后置摄像头相互切换

    首先自定义一个继承自SurfaceView并且实现了SurfaceHolder.Callback接口的组件: public class CameraView extends SurfaceView i ...

随机推荐

  1. 集训作业 洛谷P1017 进制转换

    这个题的题目真的太恶心了. 重点是他的题目描述和他的目标没啥关系. 和最终目的有关系的只有这么一句话:”输出此负进制数及其基数,若此基数超过10,则参照16进制的方法处理.“ 我们通过看这句话可以发现 ...

  2. Porter 进入 CNCF 云原生全景图,新版本即将发布!

    近日,KubeSphere 社区子项目面向物理机环境的负载均衡器 Porter 正式进入 CNCF Landscape.CNCF Landscape 在云原生实践过程中的每个环节帮助用户了解有哪些具体 ...

  3. 3c数码商城

    目标:2020样卷 已完成:增删改查 未完成:有些小知识点不在意丢失,因此导致有些未完善 解决方案:写代码时不要走心,专心一点,减少失误,减少时间,增加效率,使自己的项目看起来更优秀,注意小知识的掌握 ...

  4. 题解 洛谷 P4632 【[APIO2018] New Home 新家】

    首先考虑可以用二分答案来解决询问,可以二分一个长度\(len\),若在区间\([x-len,x+len]\)内包含了所有\(k\)种的商店,那么这个\(len\)就是合法的,可以通过二分来求其最小值. ...

  5. Spring Boot使用AOP的正确姿势

    一.为什么需要面向切面编程? 面向对象编程(OOP)的好处是显而易见的,缺点也同样明显.当需要为多个不具有继承关系的对象添加一个公共的方法的时候,例如日志记录.性能监控等,如果采用面向对象编程的方法, ...

  6. 深入剖析.NETCORE中CORS(跨站资源共享)

    前言 由于现代互联网的飞速发展,我们在开发现代 Web 应用程序中,经常需要考虑多种类型的客户端访问服务的情况:而这种情况放在15年前几乎是不可想象的,在那个时代,我们更多的是考虑怎么把网页快速友好的 ...

  7. Java 线程池记录

    Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...

  8. Python os.read() 方法

    概述 os.read() 方法用于从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串.高佣联盟 www.cgewang.com ...

  9. PHP set_exception_handler() 函数

    定义和用法 set_exception_handler() 函数设置用户自定义的异常处理函数. 该函数用于创建运行期间的用户自己的异常处理方法. 该函数返回旧的异常处理程序,如果失败则返回 NULL. ...

  10. PHP wordwrap() 函数

    实例 按照指定长度对字符串进行折行处理: <?php高佣联盟 www.cgewang.com$str = "An example of a long word is: Supercal ...