条款7:千万不要重载&&,||和,操作符

C++ html解析库htmlcxx常见使用报错解决方法 htmlcxx是C++中解析html格式数据的第三方库,不过这个库存在以下Bug,下面将给出我在使用过程中遇到的Bug以及解决方法,请先阅读我的博客 C++爬虫工具之html解析库htmlcxx(附VS2019环境搭建详细过程),介绍了htmlcxx项目本地编译过程,以及vs中环境搭建过程。 报错1、编译htmlcxx项目时报错util.cc文件的17行中“常量中有换行符” 解决方法:将util.... 阅读详情

C++对于“真假值表达式”采用所谓的“骤死式”评估方式。意思是一旦该表达式的真假值确定,即使表达式中还有部分尚未检验,整个评估工作仍告结束。

如果在global scope或是在每个class内对operator&&和operator||两函数进行重载工作,那么“函数调用 语义”会取代“骤死式 语义”。
也就是说,下面这个式子:

if(expression1 && expression2) ...

会被编译器视为以下两者之一:

if(expression1.operator&&(expression2)) ...
    //假设operator&&是个member function
if(operator&&(expression1,expression2)) ...
    //假设operator&&是个全局函数

这将产生重大的区别:
1.当函数调用动作被执行,所有参数值都必须评估完成,所以当我们调用operator&&和operator||时,两个参数都已评估完成。换句话说没有什么骤死式语义。
2.C++语言规范并未明确定义函数调用动作中各参数的评估顺序,所以没办法知道expression1和expression2哪个会先被评估。

所以,如果你将&&和||重载,就没有办法提供程序员预期的某种行为模式。所以请不要重载&&或||。

C++同样也有一些规则来定义逗号操作符(,)面对内建类型的行为。表达式中如果内含逗号,那么逗号左侧会先被评估,然后逗号的右侧再被评估;最后,整个逗号表达式的结果以逗号右侧的值为代表。

如果把操作符写成一个non-member function,你绝对无法保证左侧表达式一定比右侧表达式更早被评估,因为两个表达式都被当做函数调用时的自变量,传递给该操作符函数,而你无法控制一个函数的自变量评估顺序。
而将操作符写成一个member function,你仍然不能保证逗号操作符的左操作数会先被评估,因为编译器并不强迫做这样的事情。所以不要轻率地将它重载。

你不能重载以下操作符:

 .      .*      ::      ?: 
 new    delete  sizeof  typeid
 static_cast    dynamic_cast    const_cast  reinterpret_cast

你可以重载的操作符有:

operator new operator delete
operator new[] operator delete[]
+ - * / % ^ & | ~ ! = < > += -= *= /= %=
^= &= |= << >> >>= == != <= >= && ||
++ – , ->* -> () []

而只因为可以重载这些操作符,就毫无理由地去进行,是没有道理的。
如果你没有什么好理由将某个操作符重载,就不要去做。

条款7:千万不要重载 &&,|| 和 , 操作符 操作符内置核心语义重载后变成&&短路,严格从左到右,右侧可能不执行函数调用,两边必然全执行,顺序不定严格从左到右顺序求值,返回最右值函数调用,求值顺序不确定这三条语义是 C++ 程序安全、可预期的基石。一旦重载,你无法在代码里一眼判断出“这是内置的还是重载的”,可读性与正确性同时崩塌。 阅读详情

相关推荐

表达式 Expression

用于表达式计算,如果用户自己添加界面,可以模仿微软计算器,另外,用户可进一步扩展,以支持程序中的变量-

Expression: c >= -1 && c <= 255

Line: 36。

本博客仅供免费阅读,不提供咨询服务。请勿私信。 2677

c语言程序调试方法整理

在本篇文章里小编给大家正里的是关于c语言程序调试方法整理内容,需要的朋友们可以学习下。

C&&C++的异常处理(一)

异常的概念 --程序在运行过程中可能产生异常 --异常(Exception)与错误(Bug)的区别 异常是程序运行时可预料的程序执行分支 Bug是程序中的错误,是不被预期的运行方式 异常和Bug的对比:     --异常 运行时产生除0的情况需要打开的外部文件不存在 数组的越界访问          --Bug 使用野指针堆数组使用后未释

Corlin Blog 936

【Labview学习】——如何实现软件的中/英文切换

各位亲爱的小伙伴们大家好,这里是小万的labview专题,今天为大家带来的是软件的中/英文切换,在全球化的浪潮之下,各行各业发生着巨大的变化,emmm………… 以下是简单的演示图片,注意观察菜单栏和软件界面各控件的语言状态: 本次分享将分为两部分:菜单中英文切换&界面控件中英文切换 ** 菜单中英文切换 ** 1. 中/英文菜单制造 要想实现菜单的中/英文语言切换,就得做两个菜单,一个...

weixin_44827166的博客 1万+

PSIM+PIL+CCS三剑客:手把手教你搞定DSP28335的软硬件联合调试

本文详细介绍了如何利用PSIM、PIL与CCS三款工具,实现DSP28335的软硬件联合调试。通过搭建兼容环境、从PSIM仿真生成PIL代码,再到实战联合调试与问题诊断,手把手指导开发者构建从虚拟模型到实际硬件的完整验证闭环,有效提升电力电子与电机驱动等领域的开发效率与可靠性。

weixin_29183637的博客 186

c语言程序不报错但是调试不成功,程序一直DEBUG不成功

该楼层疑似违规已被系统折叠隐藏此楼查看此楼这是给的提示Debug Assertion Failed!Program: ...s\documents\visual studio 2012\Projects\sdasd\Debug\sdasd.exeFile: f:\dd\vctools\crt_bld\self_x86\crt\src\isctype.cLine: 56Expression: c ...

weixin_39578457的博客 1603

Python经常遇到导入xlwings就出错,如何解决

Python经常在导入xlwings时遇到错误。有人建议尝试重装或升级xlwings,但这些操作后仍然无法解决导入错误问题。

felix_8的博客 1740

More Effective C++ 条款7 千万不要重载&&,||和,操作符

1. 内置的&&和||操作符有"短路求值"的特性。对于&&如果第一个操作数为真,那么&&即返回为真,不再对第二个操作数进行求值,||则相反,利用这个特性可以写出下面的代码: char *p; ... if(p>0&&strlen(p)>10) ... View Code 一旦进行重载,&a...

ddzai7557的博客 173

ADS软件操作(8)——负载牵引(Loadpull)

负载牵引:通过不断调节输入和输出端的阻抗,找到让有源器件输出功率最大的输入、输出匹配阻抗。这种方法可以准确地测量出器件在大信号条件下的最优性能,反映出器件输入、输出阻抗随频率喝输入功率变化的特性,为器件和电路的设计优化提供了坚实的基础。白话版:由于通信制式越来越复杂,对放大器的线性度和效率要求越来越高。由于放大器的效率和是个永恒的矛盾,所以如何平衡这样的矛盾达到系统设计的最优就是一个需要解决的难题。如何解决?调节输入和输出端的阻抗也就是负载牵引 (Load-Pull)原理來改善点,从而降低谐波的。

Zhuanzhuyan的博客 4954

ros2笔记-4.6使用launch启动脚本

ros2 4.6 使用launch启动多节点

bohu83的博客 1311

More Effective C++(条款7:千万不要重载&&,||,和,操作符)

1、C/C++语言对于逻辑表达式具有“逻辑短路”的性质,即一旦确定了真假值,表达式中即使有尚未检查的部分,都将返回。内置的&amp;&amp;和||操作符有"短路求值"的特性。对于&amp;&amp;如果第一个操作数为假,那么&amp;&amp;即返回为真,不再对第二个操作数进行求值,||一旦第一个操作数为真,不再对后面操作数求值,利用这个特性可以写出下面的代码:char *p; if ((p !...

Unique-You的博客 304

数理逻辑1 -- 命题演算1

一直对逻辑的东西很感兴趣,尤其最近做的东西和AI相关,因此下定决心系统地学习数理逻辑。这些笔记并不是严谨的描述,只是作为一些概念的快速参考,以及加入一些个人认为好玩的公式、定理和推导。 简单来说,数理逻辑系统是由一串“符号”组成的系统,基本元素是那一堆“符号”,由“符号”组成“式子”。逻辑系统并不关心“式子”是否对错,只关心“式子”是否存在,也即是假定存在某些“式子“,再确定”推导规则“(Rule

Jason渣神的专栏 1831

More Effective C++之操作符operators

可加以重加载的操作符overloadable operators,它让我们所定义的类型有着和C++内建类型一样的语法,允许我们在“操作符背后的支撑函数”内放置威力强大的手段,那是内建类型不可能有的待遇。当然,“可让诸如‘+’和‘==’符号做任何事情”这个事实,也意味着我们可能利用重载操作符写出一些令人难以理解的程序。成熟的C++程序员知道如何驾驭操作符重载的强大威力,不落入令人费解的沉沦中。可叹的是,稍有不慎,便向下沉沦。

chnming1987的博客 1212

2006NOIP普及组真题 4. 数列

从上述推理中,我们发现要输出的幂次和中的第 N 项(也就是幂次和中的序号N),对应的二进制位数和幂次和对应的二进制位数相同。当 k=3 时,k的幂次为1, 3, 9, 27, 81…,即第0位,第2位均为1,转成 k 进制(k=3)时。,即第2位,第3位均为1,转成 k 进制(k=3)时。转成 k 进制(k=3)时的幂次和为。,即第0位,第1位,第2位均为1,(即第0位,第1位,第2位均为1)N=12时,12的二进制是。(即第0位,第2位均为1)(即第2位,第3位均为1)结论:这道题就变成了。

weixin_40252159的博客 1514

华为od统一考试B卷【单词搜索】C++ 实现

找到它是一个小游戏,你需要在一个矩阵中找到给定的单词。假设给定单词 HELLOWORD,在矩阵中只要能找到 H->E->L->L->O->W->O->R->L->D连成的单词,就算通过。意区分英文字母大小写,并且您只能上下左右行走,不能走回头路。

MISAYAONE的博客 710

第二章 操作符(Operators)(二)

短路求值丢失&&和||重载后,无论左侧结果如何,右侧表达式都会被求值,违背 C++ 原生语义,极易导致逻辑错误(比如右侧有修改变量、访问空指针等副作用时)。求值顺序失控:重载后的&&||会被当作普通函数调用,参数求值顺序由编译器决定,而非原生的 “左到右” 固定顺序,程序行为不可预测。无任何益处:重载这三个运算符无法带来任何实际好处,反而会破坏代码的可读性和行为一致性,因此建议永远不要重载它们。

weixin_45144862的博客 666

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

做一些记录工作。 464

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

条款7:千万不要重载&&,|| 和, 操作符 1、C++对于“真假值表达式”采用“骤死式”评估方式:一旦表达式的真假值确定,即使表达式中还有部分尚未检验,整个评估工作仍告结束。 例子: char* p; ... if ((p != 0) && (strlen(p) > 10)) ... 不用担心调用strlen时p是否为null指针,因为如果p != 0是否定的,strlen就绝

ruan875417的专栏 402

《More Effective C++ 35个改善编程与设计的有效方法》——第二章笔记

重载操作符可能会造成难以理解的错误,需要注意 条款5:对定制的类型转换函数保持警觉 C++允许编译器在不同类型间执行隐式转换,对自定义类型的转换可以进行控制。 两种函数会允许编译器执行这样的转换:单自变量构造函数和隐式类型转换操作符。 单自变量构造函数指能够以单一自变量成功调用的构造函数,可能拥有单一参数,也可能有多个参数且除第一个参数外都有默认值。 隐式类型转换操作符:关键词o

爱很遥远 567

More Effective C++笔记(一)(精心整理)

一、基础议题 条款1:仔细区别pointers和references 指针使用*和->,引用使用“.” 引用必须指向一个已初始化的对象,不能为null,而指针可以指向某个对象,也可以为null 指针可以被重新赋值指向另一对象,而引用不可变更指向。 条款2:最好使用C++转型操作符 使用C++的转型操作符可以被很好的辨识,精确指明意图。 static_cast:基本拥有与C旧式转型相同的威力,以及相同限制。几乎什么都可以转,但是不能将struct转int,double转指针,不能移除常量性。

m0_49688739的博客 281

《More Effective C++》总结笔记(一)——基础议题、操作符

基础议题 条款1:仔细区别pointers和references 首先你必须认知一点,没有所谓的 null reference。 由于reference一定得代表某个对象,C++因此要求references必须有初值。 Pointers和references之间的另一个重要差异就是,pointers可以被重新赋值,指向另一个对象,reference却总是指向(代表)它最初获得的那个对象。 结论:当你知道你需要指向某个东西,而且绝不会改变指向其他东西,或是当你实现一个操作符而其语法需求无法由pointers

吴尼玛cs 291

More Effective C++之7

条款7:千万不要重载&&,||和.操作符       关于&&和||的瞬间死亡定律是C++的基本准则。所以重载会破坏这个准则。而.包含的含义很多,没有什么必要的话,也不要重载。同样的警告包括. | .* | :: | ?: | new | delete | sizeof | typeid | static_cast | dynamic_cast | const_cast | reinterpr

李永亮的专栏 734

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

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

weixin_37408859的博客 167

More Effective C++:2、操作符

“可加以重载的操作符(overload operators)”,啊哈,你一定爱死它了。它让你所定义的类型有着和 C++ 内建类型一样的语法,允许你在 “操作符背后的支撑函数” 内放置威力强大的手段,那是内建类型不可能有的待遇。当然,“可让诸如 ‘+’ 和 ‘==’ 符号做任何事情” 这个事实,也意味着你可能利用重载操作运算符写出一些令人难以理解的程序。成熟的 C++ 程序员知道如何驾驭操作符重载的...

qq_30534935的博客 193

Effective C++ 的52个条款列表

 第一章 从C转向C++条款1:尽量用const和inline而不用#define条款2:尽量用而不用条款3:尽量用new和delete而不用malloc和free条款4:尽量使用c++风格的注释第二章 内存管理条款5:对应的new和delete要采用相同的形式条款6:析构函数里对指针成员调用delete条款7:预先准备好内存不够的情况条款8: 写operator new和operator del

595
上一篇: 条款6:区别increment/decrement操作符的前置和后置形式
下一篇: 数据结构--无向图的邻接多重表存储结构
Nim的辙迹
博客等级 码龄10年 17粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值