浅谈C++中如何重载前置++/--与后置++/--

前置++/–与后置++/–

C++中的++和–操作符存在前置式与后置式,最基本的,作为一名程序员,你应当了解它们实现的不同:

i++;
++i;

以上两行代码如果单独使用,在功能上是一致的,它们都实现了让变量i加1的操作,但是实现的机制有所不同:

  • i++是先用后加,即你在t时刻得到的变量i的值实际上还是原来的值,但它实际的值已经被加1;
  • ++i是先加后用,即你用的值和变量i当前时刻的值是一样的;
    int a = 1;int b = 1;cout << "a: " << a << "   前++: " << ++a << "   a:" << a << std::endl;cout << "b: " << b << "   后++: " << b++ << "   b:" << b << std::endl;

运行结果:

a: 1++: 2   a:2
b: 1++: 1   b:2

发现没有?后置式其实是将变量的值找了个临时变量先存了起来,然后再将该变量加1,而前置式则直接将变量加1。

从这个机制上,可以下个结论,后置式在性能上要逊与前置式。这其实也是在建议你,在写for循环时尽量使用前置式++i,而不是后置式i++。

前置++/–与后置++/-- 的重载

C++允许这两个操作符拥有重载能力。但是这时候你可能发现在语法上似乎出现了问题:重载函数是以其参数类型或个数来区分彼此的,然而这是个单目运算符,无论是前置式还是后置式,都没有参数。于是,为了填平这个语言上的漏洞,只好让后置式有一个int自变量,在其被调用的时候,编译器默默为该int指定一个0值。

假设我们有一个复数类complex,现在为其重载++运算符:

class complex
{
public:complex& operator++(){a = a+1;b = b+1;return *this;};const complex operator++(int){complex temp = *this;++temp;return temp;};int a = 0;int b = 0;
};

其实,前置++与后置++的功能”先加后用“与”先用后加“已经为这两种操作符的实现指明了路线:既然是先加后用,那加完之后的和最后使用的应当是同一样东西,所以应当返回引用。同理,”先用后加“说明应当先把原来的值保存起来,再将其加1,但是最后还是应当返回其原来的值,因为是”先用后加“嘛。另外,你还应当注意,这里保存完原来的值之后,直接调用了前置++去实现加1,这种操作很好的实现了复用,应当被提倡。

但是,你可能会奇怪:为什么后置++必须返回一个const值?而不是像前置++一样返回引用就好了?

首先,返回值是因为这是个局部变量,一旦出了作用域,temp的生命周期就完结了,也就不存在引用了;其次,const 其实是在像”偶像”致敬。偶像?谁是偶像?int。

是的,当你不清楚你的实现应当跟谁保持一致的时候,去看看标准库里的数据类型,int类型支持++ ++ i,但是不支持i++ ++。所以,为了跟标准保持一致,建议像偶像看起。因此,返回const值也就说得通了。

最后,附上源码:

#include <iostream>class complex
{
public:complex& operator++(){a++;b++;return *this;};const complex operator++(int){complex temp = *this;++temp;return temp;};int a = 0;int b = 0;
};std::ostream& operator<<(std::ostream& os, const complex& value)
{os << value.a << " " << value.b << " ";return os;
}int main()
{int a = 1;int b = 1;cout << "a: " << a << "   前++: " << ++a << "   a:" << a << std::endl;cout << "b: " << b << "   后++: " << b++ << "   b:" << b << std::endl;complex c;cout << "c:  " << c << "   前++++:   " << ++ ++c << "  后++   " << c++ << std::endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/176064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nuxt、vue实现PDF和视频文件的上传、下载、预览

上传 上传页面 <el-form-item :label"(form.ququ3 1 ? 参培 : form.ququ3 2 ? 授课 : ) 证明材料" prop"ququ6"><PdfUpload v-model"form.ququ6" :fileType"[pdf, mp4, avi, ts]"></PdfUpload> </el-form-i…

python:使用for循环与while循环打印九九乘法表

python&#xff1a;使用for循环与while循环打印九九乘法表 在编程中&#xff0c;for循环和while循环是两种常用的循环结构&#xff0c;它们可以用来实现各种不同的功能和逻辑。其中&#xff0c;九九乘法表是一个经典的例子&#xff0c;可以用来展示for循环和while循环的使用方…

亚马逊,shein,temu如何避免爆品评分低被强制下架

近期&#xff0c;一些Temu卖家反映产品下架问题&#xff0c;无论是日出千单的爆品还是其他商品&#xff0c;都有可能面临下架的风险。这其中最主要的原因之一是产品质量问题&#xff0c;导致消费者差评较多&#xff0c;评分降至4.2分或4.0分以下时&#xff0c;平台可能会强制下…

EfficientViT:具有级联群体注意力的内存高效Transformer

EfficientViT: Memory Efficient Vision Transformer with Cascaded Group Attention 1、介绍2、使用 Vision Transformer 加快速度2.1 内存效率2.2 计算效率2.3 参数效率 3、Efficient Vision Transformer3.1 EfficientViT 构建模块3.3 EfficientViT 网络架构 4、实验5、结论 …

YOLOv8独家原创改进: AKConv(可改变核卷积),即插即用的卷积,效果秒杀DSConv | 2023年11月最新发表

💡💡💡本文全网首发独家改进:可改变核卷积(AKConv),赋予卷积核任意数量的参数和任意采样形状,为网络开销和性能之间的权衡提供更丰富的选择,解决具有固定样本形状和正方形的卷积核不能很好地适应不断变化的目标的问题点,效果秒殺DSConv 1)AKConv替代标准卷积进行…

如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控件中的MFC类

有时候我们在MFC项目开发过程中&#xff0c;需要用到一些微软已经提供的功能&#xff0c;如VC使用EXCEL功能&#xff0c;这时候我们就能直接通过VS2019到如EXCEL.EXE方式&#xff0c;生成对应的OLE头文件&#xff0c;然后直接使用功能&#xff0c;那么&#xff0c;我们上篇文章…

el-tabel实现拖拽排序

1、使用npm安装sortableJs插件 npm install sortablejs --save2、在需要使用的页面进行引入 import Sortable from sortablejs3、完整代码 <template><div class"home"><el-table :data"tableData" style"width: 100%"><…

【Docker】python flask 项目如何打包成 Docker images镜像 上传至阿里云ACR私有(共有)镜像仓库 集成Drone CI

一、Python环境编译 1、处理好venv环境 要生成正常的 requirements.txt 文件&#xff0c;我们就需要先将虚拟环境处理好 创建虚拟环境&#xff08;可选&#xff09;&#xff1a; 在项目目录中&#xff0c;你可以选择使用虚拟环境&#xff0c;这样你的项目依赖将被隔离在一个…

C++基础 -6-二维数组,数组指针

二维数组在内存中的存放方式和一维数组完全相同 下表把二维数组抽象成了行列形式方便理解 a[0]指向第一行首元素地址 a指向第一行的首地址 所以a地址和a[0]地址相同,因为起点相同 但a[0]1往右偏移 但a1往下方向偏移 方便理解 an控制行 a[0]n控制列(相当于*an) 数组指针指向二…

食材管家,轻松搞定!商户选择生鲜配送系统的原因

随着消费者对生鲜食品的需求不断增加&#xff0c;生鲜市场逐渐成为了电商领域中的热门行业。而生鲜配送系统&#xff0c;则是生鲜电商发展中不可或缺的一部分。本文将探讨商户选择生鲜配送系统的几个原因。 1. 提高效率 生鲜配送系统通过智能化的订单处理、路线规划和配送优化…

【MySQL系列】PolarDB入门使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

CF 1901A Line Trip 学习笔记

链接 传送门 代码 #include<bits/stdc.h> using namespace std;const int N60; int a[N]; int b[N];int main() {int t;scanf("%d",&t);while(t--){int n,x;scanf("%d%d",&n,&x);int mx0;for(int i1;i<n;i){scanf("%d",…

不用render_template函数,把html代码放在py文件里,不用单独写html文件

3.猜拳游戏&#xff1a;石头、剪刀、布的游戏 ##不用render_template函数&#xff0c;把html代码放在py文件里&#xff0c;不用单独写html文件 from flask import Flask, request import randomapp Flask(__name__)app.route(/) def index():#下面form标签虽然放在注释里&…

Scanner常用知识点

在Java中&#xff0c;Scanner类是用于读取用户输入的工具类&#xff0c;可以从多种输入源读取数据&#xff0c;如标准输入流、文件或字符串。以下是一些Scanner类的常用知识点&#xff1a; Scanner的初始化&#xff1a;在使用Scanner类之前&#xff0c;需要先将其导入到你的Ja…

vue 项目中使用 mqtt

1、在html 中用cdn方式引入 <script src"https://unpkg.com/mqtt/dist/mqtt.min.js"></script> 2、封装代码 mqtt_connect.js // import * as mqtt from mqtt/dist/mqtt.min // 不知道为什么 我用引入的方式不成&#xff0c;就在html 用的cdn方式接入了…

Pycharm在debug问题解决方案

Pycharm在debug问题解决方案 前言一、Frames are not available二、查看变量时一直显示collecting data并显示不了任何内容 前言 Pycharm在debug时总是出现一些恼人的问题&#xff0c;以下是博主在训练中遇到的问题及在网上找到的可用解决方案&#xff1a; 一、Frames are not…

C语言基础篇5:指针(二)

接上篇&#xff1a;C语言基础篇5&#xff1a;指针(一) 4 指针作为函数参数 4.1 指针变量作为函数的参数 指针型变量可以作为函数的参数&#xff0c;使用指针作为函数的参数是将函数的参数声明为一个指针&#xff0c;前面提到当数组作为函数的实参时&#xff0c;值传递数组的地址…

Java中的spring——面试题+答案(Spring Boot)——第20期

当涉及到Spring Boot的面试时&#xff0c;面试题通常涉及到Spring Boot的基本概念、自动配置、启动流程、常用注解等。 基本概念 什么是Spring Boot&#xff1f; 答案&#xff1a; Spring Boot是基于Spring框架的扩展&#xff0c;旨在简化Spring应用程序的开发和部署。它提供了…

算法通关村第十三关|青铜|数字与数学基础问题

1.数字统计专题 1.1 符号统计 原题&#xff1a;力扣1822. 只需要看有多少个负数&#xff0c;就足以判断符号了。 public int arraySign(int[] nums) {int prod 1;for (int i 0; i < nums.length; i) {if (nums[i] 0) {return 0;} else if (nums[i] < 0) {prod -p…

搭建你自己的网盘-个人云存储的终极解决方案-nextcloud (一)

在当今数字化时代&#xff0c;我们越来越多地依赖云存储来保存和共享我们的个人和工作文件。而自己搭建网盘不仅可以提供更大的存储空间和更高的隐私保护&#xff0c;还可以让我们完全掌控我们的数据。 在之前我分享过一个文件共享站-Pingvin Share 。 但是今天我将带来一个文件…