算法操作符和关系操作符

C语言第十五课:操作符详解(中)——单目、关系、逻辑、条件操作符 在上一篇文章中我们学习了算数、移位、位与赋值操作符的相关知识。本文我将继续按照顺序,带领小伙伴们继续学习单目、关系、逻辑、条件这些我们在编写代码时常用的操作符。 阅读详情

类设计如下:

class sales_item
{
public:
	friend istream& operator>>(istream&, sales_item&);
	friend ostream& operator<<(ostream&, const sales_item&);
	friend sales_item operator+(const sales_item& sale1, const sales_item &sale2);
	friend inline bool operator==(const sales_item&, const sales_item&); 
	friend inline bool operator!=(const sales_item&, const sales_item&); 
	friend inline bool operator<(const sales_item&, const sales_item&);

	//explicit sales_item(void); // 防止隐式转换
	sales_item(void) /*const*/;  //构造函数不能声明为const,默认构造函数
	~sales_item(void);

	sales_item(istream &is);
	sales_item(const string & book); //const可以避免形参被修改,引用可以避免复制实参
	sales_item(const sales_item &org); //复制构造函数
	
	//sales_item operator**(const sales_item &org); //error 不能通过连接其他合法操作符来创建任何新的操作符	
	//sales_item operator+(const int a, const int b); //error 必须至少提供一个类类型
	//sales_item operator+(const int b = 0); //error 不能有默认实参
	//sales_item operator+(const int b); //ok 默认this为类类型
	
	sales_item& operator=( const sales_item& );	
	sales_item& operator=( const string& );	//=可以重载
	sales_item& operator+=( const sales_item& );

	string GetISBN() const { return isbn; }
	int GetUnitsSold() const { return units_sold; }
	double GetRevenue() const { return revenue; }

	inline double avg_price() const; //这里声明为inline,定义处不必再声明
	bool same_ishn(const sales_item & rhs) const;	
	
private:
	string isbn;
	int units_sold;
	double revenue;
};
//非成员函数重载运算符
istream& operator>>(istream&, sales_item&); //输入
ostream& operator<<(ostream&, const sales_item&); //输出
sales_item operator+(const sales_item&, const sales_item&); //返回值不是引用,不能成为左值,也不能进行连加,如a+b+c
inline bool operator==(const sales_item&, const sales_item&); 
inline bool operator!=(const sales_item&, const sales_item&); 
inline bool operator<(const sales_item&, const sales_item&);

算术操作符

这里先看+操作符

sales_item operator+(const sales_item& sale1, const sales_item &sale2)
{
	sales_item rhs(sale1);
	rhs += sale2;
	return rhs;
}
这里只是字符串的连接,而且返回的不是引用,主要是为了内置操作符保持一致。一般定义了+,通常还要定义+=(这里+就是调用+=),复合赋值操作符通常定义为类的成员,如下

//操作符 +=
sales_item& sales_item::operator+=(const sales_item& item)
{
	isbn += item.isbn; //isbn:左操作数this->isbn
	units_sold += item.units_sold;
	revenue += item.revenue;
	return *this;
}
这样定义了+=之后,其实我们的+就可以直接调用类成员+=操作符,而不用再具体实现。

关系操作符

这里先看下相等操作符

bool operator==(const sales_item& sale1, const sales_item &sale2)
{
	return ((sale1.units_sold == sale2.units_sold) &&
		(sale1.revenue == sale2.revenue) && sale1.same_ishn(sale2));
}
主要是判定内置成员是否相等,定义了==也就要定义!=操作符了,如下

bool operator!=(const sales_item& sale1, const sales_item &sale2)
{
	return !(sale1 == sale2);
}
这里就是调用相等操作符

赋值操作符

1)赋值操作符可以重载,无论形参为何种类型,赋值操作必须定义为成员函数

	sales_item& operator=( const sales_item& );	
	sales_item& operator=( const string& );	//=可以重载
2)赋值必须返回对*this的引用,主要与内置类型一致,返回值是左操作数的引用。

sales_item& sales_item::operator=(const sales_item &item)
{
	isbn = item.isbn;
	units_sold = item.units_sold;
	revenue = item.revenue;
	return *this;
}


sales_item& sales_item::operator=(const string& str)
{
	isbn = str;
	units_sold = 0;
	revenue = 0;
	return *this;
}
这些之前就不再阐述,下面看
	sales0 = "hello sales_item"; //ok 重载形参为string类型的赋值操作符
	sales0 = 1; //error 未定义
	sales_item item5 = "sales"; //构造函数	
如下进项调试第二个就不行,因为默认没有定义int型形参的赋值操作符,第一个就可以,我们定义了形参为string的赋值操作符函数,第三个主要是为了区分,第三个其实应该调用形参为string类型的构造函数去初始化。

43、关系操作符详解 本博客详细介绍了编程中的关系操作符,包括其基本概念、常见操作符、应用场景以及使用时的注意事项。通过丰富的示例代码,讲解了关系操作符在条件语句、循环控制、数据验证、排序和搜索算法中的实际应用。同时,还探讨了浮点数、字符和指针等不同数据类型的比较方式,以及如何优化关系操作符的使用,帮助开发者编写更高效、可读性更强的代码。 阅读详情

相关推荐

【Java学习】关系操作符:5个关键点,你真的掌握了Java中的比较魔法吗?

定义:关系操作符用于比较两个值之间的关系,返回布尔值true或false。常见操作符等于==不等于!大于小于大于等于>=小于等于

java专栏 1042

C语言:关系操作符、逻辑操作符

本篇介绍C语言中关系操作符和逻辑操作符的使用规则,以及一些注意点。

weixin_44443904的博客 2350

CANoe进阶实战(第十一章)-LIN节点测试调度

《CANoe快速入门实战:LIN节点调度开发》摘要 本文是CANoe系列教程的第十一章,重点讲解如何通过CAPL编程实现LIN报文的灵活调度控制。文章采用"输入-输出-过程"三步骤法,详细介绍了调度表函数linChangeSchedTable()、启动/停止函数linStartScheduler()/linStopDisturbance()等关键API的使用方法。作者创新性地通过系统变量在Test节点间接控制Network节点的调度功能,并提供了完整的节点代码实现方案。最后的Trace窗

weixin_53605885的博客 1025

JavaScript高级程序设计读书笔记(第三章)(二)

JavaScript操作符

程序员青戈 524

用Python实现一个简单的远程桌面服务端和客户端

本文介绍了一个基于Python的轻量级远程桌面解决方案,针对商业软件在嵌入式系统上的兼容性问题、性能问题和成本问题。系统采用客户端-服务端架构,包含两个通信通道:5000端口传输压缩视频流,5001端口传输控制事件。通过多线程设计、图像压缩(JPEG+zlib)和网络优化(禁用Nagle算法)等技术手段提高性能。服务端实现了高效的屏幕捕获(使用mss库)、图像处理流水线和事件处理逻辑。客户端采用PyQt5构建UI界面,包含视频接收线程以减少主线程负担。该方案具有跨平台、开源免费、轻量级(核心代码不到500行

Hi20240217的博客 1666

英飞凌 AURIX Development Studio工程移植到Hightec的方法

1. 软件简介 AURIX™ Development Studio是英飞凌针对AURIX TC2XX/TC3XX系列单片机推出了一款免费的软件,集成了iLLD库,内置Tasking compiler和Tasking Debugger,但这两个模块只能用于非商业用途,可供学习和试用。iLLD库是英飞凌为TC2XX和TC3XX Tricore系列单片机提供的底层驱动库,有完善的使用手册,和较好的移植性。 Hightec是一款可以用来开发Aurix系列单片机的编译器,有免费版,可商用,集成GCC编译器,可用UDE

weixin_42967006的博客 7139

深入讲解各种操作符——关系、条件、逻辑

C语言当中用于比较的表达式,比较就代表了两个事物之间的关系,所以这种用于比较的表达式,“关系表达式”常见的关系运算符有以下六个>(大于)=(大于等于)

derive_magic的博客 1338

欧姆龙多PLC串行链接模式的应用

欧姆龙多PLC串行链接模式的应用 一、如何将两台CP1H进行串行PLC连接(PLC串行链接) 主机侧设定 从机侧设定 二、 如何实现编程通信 主机侧的【PC连接模式】为【全部】的时候 ① 主机会把自己的地址从3100开始,按照【链接字】设定的字数个数发送到每个从机的3100开始进行存储。 ② 从机会把自己的地址从31n0开始,按照主机侧参数【链接字】设定的字数个数发送到主机的31n0开始进行存储。 注:(n为从机的地址号,若从机号不连续,则该编号的地址将不被定义..

u014202847的博客 3091

C语言:操作符

条件操作符就是三目操作符,它是一个唯一一个需要三个操作数的运算符,它提供了一简洁的方法来根据条件返回不同的值。

hklhklhkhl123的博客 1675

具身智能与空天具身智能:从理论到实践的AIBOX技术革命

本文深入探讨了具身智能从理论到实践的发展,重点介绍了AIBOX技术如何作为边缘智能计算模块,为无人机、机器人等无人系统提供可进化的“大脑”。文章通过空天具身智能等应用场景,阐述了AIBOX在实现感知、决策、行动一体化闭环中的核心作用,并展望了其在协同智能与规模化部署中的未来挑战与机遇。

lll78的博客 768

玄机-Linux权限维持-后门

玄机-Linux权限维持-后门

m0_46439803的博客 767

14章重载操作符

为了程序看起来简洁,和方便,减少代码量,以及方便类类型操作像内置类型一样方便。于是,提出重载操作符。 14.1 重载操作符的定义 重载操作符是具有特殊名称的函数:保留字operator后接需定义的操作符号。 14.1.2 重载操作符必须具有一个类类型操作数 注意: 重载操作符必须具有至少一个类类型或枚举类型的操作数,这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义。 14.1.3 ...

weixin_39137699的博客 170

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

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

weixin_29304985的博客 419

第14章 重载操作符与转换(3)

14.3 算术操作符和关系操作符 一般而言,将算术和关系操作符定义为非成员函数。 为了与内置操作符保持一致,加法返回一个右值,而不是一个引用。 friend Class1 operator+(const Class1 &c1, const Class1 &c2);Class1 operator+(const Class1 &c1, const Class1 &c2) { Class1 c(

253

【YOLOv8-pose姿态识别部署至RK3588:模型训练到RKNN落地,让人体姿态分析精度与边缘推理速度双突破】

本教程从YOLOv8-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

FJN110的博客 331

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

第4课【C语言概述】选择语句 循环语句 函数 数组 操作符

目录基本知识框架课堂笔记 基本知识框架 课堂笔记 算法具有可行性,有穷性和确定性,利用顺序结构,选择结构和循环结构的函数可以解决很多复杂问题 逗号表达式,使用方法:(语句一,语句二,语句三…) ,顺序执行语句一二三,表达式的值为最后一个语句计算的值 按位与、按位或和按位异或操作符是在讲操作数转化成二进制的基础上进行的 逻辑取反!和按位取反~的区别 逻辑取反!:对于操作数的值,非0的值变为0,0变为1 按位取反~:对二进制下的操作数进行按位取反,0变为1,1变为0 赋值操作符和关系操作符中&lt

PORKWOTONLEE的博客 212

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JavaScript中null == 0 为false , null >= 0 为 true

在'==' 判断规则中null 和undefined 不能转化成其他类型。 在关系操作符,如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较

qq_54140719的博客 1590

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

c语言学习_操作符3

以此为例,sizeof计算的是数组的长度,在主函数中两个sizeof输出的数字都为10。而数组传参给test1,test2函数时,本质是传递数组首地址,此时sizeof计算类型长度,即一个指针变量的大小。= 用于测试“不相等”== 用于测试“相等”1、sizeof和数组之间的关系。比较简单,有一下几个。

2503_92081985的博客 35

C语言中的分支和循环语句 ( 1 )

绪论:C语言是一门结构化的程序设计语言,主要有三个结构,分别是:顺序结构、选择结构、循环结构。我们日常所见的事情都可以拆分为这三种结构或者这三种结构的组合。可以使用if、switch来实现分支结构,使用for、while、do while来实现循环结构。

Ding_xiaomin_的博客 197

C++ Reference: Standard C++ Library reference: Containers: forward_list: forward_list: operators

C++ Reference: Standard C++ Library reference: Containers: forward_list: forward_list: operators

weixin_客子光阴的博客 101

分支和循环2

本节针对分支和循环1,举了一些简单基础的练习题,在这里我分为知识点型,找规律型,代码实现型

SilentPages的博客 675

在for循环中,为什么c++程序员习惯于使用!=而不用<

c++程序员经常会用到标准库的内容。标准库中的类及泛型算法大多数定义为模板类以及模板函数,他们的实例化版本是否合法取决于用做模板实参的类型是否支持模板所要求的操作。对于用做模板实参的类型而言,支持相等操作(==和!=)的可能性比支持关系操作(如

wo17fang的专栏 723

前端-JS流程控制语句复习

流程控制语句 前置知识点: 1.关系操作符(>,<,<=,>=) let result = 5>3; //true let result2 = 5<3; //false //特殊用法 let result3 = "book" <"apple"; //比较的是首字母的ASCII编码 let result4 = "23" < "3"; //true //同上 let result5 = "23" < 3; //false 如果有一方是数字

敦煌壁画的博客 316

【野火FPGA】Verilog的基本语法-笔记-1

初识Verilog HDL Verilog HDL的简介 Verilog HDL 是一种硬件描述语言,以文本的形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能 Verilog相比VHDL Verilog 语法自有,易学易用 适合算法级、门级设计 代码简洁 发展较快 VHDL 语法严谨,难以上手 适合系统级设计 代码冗长 发展缓慢 Verilog 基础语法 逻辑值 0:逻辑低电平,条件为假 1:逻辑高电平,条

yanyonglin123的博客 1070

c语言操作符介绍(1. 算术操作符2. 关系操作符(比较操作符)3. 逻辑操作符4. 位操作符5. 赋值操作符6. 条件(三元)操作符7. 其他操作符8. 递增和递减操作)

这些操作符在C语言中起着至关重要的作用,它们允许程序员执行各种计算和操作,从而构建复杂的程序。请注意,操作符的优先级和结合性也是非常重要的概念,它们决定了在表达式中操作符的执行顺序。总的来说,C语言操作符的应用场景非常多样,几乎涵盖了所有需要计算、比较、赋值和逻辑判断的编程任务。熟练掌握这些操作符的使用方法和应用场景,对于编写高效、健壮的C语言程序至关重要。C语言中的操作符是用于执行各种运算和操作的符号。C语言操作符的应用场景非常广泛,涵盖了从基础编程到复杂系统开发的各个方面。

xiaoheshang_123的博客 2615

C++面向对象操作符重载:算术操作符和关系操作符

1、算术操作符包括 :+、-、*、/、%(求余),-=,+=...        逻辑运算符主要包括:、==,&&,|| 2、算术运算符和关系操作符要定义为非成员函数,这是因为上述的运算符均为双目运算符,且运算结束后返回的不是对象本身。 3、算术运算符一般返回一个值的拷贝,如果一定要返回某个值的引用,请一定返回const引用,因为引用可以当做左值,返回const引用,可以避免误操作。 co

飞来飞去的博客 603
上一篇: 输入和输出重载操作符
下一篇: 下标操作符
comwise
博客等级 码龄15年 58粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值