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是用在输入中 不要用反, 不要加作用域运算符。

转载于:https://www.cnblogs.com/qq874455953/p/9589224.html

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

  1. 几个特殊的运算符重载(前置\后置++、前置\后置--、<<、>>)

    几个特殊的运算符重载 概念 运算符重载是一个非常重要的概念,在运算符重载中我们可以重新定义 运算符 的具体含义,一个运算符重载函数的定义是 T operator 运算符 (参数) ,对于运算符重载有以 ...

  2. 运算符重载(加减运算符、前置加加(减减)后置加加(减减)运算符、赋值运算符、输入输出运算符、关系运算符、函数调用)

    编译器对于一个类会默认生成以几种函数: 1.默认构造函数(空形参,空函数体) 2.默认拷贝构造函数(浅拷贝,也叫值拷贝.字节拷贝) 3.析构函数(空形参,空函数体.析构函数要求形参列表必须是空的,所以 ...

  3. 【Android RTMP】NV21 图像旋转处理 ( 快速搭建 RTMP 服务器 Shell 脚本 | 创建 RTMP 服务器镜像 | 浏览器观看直播 | 前置 / 后置摄像头图像旋转效果展示 )

    文章目录 安卓直播推流专栏博客总结 一. 编写快速搭建 RTMP 服务器 Shell 脚本 二. RTMP 快速搭建方法 三.创建阿里云 RTMP 服务器镜像 四.浏览器查看直播内容 五.前置 / 后 ...

  4. AOP开发——在不修改源代码的前提下,对类里面的方法进行增强 : 前置 后置 环绕 异常||如何得到目标方法的参数和返回值

    AOP开发 @Transactionl 在不修改源代码的前提下,对类里面的方法进行增强 前置 后置 环绕 异常 创建项目前引入aop的包 <dependency>     <grou ...

  5. 手写Spring-第六章-让我访问!实现前置后置处理扩展功能

    前言 上一次我们实现了bean定义的自动化注册,这让我们的demo看起来已经很有Spring的那个味道了.但是扩展性还是差了一些.我们都知道,要写出高内聚,低耦合,富有扩展性的代码.那么如何增加扩展性 ...

  6. [凯圣王]碳水在身体内的去向/碳水前置后置的区别/碳水循环计划的简聊/训练前什么时间吃碳水

    碳水在身体内的去向/碳水前置后置的区别/碳水循环计划的简聊/训练前什么时间吃碳水 一.视频 二.碳水的种类 三.碳.蛋.脂 转换关系 四.碳水在身体中的储存数量 五.碳水什么时候补充 六.碳水循环饮食 ...

  7. Jmeter性能测试学习(五):Beanshell处理器(包含前置后置)

    BeanShell是一种脚本语言,一种完全符合java语法的java脚本语言,并且又拥有自己的一些语法和方法,beanShell是一种松散类型的脚本语言(这点和JS类似).jmeter中就有这个内嵌的 ...

  8. 【pytest】概述pytest——setup、teardown方法和conftest中的fixture用法,来执行测试用例的前置/后置条件语句操作

    大家好,我是好学的小师弟.今天和大家分享下-在pytest中的前置/后置操作. 所谓的前置/后置操作,就是在测试用例执行前,你预先要执行的一些步骤:在测试用例执行完毕后,你要执行的一些数据清理/备份工 ...

  9. c++中运算符重载(加号运算,左移运算,前置后置++运算符,赋值运算,关系运算,函数运算)

    运算符重载注意 重载的运算符要易读 内置的数据类型的表达式的运算符是不可以改变的 不要重载&& 和 | | 运算符 =,[]和->运算符只能通过成员函数进行重载 << ...

最新文章

  1. 什么是以太坊,它是区块链2.0的代表,它又什么特点?
  2. 5.TCP和UDP的区别
  3. window 下内存泄漏检测
  4. python发邮件给女朋友代码_python实现邮件发送完整代码(带附件发送方式)
  5. sql 日期和当前日期时间差_详解PostgreSQL 如何获取当前日期时间
  6. android数字滚动动画,Android超简单实现金钱滚动效果
  7. 中科大410分计算机排名第几,2021考研成绩发布:中科大400分无缘复试,中山大学321分登顶第二...
  8. Mysql知识总结(二)
  9. 外星网络大肆入侵,地球人能安好吗?
  10. Python+OpenCV:基于分水岭算法的图像分割(Image Segmentation with Watershed Algorithm)
  11. How to make .dmg install for Mac
  12. python爬虫大作业爬多少数据_爬虫大作业
  13. 使用色彩追踪和形态学运算得到图像中感兴趣区域
  14. mysql 利用延迟关联优化查询(select * from your_table order by id desc limit 2000000,20)
  15. Windows 程序设计应用开发(上部)
  16. mysql重启服务命令_重启mysql命令
  17. 微生物组-扩增子16S分析和可视化(线上/线下同时开课,2022.4)
  18. win101909要不要更新_近年最稳的Win10更新?Win10 1909值得升级吗
  19. Oracle 定时执行计划任务
  20. 多边形画椭圆算法java_运用椭圆画法,45行代码画出任意正多边形

热门文章

  1. CTFshow php特性 web114
  2. 字符流中第一个不重复的字符
  3. BP神经网络(检测故障的实例)
  4. n 如何编写html,webpack4系列教程,如何编写plugin处理html代码逻辑?
  5. android fragment 退出程序,android – 应用程序在Fragment中单击后退按钮后关闭
  6. mysql树形遍历_mysql树形结构遍历
  7. sklearn学习(一)
  8. 页面置换算法(FIFO , LRU, OPT)(C++实现模拟)
  9. 怎样把做好的css样式改日期,Win8操作系统任务栏中日期样式怎么更改
  10. angular4 php,Angular4中常用管道实例详解