C++重载相等运算符operator==的两种方式

C++之operator operator是C++关键字之一, 称为重载运算符(也称“重载操作符”)。所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。 例如,+号可以对不同类型(int、float 等)的数据进行加法操作;<<既是位移运算符,又可以配合cout向控制台输出数据。C++本身已经对这些运算符进行了重载。C++也允许程序员自己 阅读详情
AI摘要

本文探讨了C++中重载相等运算符的多种方式,包括作为类成员函数和全局函数,并解析了类成员函数访问私有成员的机制。通过实例代码展示了成员函数与全局函数的调用优先级,以及成员函数如何直接访问传入对象的私有成员。

最近复习了一下C++的一些基础知识,发现之前理解得不够深刻,或者当时只是简单过了一遍,复习的时候,有了一些新的收获。闲言少叙,书归正文:

问题:
C++的重载相等运算符operator==可以写成类成员函数,也可以写成全局普通函数,请问这对于同一个类型的两种重载相等运算符可以同时存在么?如何可以,那么它们的调用优先顺序是怎么样的?

我们还是用一个例子来说明:

#include <iostream>

class Person
{
private:
	int m_age;
public:
	Person(int nAge)
	{
		this->m_age = nAge;
	}

	int age() const
	{
		return m_age;
	}

	bool operator==(const Person& other)
	{
		std::cout << "call member function operator==" << std::endl;
		if (this->m_age == other.m_age)  //m_age不是私有成员变量么,为什么这样里可以直接写other.m_age?
		{
			return true;
		}
		return false;
	}
};

bool operator==(const Person& one, const Person& other)
{
	std::cout << "call normal function operator==" << std::endl;
	if (one.age() == other.age())
	{
		return true;
	}
	return false;
}

int main()
{
	Person p1(10);
	Person p2(10);

	if (p1 == p2)
	{
		std::cout << "p1 is equal with p2." << std::endl;
	}
	else
	{
		std::cout << "p1 is not equal with p2." << std::endl;
	}

	getchar();
	return 0;
}

运行结果:
在这里插入图片描述

如果注释掉
在这里插入图片描述
那么运行结果是什么?
在这里插入图片描述
C++重载相等运算符调用优先顺序:类成员函数 > 全局普通函数

如果某个类在逻辑上有相等性的含义,则该类应该定义operator==,这样做可以使得用户更容易使用标准库算法来处理这个类。

如果类定义了operator==,则这个类也应该定义一个operator!=,对于用户来说,当他们能使用==时,肯定也希望能使用!=,反之亦然。

现在又引出了另外一个问题:

在类成员函数

bool operator==(const Person& other)

中

if (this->m_age == other.m_age)  
//m_age不是私有成员变量么,为什么这样里可以直接写other.m_age?

实践证明,类(class)私有成员可以被类成员函数访问,不区分成员在哪个实例(instance)里。

也就是说,在类内部的成员函数中,哪怕是传入的对象,也是可以直接访问该对象的私有成员。(前提是该对象必须是本类型的一个对象)

这样类对象可以直接访问私有成员就合情合理了,而且这么做也确实是方便的。

在重载运算符时,类的对象可以直接访问私有成员解惑

如果大家想对其中的原因了解得更加详细的话,可以查看这篇博客:

C++类成员函数可以访问同类不同对象的私有成员

引用C++标准原文

A member of a class can be — private; that is, its name can be used
only by members and friends of the class in which it is declared. —
protected; that is, its name can be used only by members and friends
of the class in which it is declared, and by members and friends of
classes derived from this class (see 11.5). — public; that is, its
name can be used anywhere without access restriction.

访问限制标号是针对类而不是针对一个类的不同对象,只要同属一个类就可以不用区分同一个类的不同对象。因为 是类的成员函数,所以有权限访问私有数据成员。如果是在main函数中直接,那肯定就会报错了,不能访问,因为这是在类外不能访问私有数据成员。一个类的成员函数可以访问这个类的私有数据成员,我们要理解这个对类的访问限制,而不是针对对象。

C++的访问控制是类层面的 class-level, 而不是对象级别的object-level,

同一个类可以访问所有自己类实例的私有成员, 数据成员是类私有而不是实例私有, 成员是否可访问是类的性质, 而不是对象的性质。

重载operator== 还有第三种方式,就是成员的friend函数,类似全局的operator==方式,只是加了friend关键字,放在类中。

c++ operator百样操作符重载(详解) 文章介绍了c++关于操作符重载的详细内容 二、operator = : 等号赋值重载 三、operator != : 不等于重载 四、operator> : 大于号 或者 小于号重载 五、operator << :输入重定向重载 六、operator >>:输出重定向重载 七、operator +:加号重载 八、operator ++ :++重载 九、operator -- :--重载 阅读详情

相关推荐

C++(03):operator=赋值运算符的返回值

C++中赋值运算符的返回值通常为this对象的引用: 之所以这样做,是因为原生类型,比如int型变量允许做这样的操作: 虽然我不太理解,( i = 8 ) = 0;这样操作的意义是什么,不过原生类型确实允许这样的操作。为了让自定义的类型也具备这样的能力,因此要让赋值运算符的返回值为this对象引用: 如果赋值运算符的返回值类型为this对象的常量引用,是无法完成(a1 = 8) = 0;这样的操作的: 注:Effective C++条款10,对赋值运算符的返回值类型之所以为this对象的引用

风静如云的博客 2350

C++之operator=与operator==用法区别(二百一十八)

本篇目的:理解C++之operator=与operator==用法区别。

Android系统攻城狮 1196

C++之操作符重载探究(七):==运算符重载

前文:C++之操作符重载探究(六):重载函数调用符( ) == 运算符重载   在很多情况下,我们需要判断两个对象是否相等,需要对==运算符进行重载。 例1: //小问学编程 #include<iostream> using namespace std; class Person { public: Person(string name,int age) { m_name=name; m_age=age; } bool ope.

小勇博客 2663

赋值运算符重载函数(operator=)介绍

上面描述的对运算符“==”进行重载,之所以叫“重载”,是由于编译器在实现运算符“==”功能的时候,已经针对这个运算符提供了对于一些基本数据类型的操作支持,只不过现在该运算符所操作的内容变成了我们自定义的数据类型(如 class),而在默认情况下,该运算符是不能对我们自定义的数据类型进行操作的。那么,在设计 person 类的时候,就可以通过针对运算符“==”进行重载,来使运算符“==”具有比较对象 p1 和 p2 的能力(实际上比较的内容是 person 类中的数据成员“age”)。

分享记录一下工作中遇到的相关知识 1513

深入解析MTK DRM初始化流程:从KMS模块到组件框架

本文深入解析了联发科(MTK)平台上DRM显示框架的初始化流程。从内核模块加载、Component框架管理依赖,到核心的mtk_drm_bind函数构建KMS对象(CRTC、Plane、Encoder、Connector),最终完成DRM设备注册并创建用户空间接口。文章结合调试经验,为开发者梳理了从驱动启动到屏幕点亮的完整路径与关键排查点。

onion的博客 765

在PLC中将十六进制数据转换为浮点数(通常遵循IEEE 754标准)需要理解数据存储格式,并按以下步骤操作:

通过以上步骤,您可以在PLC中实现十六进制到浮点数的转换。T DBD20 // 将数据传送到浮点数变量(如DB1.DBD20)指数位(8位):实际指数 = 存储值 - 127(偏移量)。:必须确认PLC的存储顺序(大端或小端),否则结果错误。将两个16位寄存器合并为32位数据,需注意。尾数位(23位):隐含前导1,实际值为。:确保32位数据在寄存器中连续且对齐。符号位(1位):0表示正,1表示负。:高位寄存器在前(如西门子PLC)。:低位寄存器在前(如三菱FX系列)。,误差因截断导致)。

K11mvp的博客 4416

C++编程语言中重载运算符(operator)介绍

operator是C++的一个关键字,它和运算符(如“=”)一起使用,表示一个运算符重载函数,在理解时可将operator和待重载的运算符整体(如“operator=”)视为一个函数名。使用operator重载运算符,是C++扩展运算符功能的方法。使重载后的运算符的使用方法与重载前一致;扩展运算符的功能只能通过函数的方式实现。(实际上,C++中各种“功能”都是通过函数实现的)

liitdar的博客 23万+

【经验分享】使用Keil5烧录代码遇到的问题及解决方法

本文介绍了在使用Keil5烧录代码过程中可能遇到的常见问题,主要为编译错误和下载失败,并提供了解决方案和注意事项。通过本文中提供的具体解决方案和注意事项,希望能够帮助读者更加顺利地进行Keil5烧录代码操作,提高开发效率和成果实现。

qq_63195670的博客 1万+

C++运算符重载

如果不写赋值运算符重载函数,系统会自动生成,但是浅拷贝,一个字节一个字节的拷贝,对于占用资源的还是要自己写才好。对于类类型的使用运算符编译器是不知道要干嘛的就需要自己写函数,自己实现功能。要跟拷贝构造区分,拷贝构造是一个已经存在,给另一个初始化时进行的拷贝操作。日期 - 日期,日期 + 天数,日期 - 天数,这些都是有意义的。总结如果显示写了析构,就要显示写赋值运算符重载。对两个已经存在的类的对象进行赋值拷贝操作。运算符的作用,用于定义类的成员函数指针。就比如日期类的大小比较。

2401_83305953的博客 3663

VSCode玩转ESP-ADF音频开发:从环境搭建到成功播放MP3的避坑全流程

本文详细介绍了如何在VSCode环境下使用ESP-ADF框架进行ESP32音频开发,从环境搭建到成功播放MP3的全流程。重点解析了`IDF_PATH`和`ADF_PATH`的配置问题,以及如何解决`xTaskCreateRestrictedPinnedToCore`等常见编译错误,帮助开发者快速上手ESP-ADF音频开发。

weixin_42520909的博客 339

AI智能体丨使用Coze一键生成中式养生视频,39 条作品涨粉 37.9 万!(附保姆级教程)

本文介绍如何利用扣子(Coze)AI智能体工作流高效制作中式养生短视频。该方案通过AI自动生成养生文案、古风插画素材、语音合成和视频剪辑,将传统制作流程从2-3小时缩短至1-2分钟。工作流包含文案创作、音频生成、图片素材制作和视频合成四大模块,采用大模型处理各环节内容,最终输出可直接导入剪映的草稿文件。特别适合希望快速批量制作文化氛围感强、兼具干货与视觉效果的养生内容创作者,效率提升近百倍。

李同学Lino的博客 3025

operator重载运算符

能像内置类型(

weixin_51287424的博客 823

【干货分享】高通 SA8295P PCB 设计规范指南

高通SA8295P芯片是第四代骁龙汽车数字座舱平台的核心组件,采用5nm工艺,集成高性能CPU/GPU和30TOPS算力的NPU。文章详细介绍了该芯片各接口的layout设计规范,包括USB3.1/2.0、eDP/DP、MIPI CSI/DSI、PCIe Gen3等接口的阻抗、损耗、延时等关键指标要求,为新能源汽车电子设计提供重要参考。

一只豌豆象的博客 258

【C++】运算符重载

运算符重载

yyf_优快云_blog的博客 989

人员行为规范检测:YOLOv8+C#实现工厂车间安全监控,违规即报警零延迟

该方案通过YOLOv8的装备检测与姿态估计的动作识别,结合C#的实时管控能力,实现了从“被动巡检”到“主动预警”的转变。相比传统人工,违规响应速度提升10倍,全年可减少90%以上的安全隐患。方案已在3家制造企业落地,支持自定义违规规则(如新增“吸烟”“未系安全带”),可根据车间场景灵活扩展。需要完整的模型训练配置文件(含数据集增强脚本)或C#系统源码(视频处理+报警模块)的,评论区扣“SafetyDetect”,可直接获取部署版本~

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1174

CMake教程:C++ CMake自定义find_package并在其它项目使用

find_package 是 CMake 中一个非常重要的命令,用于在系统中找到外部库或包,并将其包含到项目中。: 要查找的包的名称。[version]: 可选的版本号。如果指定了版本号,CMake 会尝试找到该版本或更高版本的包。[REQUIRED]: 如果指定了这个关键字,找不到包时会产生一个错误并终止配置过程。: 指定要查找的包的组件。: 指定可选的组件,即使找不到这些组件,配置过程也会继续。: 指定查找包的模式,CONFIG表示查找配置文件,MODULE表示查找模块文件。

琅嬛福地 1560

c++重载操作符,operator 与&operator

1.1 what operator 是C++的一个关键字,它和运算符(如=)一起使用,表示一个运算符重载函数,在理解时可将operator和运算符(如operator=)视为一个函数名。 使用operator重载运算符,是C++扩展运算符功能的方法。使用operator扩展运算符功能的原因如下: 使重载后的运算符的使用方法与重载前一致 扩展运算符的功能只能通过函数的方式实现(实际上,C++中各种“功能”都是由函数实现的) 1.2 why 对于C++提供的所有操作符,通常只支持对于基本数据类型.

瓦刀 5999

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【C++】类和对象之运算符重载

带你深入了解运算符重载和赋值重载!!!

Dawn_Lillian的博客 1443

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++的重载操作符(operator)介绍

本文主要介绍C++中的重载操作符(operator)的相关知识。 1. 概述 1.1 what operator 是C++的一个关键字,它和运算符(如=)一起使用,表示一个运算符重载函数,在理解时可将operator和运算符(如operator=)视为一个函数名。 使用operator重载运算符,是C++扩展运算符功能的方法。使用operator扩展运算符功能的原因如下: 使重载后的运算符的使用方法与重载前一致 扩展运算符的功能只能通过函数的方式实现(实际上,C++中各种“功能”都是由函...

swx89的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++语言运算符重载

概念 在C语言中,运算符只能用于基本数据类型,例如,可以用==判断两个整数是否相等,但不能用于判断字符串是否相等,也不能用于判断结构体,也不能用于判断类。 在C++中,运算符的重载就是把运算符的符号赋予新的含义,如果类重载了==运算符,那么就可以用==判断两个类是否相等。 运算符重载 operator 是C++的一个关键字,它和运算符(如==...

C语言技术网-码农有道 1411

c++ operator 重载运算符 简单理解

operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将 operator== 整体上视为一个函数名。 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。 一、为什么使用操作符重载? 对于系统的所有操作符,**一般情况下,只支持基本数据类型和标准...

顾清欢的博客 1795

C++ operator== 重载与比较语义

本文总结了C++中operator==重载与比较语义的关键要点。主要内容包括:自定义类型默认没有==操作,需要通过成员或非成员函数定义;C++20引入默认相等比较和三路比较运算符<=>;比较运算符的对称性、等价关系要求;浮点数比较的特殊处理;隐藏友元惯用法等。文章还探讨了三路比较返回类型选择、与STL容器的配合、继承场景下的比较实现等实际问题,并提供了工程实践建议和参考链接。

REDcker的博客 432

C++的类和对象(五):operator关键字、赋值重载、取地址运算符&重载 、const成员函数、<<和>>的重载(重要)

能写成(t1 == t2)是因为编译器帮我们做了一些处理,实际情况是operator==(t1,t2),如果类中的成员访问权限改为了private,此时类外的比较函数无法直接使用这些成员变量,故最好把比较函数写入类中,但是当我们将运算符重载函数原封不动的移入类中时,会发现系统提示函数的参数太多了,这是因为除了x和y两个参数外还有一个隐藏的this指针,所以还需要更改代码。用于处理const对象的调用,表明在该成员函数中不能对传入的this指针指向的对象中的的任何成员进行修改。(参考内置类型的连续赋值),

m0_73975164的博客 1387

metadef Shape::operator== 详解:C++ 等值比较速查指南

`operator==` 是 metadef(Ascend Metadata Definition)项目中 `gert::Shape` 结构体重载的相等运算符,用于在 C++ 侧直接比较两个 Shape 是否表示同一形状(维度个数相同、每一维取值相同),是 Shape 相等判断的入口 API。 ## 快速上手 先看最小可运行示例,10 秒掌握写法: ```cpp #include <exte

gitblog_00472的博客 995

C++:12---运算符重载(operator)

一、概念 对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 重载的运算符是具有特殊名字的函数,该函数也有返回值、参数列表、函数体 二、运算符重载的3种实现方式 成员函数:私有、公有、保护都可以 友元函数:同上 全局函数:只能访问公有的 三、运算符重载的规则 以下运算符不支持重载:.(类属运算符),::(作用域运算符),sizeof,?:(三目运算符),#(预处理...

董哥的黑板报 1336
上一篇: C++的重载操作符(operator)介绍
下一篇: windows下Qt中的第一个Cef3程序
hp_cpp
博客等级 码龄11年 310粉丝 218原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值