# c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符
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++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符的更多相关文章
- pytest_前置后置
今天总结下pytest,pytest简直就是python自动化中的高富帅,各种操作,哈哈 这次总结主要涉及到了以下几点: 1.unittest中的setUp.tearDown.setUpClass.t ...
- spring 切面 前置后置通知 环绕通知demo
环绕通知: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...
- AOP 环绕通知 集成了前置 后置 返回通知等功能
AOP 环绕通知 集成了前置 后置 返回通知等功能
- Spring Bean前置后置处理器的使用
Spirng中BeanPostProcessor和InstantiationAwareBeanPostProcessorAdapter两个接口都可以实现对bean前置后置处理的效果,那这次先讲解一下B ...
- unittest的前置后置,pytest的fixture和共享机制conftest.py
Unittest setUp/tearDown setUp当中得到的变量,用self.xxx = value传递给测试用例 setUpClass/tearDownClass setupClass当中得 ...
- C++之运算符重载(前置++和后置++)
今天在阅读<google c++ 编程风格>的文档的时候,5.10. 前置自增和自减:有一句话引起了我的注意: 对于迭代器和其他模板对象使用前缀形式 (++i) 的自增, 自减运算符.,理 ...
- C: printf参数执行顺序与前置后置自增自减的影响
起源: 今天在了解副作用side-effect的过程中,看到了下面的网页,把我带到了由printf引起的一系列问题,纠结了一整天,勉强弄懂. 第一个代码没什么好解释的.而第二个printf(" ...
- Spring -- aop(面向切面编程),前置&后置&环绕&抛异常通知,引入通知,自动代理
1.概要 aop:面向方面编程.不改变源代码,还为类增加新的功能.(代理) 切面:实现的交叉功能. 通知:切面的实际实现(通知要做什么,怎么做). 连接点:应用程序执行过程期间,可以插入切面的地点. ...
- android实现前置后置摄像头相互切换
首先自定义一个继承自SurfaceView并且实现了SurfaceHolder.Callback接口的组件: public class CameraView extends SurfaceView i ...
随机推荐
- 数据治理工具调研之DataHub
1.项目简介 Apache Atlas是Hadoop社区为解决Hadoop生态系统的元数据治理问题而产生的开源项目,它为Hadoop集群提供了包括数据分类.集中策略引擎.数据血缘.安全和生命周期管理在 ...
- DC-1靶机实战和分析
前言 我们都知道,对靶机的渗透,可以宽阔自己的解题思路,练习并熟悉相关操作命令,提高自己的能力.下面我就对Vulnhub的DC-1靶机进行渗透,靶机设置了5个flag,咱们依次找到它.并通过图文形式讲 ...
- 使样式只在webkit内核生效
@media screen and (-webkit-min-device-pixel-ratio:0){ .do someting{ } } 使用媒体查询,制定样式
- SQL查询基本用法
-- 单列查询 select 编号 from employees -- 多列查询 select 编号,姓名 from employees -- 查询所有列 select * from employee ...
- xctf-web fakebook
点join注册账号 进入view.php发现参数no存在sql注入,但是过滤了select关键字,用内联注释绕过 在users表的data字段发现了用序列化存储的用户信息 然后就卡在这里了....看了 ...
- PHP入门之类型与运算符(一)
前言 PHP对于大部分人来说,是比较容易入门的.笔者也是刚学习不久,所以就把自己学习的基础知识进行总结和整理.第一部分是类型与运算符.如果你想学习PHP,可以参考PHP学习手册学习,任何一本教学资料也 ...
- 开源项目推荐 - 巨鲸任务调度平台(Spark、Flink)
Big Whale(巨鲸),为美柚大数据研发的大数据任务调度平台,提供Spark.Flink等离线任务的调度(支持任务间的依赖调度)以及实时任务的监控,并具有批次积压告警.任务异常重启.重复应用监测. ...
- 【laravel】Eloquent 模型事件和监听方式
所有支持的模型事件 在 Eloquent 模型类上进行查询.插入.更新.删除操作时,会触发相应的模型事件,不管你有没有监听它们.这些事件包括: retrieved 获取到模型实例后触发 creatin ...
- 高度塌陷与BFC
高度塌陷的产生条件 子元素浮动,脱离文档流 子元素绝对定位或固定定位,脱离文档流 定位产生的高度塌陷只能通过加固定高度或更换其他方案解决塌陷,本文主要讨论浮动产生塌陷的解决方法. 高度塌陷的解决方法 ...
- PHP array_push() 函数
实例 向数组尾部插入 "blue" 和 "yellow": <?php$a=array("red","green" ...