条款6:区别increment/decrement操作符的前置和后置形式

条款 6:区别 increment/decrement 操作符的前置(prefix)和后置(postfix)形式 语法上:前置 operator++(),后置 operator++(int)(int 是哑元)。返回值上:前置返回 T&(自身引用),后置返回 const T(旧值副本)。性能上:后置必有拷贝开销,能不用就不用。设计意图:保持与内置类型一致的语义和限制,让自定义类型也能配合泛型代码预期。 阅读详情

//前置式:累加然后取出(increment and fetch)

//前置式返回一个reference
UPInt& UPInt::operator++()
{
    *this+=1;   //累加
    return *this;   //取出 
}

//后置式:取出然后累加(fetch and increment)

const UPInt UPInt::operator++(int)
{
    UPInt oldValue=*this;   //取出 
    ++(*this);  //累加 
    return oldValue;    //返回先前被取出的值 
}

扩展1:函数返回引用类型?

1.当函数返回引用类型时,没有复制返回值。相反,返回的是对象本身。
2.返回引用,要求在函数的参数中,包含有以引用方式或指针方式存在的,需要被返回的参数。
3.千万不要返回局部对象的引用或指针。当函数执行完毕时,将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。返回指向局部对象的指针也是一样的,当函数结束时,局部对象被释放,返回的指针就变成了不再存在的对象的悬垂指针。
4.引用返回左值
5.由于返回值直接指向了一个生命期尚未结束的变量,因此,对于函数返回值(或者称为函数结果)本身的任何操作,都在实际上,是对那个变量的操作,这就是引入const类型的返回的意义。当使用了const关键字后,即意味着函数的返回值不能立即得到修改!

扩展2:函数返回const?

1.const用于修饰函数时,一般是const修饰类的成员函数(函数定义体),表示在函数体中成员变量不能改变; 任何不会修改数据成员(即函数中的变量)的 函数都应该声明为const 类型。如果在编写const
成员函数时,不慎修改了数据成员,或者调用了其它非const 成员函数,编译器将指出错误,这无疑会提高程序的健壮性。
2.如果给以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
3.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。

后置式操作符并未动用其参数,其参数的唯一目的只是为了区别前置式和后置式而已。

后置式操作符必须返回一个对象代表旧值,但为什么是个const对象?
如果不这样,以下动作是合法的:

UPInt i;
i++++;  //实施“后置式increment操作符”两次

这和以下动作相同:

i.operator++(0).operator(0);

这说明operator++的第二个调用动作施行于第一个调用动作的返回对象身上。
两个理由使我们不欢迎这样的情况:
1.它和内建类型的行为不一致:int并不允许连续两次使用后置式increment操作符;
2.第二个operator++所改变的对象是第一个operator++返回的对象,而不是原对象。所以即使上述行为合法,i也只是被累加一次而已。这是违反直觉的,也容易引起混淆。

后置式函数必须产生一个临时对象,作为返回值使用,需要构造也需要析构。前置式函数就没有如此的临时现象。所以单以效率而言,尽可能地使用前置式,养成使用前置式操作符的习惯。类似地,养成复合赋值操作符的习惯。

如何确定后置式的行为与前置式的行为一致?遵循这个原则:后置式操作符的实现应以其前置式兄弟为基础。如此一来,你就只需要维护前置式版本,因为后置式版本会自动调整为一致的行为。

ESP32设备驱动-直流电机与L298N电机驱动器 在本文中,我们将介绍如何使用ESP32通过L298N电机驱动器驱动直流电机。 阅读详情

相关推荐

dify工作流的原理

摘要: Dify 工作流是一个基于有向无环图(DAG)的智能任务编排系统,支持多节点(如LLM调用、API工具、条件分支等)的可视化拖拽与流程编排。其核心原理包括执行引擎(解析DAG并管理节点依赖)、上下文变量传递(类Jinja模板的变量引用机制)和状态持久化(存储执行日志与中间结果)。工作流通过事件驱动执行,支持异步任务调度,并与RAG知识库、LLM服务等模块深度集成,最终可发布为API或对话应用。技术栈基于Python(FastAPI+Celery)和PostgreSQL,实现低代码化的AI应用开发。

nbspzs的专栏 2187

条款六:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别

条款六:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别   很久以前(八十年代),没有办法区分++和--操作符的前缀与后缀调用。这个问题遭到程序员的报怨,于是C++语言得到了扩展,允许重载increment 和 decrement操作符的两种形式。  然而有一个句法上的问题,重载函数间的区别决定于它们的参数类型上的差异,但是不论是increment或decre

DX 1922

Word中 Go to endnote 出现闪退问题解决办法

Word中 Go to endnote 出现闪退问题解决办法

努力努力努力 1万+

《深入理解Java虚拟机》3.高效并发_线程安全与锁优化

线程安全与锁优化

KKK 2263

实战分享:如何用Java调用Doris FE接口实现高效Stream Load数据导入(附完整代码)

本文详细介绍了如何通过Java调用Doris FE接口实现高效的Stream Load数据导入,包含完整代码示例和性能优化技巧。Stream Load作为Doris的高效数据导入方式,相比传统JDBC提升5-10倍速度,适用于大规模数据处理场景,帮助开发者解决高吞吐量数据导入挑战。

weixin_29304985的博客 419

4.无限共轭距柯克物镜设计——zemax学习笔记

无限共轭cooker物镜

fly_daerm的博客 1596

More Effective C++ 条款6 (转)

More Effective C++ 条款6 (转)[@more@]条款6:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别XML:namespace prefix = o ns = "urn...

csd3176的博客 164

Overloading the increment and decrement operators (非常好)

原文: http://www.learncpp.com/cpp-tutorial/97-overloading-the-increment-and-decrement-operators/Overloading the increment (++) and decrement (--) operators are pretty straightforward, with one small exception. There are actually two versions of the increment

yang_lang的专栏 1053

【系统分析师】2025年下半年真题:综合知识-答案及详解(回忆版)

本文摘要包含系统分析师考试相关题目解析,主要涵盖软件工程、数据库、网络协议和项目管理等知识点。内容包括:软件再工程与逆向工程的区别(D);GNU GPL开源协议特性(A);TCP/IP协议分层(A、B);数据库范式判定(A、B);前导图进度管理工具(C);系统规划中的数据类识别方法(B、D);关系代数除运算(C);CMM优化级特征(A);回归测试重要性(C)。这些解析帮助理解核心概念和考试重点。

数据知道的博客 6717

高通SDX55平台:5G速率问题排查分析方法

和大家分享一下高通5G平台5G速率问题排查分析方法。

四儿家的小祖宗的博客 5220

自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别

很久以前(八十年代),没有办法区分++和--操作符的前缀与后缀调用。这个问题遭到程序员的报怨,于是C++语言得到了扩展,允许重载increment 和 decrement操作符的两种形式。然而有一个句法上的问题,重载函数间的区别决定于它们的参数类型上的差异,但是不论是increment或decrement的前缀还是后缀都只有一个参数。为了解决这个语言问题,C++规定后缀形式有一个int类型参数,当

zhtsh的专栏 1351

AI上推荐 之 AutoInt模型(Transformer开始玩特征交互)

1. 写在前面 这段时间做优化模型的事情,正好和特征交互有关系,这个也是推荐系统里面一直探索的一个方向,从浅层模型的FM, FFM, HOFM, FwFM到深层模型的DNN, PNN, NFM, AFM, DeepFM, DCN, xDeepFM, FiBiNet等,而这次正好借着这次机会, 多看一些有关于特征交叉方向的模型paper, 把一些新的模型或者较为前沿的思想融入进来。 上一篇的FiBinet模型就是在特征交互上一个非常有意思的探索, 通过SENET动态选择有用的交互特征, 然后再用一个双线性交互

Miracle8070 5724

More Effetive C++(条款6:区别increment/decrement操作符的前置(prefix)和后置(postfix)形式)

1、C++中允许++ 和-- 操作符的前置和后置两种形式具有重载的能力。而重载是以参数类型来区分的,然而不论是++ 还是 -- 的前置或后置均没有参数,为了区分这两种不同的操作,只好让后置式有一个int自变量,并且在它调用的时候,编译器默认给该int指定一个0值。例:class Char { public: Char& operator++ (); ...

Unique-You的博客 482

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

读书笔记: More Effective ++ 操作符 条款6,区别increment/decrement操作符的前置(prefix)和后置(postfix)的形式

前置操作符,++x,--x, 返回的是引用 后置操作符,x--,x++, 返回的是const的值。 C++是靠依据输入参数的类型(型别)的不同来区别不同的重载函数, 因此前置的重载函数没有入参,而后置参数有入参,该参数不参与函数内的逻辑运算,仅仅作为区别不同的重载函数而已。 UPInt &UPInt::operator++() {        *this += 1;

yes_sir_yes的专栏 507

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MEC | 条款6 区别累加累减操作符的前置和后置形式

函数必须产生1个临时对象,用作返回值,该临时对象需要构造,也需要析构。后置式操作符并未调用其入参,该入参唯一的作用就是区别前置式和后置式。但从效率而言,前置式 不需要多创建1个对象,就能完成自身数值变化。当我们故意省略入参的名称时,编译器就不会对未使用的入参发出警告。的第二个调用动作施行于第一个调用动作的返回对象,而。返回1个对象,因为该对象存储的是累加之前的旧值。自变量,并且在它被调用时,编译器默默地为该。操作符,它们都是将某个值累加。是允许的,改变的都是原对象。,则可以进行2次累加,但是。

RandyOliver's House 197

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

More Effective C++之6

条款6:区别increment/decrement操作符的前置(prefix)和后置(postfix)形式       在C++中提供了increment/decrement操作符的重载。class A{       A& operator++();                 //++i       const A& operator++(int);     //i++

李永亮的专栏 823

More Effective C++----(6)自增、自减操作符前缀形式和后缀形式的区别

Item M6:自增、自减操作符前缀形式和后缀形式的区别 很久以前(八十年代),没有办法区分++和--操作符的前缀与后缀调用。这个问题遭到程序员的报怨,于是C++语言得到了扩展,允许重载increment 和 decrement操作符的两种形式。 然而有一个句法上的问题,重载函数间的区别决定于它们的参数类型上的差异,但是不论是increment或decrement的前缀还是后缀都只有一个参

烽火前秦路 1033

自增(increment)、自减(decrement)操作符前缀与后缀形式的区别

很久以前(八十年代),没有办法区分++和--操作符的前缀与后缀调用。这个问题遭到程序员的报怨,于是C++语言得到了扩展,允许重载increment和 decrement操作符的两种形式。   然而有一个句法上的问题,重载函数间的区别决定于它们的参数类型上的差异,但是不论是increment或decrement的前缀还是后缀都只有一个参数。为了解决这个语言问题,C++规定后缀形式有一个int类

陈云峰技术博客 1612

操作符(条款5-8)

more effective C++ 操作符

lichao_n的博客 122

《More Effective C++》重点摘要二:操作符

对定制的“类型转换函数”警觉。两种函数允许编译器执行类型转换:1)单变量constructors;2)隐式类型转换操作符。第一种函数可以是明确只有一个单变量的constructor,也可以是拥有除第一个参数外其他参数有默认值的constructor。当编译器发现需要某个类型的对象而实际得到的对象类型不匹配时,它会尽力搜索一种能够执行转换的方式,这个时候以得到的实际类型对象为参数的单变量constru

爱拍球的程序圆 700

More Effective C++之Item M6:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别

很久以前(八十年代),没有办法区分++和--操作符的前缀与后缀调用。这个问题遭到程序员的报怨,于是C++语言得到了扩展,允许重载increment 和 decrement操作符的两种形式。 然而有一个句法上的问题,重载函数间的区别决定于它们的参数类型上的差异,但是不论是increment或decrement的前缀还是后缀都只有一个参数。为了解决这个语言问题,C++规定后缀形式有一个int类型参数

janeqi1987的专栏 454

【读书笔记】【More Effective C++】操作符(Operators)

【读书笔记】【More Effective C++】操作符(Operators)。

做一些记录工作。 464

More Effective C++ 条款6 区别 increment/decrement 操作符的前置(prefix)和后置(postfix)形式...

1. 由于前自增和后自增操作符都是一元运算符,因此重载时通过在后自增中加一个int型参数(哑元参数)加以区分,当后自增被调用时,编译器自动在为该参数指定一个0值。 2. 前自增操作符返回调用它的对象的引用,后自增操作符返回const 临时对象 3. 由于前自增是返回的是原对象的引用,因而可以执行类似于++++a这样的式子; 但是后自增返回的是调用后自增操作符之前的对象的副本...

ddzai7557的博客 189

【more effective c++读书笔记】【第2章】操作符(1)

条款5:对定制的“类型转换函数”保持警觉 1、两种函数允许编译器执行隐式转换:单自变量constructor 和隐式类型转换操作符。单自变量constructor是指能够以单一自变量成功调用的constructor,这样的constructor可能声明拥有单一参数,也可能拥有多个参数,并且除了第一参数之外都有默认值。隐式类型转换操作符,是一个拥有奇怪名称的member function:关键词o

ruan875417的专栏 521

MoreEffectiveC++Item35(操作符)(条款5-8)

条款5 对定制的"类型转换函数"保持警惕 条款6 区别increment/decrement操作符的前值和后置形式 条款7 千万不要重载&&,||,和,操作符 条款8 了解不同意义的 new 和 delete 条款5 对定制的"类型转换函数"保持警惕 1.C++有默认类型转换,如 int---char 2.单自变量constructors(能够...

weixin_37408859的博客 167
上一篇: 条款5:对定制的“类型转换函数”保持警觉
下一篇: 条款7:千万不要重载&&,||和,操作符
Nim的辙迹
博客等级 码龄10年 17粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值