C++ 关系运算符重载与赋值运算符重载

CMatrix类设计与实现(C++第一次实验) CMatrix类设计与实现(C++)一、构造函数:构造函数的概念CMatrix(): 不带参数的构造函数CMatrix(int nRow, int nCol, double *pData=NULL) : 带行、列及数据指针等参数的构造函数,并且参数带默认值CMatrix(const char * strPath): 带文件路径参数的构造函数CMatrix(const CMatrix& m): 拷贝构造函数二、析构函数概念~CMatrix(): 调用Release();三、CMatrix对象方法对象初 阅读详情

在我之前的文章中,介绍了算术运算符重载的基本使用,现在我将继续介绍关系运算符重载和赋值运算符重载。

还没看过的朋友可以点击链接前去看一下:C++ 运算符重载
https://blog.youkuaiyun.com/cpp_learner/article/details/104208689

其实他们之间的用法都是类似的,没有什么区别,都是围绕着关键字“operator"展开。

下面我举了两例子来介绍关系运算符重载与赋值运算符重载。
例一:
定义男孩类,再根据男孩类定义出两个男孩对象,对两个男孩进行比较
比较规则是:(薪资 * 系数 - 年龄 * 系数) / 100

例二:
根据例一的男孩类定义出三个对象b1, b2, b3
b1赋初值(“王五”, 33, 48000, 8);
然后再将b1赋值给b2 和 b3
最后打印出来看结果

下面是代码:

Boy.h

#pragma once
#include <string>

class Boy {
public:
	Boy(const char *name=NULL, int age=0, int salary=0, int coefficient=0);
	~Boy();

	// 关系运算符重载
	bool operator>(const Boy &boy);
	bool operator<(const Boy &boy);
	bool operator==(const Boy &boy);
	
	// 运算函数
	int power() const;

	/////////////////////////////////////////////////////////////////////
	/////////////////////////////////////////////////////////////////////
	/////////////////////////////////////////////////////////////////////

	// 赋值运算符重载
	Boy &operator=(const Boy &boy);

	std::string descrition() const;

private:
	char *name;
	int age;
	int salary;
	int coefficient;	// 系数
};

Boy.cpp

#include <sstream>
#include "Boy.h"

Boy::Boy(const char *name, int age, int salary, int coefficient) {
	// 如果name指针不是NULL值的话,先释放该内存,然后再申请
	if (!name) {
		name = "无名";
	}

	// 这样赋值指针name时,内存就刚刚好了
	this->name = new char[strlen(name)+1];
	strcpy_s(this->name, strlen(name)+1, name);

	this->age = age;
	this->salary = salary;
	this->coefficient = coefficient;
}

Boy::~Boy() {
	if (name) {
		delete[] name;
	}
}

// 关系运算符重载
bool Boy::operator>(const Boy &boy) {
	if (power() > boy.power()) {
		return true;
	} else {
		return false;
	}
}

bool Boy::operator<(const Boy &boy) {
	if (power() < boy.power()) {
		return true;
	} else {
		return false;
	}
}

bool Boy::operator==(const Boy &boy) {
	if (power() == boy.power()) {
		return true;
	} else {
		return false;
	}
}

int Boy::power() const {
	// 比较规则
	// (salary * coefficient - age * coefficient) / 100
	return (salary * coefficient - age * coefficient) / 100;
}

/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////

// 赋值运算符重载
Boy& Boy::operator=(const Boy &boy) {
	if (name) {
		delete[] name;
	}

	this->name = new char[strlen(boy.name)+1];
	strcpy_s(this->name, strlen(boy.name)+1, boy.name);

	this->age = boy.age;
	this->salary = boy.salary;
	this->coefficient = boy.coefficient;

	return *this;
}

std::string Boy::descrition() const {
	std::stringstream ret;

	ret << "姓名:" << name << "   年龄:" << age << "   薪资:" << salary << "   系数:" << coefficient;

	return ret.str();
}

main

#include <iostream>
#include "Boy.h"

using namespace std;

int main(void) {
	// 关系运算符重载
	// 比较两个人的大小
	// 比较规则是:(salary * coefficient - age * coefficient) / 100
	cout << "---关系运算符重载---" << endl;
	Boy boy1("张三", 30, 38000, 10);
	Boy boy2("李四", 32, 40000, 6);

	if (boy1 > boy2) {
		cout << "选择boy1" << endl;
	} else if (boy1 < boy2) {
		cout << "选择boy2" << endl;
	} else if (boy1 == boy2) {
		cout << "两人平等,差不多啊" << endl;
	}

	cout << "boy1 = " << boy1.power() << endl;
	cout << "boy2 = " << boy2.power() << endl;


	cout << "\n\n\n\n\n";
	////////////////////////////////////////////////////////////
	
	cout << "---赋值运算符重载---" << endl;
	// 赋值运算符重载
	// 定义出三个对象b1, b2, b3
	// b1赋初值("王五", 33, 48000, 8);
	// 然后再将b1赋值给b2 和 b3

	Boy b1("王五", 33, 48000, 8);
	Boy b2, b3;

	cout << "b1:" << b1.descrition() << endl;
	cout << "b2:" << b2.descrition() << endl;
	cout << "b3:" << b3.descrition() << endl;

	cout << "赋值后:" << endl;
	b3 = b2 = b1;

	cout << "b1:" << b1.descrition() << endl;
	cout << "b2:" << b2.descrition() << endl;
	cout << "b3:" << b3.descrition() << endl;

	system("pause");
	return 0;
}

运行截图:

在这里插入图片描述

总结:
1.定义关系运算符时一般采用bool值作为返回值;
2.定义赋值运算符时一般返回该对象本身的应用,以便做链式连续赋值处理:b1 = b2 = b3;
3.无论是算术运算符还是关系运算符还是赋值运算符也好,参数必须是const类型修饰,防止里面的值被修改。
4.使用成员函数实现或者使用友元函数实现都可以

C++ 友元:https://blog.youkuaiyun.com/cpp_learner/article/details/104193181

<C++>运算符重载完结,详解赋值,关系,函数调用运算符 偷偷厉害 万事接可期待。🎉写在前面 书接上文,这次准备分享C++运算符重载的最后三个,分别是赋值运算符重载、关系运算符重载和函数调用运算符重载,直接用这一篇博客来解决剩下的重载方法;文章里会加入容易踩坑的地方等等,就说这么多,开始正文!🎉目录赋值运算符重载类结构问题的出现具体实现关系运算符重载类结构具体实现调用方法运行效果 函数调用运算符重载类结构具体实现调用方法 匿名对象调用🎉总结 在C++中基本数据类型例如整型,可以实现连续赋值:a=b=c;而我们的对象的成员属性虽... 阅读详情

相关推荐

树莓派计算模块摄像头连接与配置全攻略:从硬件跳线到软件驱动

在嵌入式视觉项目中,摄像头模组的连接与驱动是图像采集和视频分析的基础。其核心原理是通过CSI-2高速串行接口协议传输图像数据,并依赖I2C总线进行传感器寄存器配置。这一技术方案的价值在于为工业控制、机器人等嵌入式设备提供了稳定、高性价比的视觉感知能力。在实际应用中,开发者常面临摄像头无法识别、I2C通信失败等挑战,尤其是在使用树莓派计算模块时,其硬件接口需要通过I/O板引出,配置过程涉及设备树参数调整等关键步骤。本文聚焦于解决这些实际问题,详细拆解了从硬件连接到软件驱动的完整流程,特别是针对CM4、CM3+

weixin_29184075的博客 336

C++重载赋值操作符

重载赋值操作符重载赋值操作符 重载赋值操作符 赋值操作符“=”可以用来将一个对象拷贝给另一个已经存在的对象。如果我们重新定义了一种新的数据类型,比如说复数类,那么我们就需要重载一下赋值操作符,使之能够满足我们的赋值需求。 当然,拷贝构造函数也有同样的功能。拷贝构造函数可以将一个对象拷贝给另一个新建的对象。如果我们没有在类中显式定义拷贝构造函数,也没有重载赋值操作符,那么系统会为我们的类提供一个默认的拷贝构造函数和一个赋值操作符。前面在介绍类的相关知识时已经提到,系统为我们提供的默认拷贝构造函数只是将源对象中

嵌入式与人工智能 1994

HMC5883L磁力计驱动开发:I²C通信、校准与FreeRTOS集成

磁力计是惯性导航与电子罗盘系统的核心传感器,其输出原始磁场数据需经精确采集、单位换算与误差补偿才能用于姿态解算。基于各向异性磁阻(AMR)原理的三轴磁力计,如HMC5883L,依赖稳定I²C通信获取12位有符号磁场采样值,并通过增益配置、硬软铁校准及温度补偿提升物理量精度。在嵌入式实时系统中,驱动层须保障数据的时间一致性与抗干扰鲁棒性,避免总线挂死、字节错位或量程误配等典型问题。本文围绕HMC5883L这一广泛使用的停产但仍在产线服役的磁传感器,详解寄存器配置、定点单位转换、八方位校准算法及FreeRTOS

weixin_42594427的博客 145

【C++】运算符重载与赋值运算符重载(显式与默认)的特性与格式以及前置++,后置++重载

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

m0_74774759的博客 1748

【STM32Cube HAL】输入捕获(六)——PWM测量

实验内容:使用通用定时器输入捕获测量信号的脉宽(检测按键按下的时间)。 一、原理图 二、 CubeMX配置 Step1.打开 STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103VETx。 Step2.选择时钟源,并配置时钟树。选择Crystal/Ceramic Resonator,并配置系统时钟为72M。 Step3.配置SYS,我们这里选择的是Serial Wire。(正常情况配置不配置不影响,debug可以使用。但是你不可以把这...

HAHAHA 1万+

中兴通讯招聘测评答题技巧,真题解析(附真题)

中兴招聘测评、中兴入职测评、中兴线上考试

guang221315221的博客 5803

c++中重载,重写,赋值运算符重载函数

一.重载与重写的区别 1.重载 重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列表(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。 相同的范围(在同一个作用域中) 函数名字相同 参数不同列表 virtual 关键字可有可无 返回类型可以不同 int test(); int test(int a); int test(int a,double b); int test(double a,int a); int tes.

是鲤鱼啊 1571

vscode中使用PlatformIO创建工程加载慢

解决使用VSCODE+PlatformIO中,第一次新建工程一直加载的问题

Reasally的博客 4976

C++运算符重载详解

(类和对象)运算符重载本质还是函数调用,但C++编译器做了特殊的处理,在程序中,函数的实参书写在运算符+的两边,代替了函数名和括号的传统书写方式。好处。

qq_42757463的博客 3723

【PB03F 超详细-环境搭建】蓝牙5.2安信可PB-03F-Kit开发板二次开发环境搭建

PB-03是由深圳市安信可科技有限公司开发的蓝牙模块。本博文介绍安信可PB-03F-Kit开发板的基本情况、开发环境搭建,以及以点亮LED为例介绍程序编写和固件烧录的操作流程。 安信可PB-03F-Kit开发板使用的PHY6252这样一款高集成度的低功耗蓝牙系统级芯片(SoC),专为物联网(IoT)、移动设备、可穿戴电子设备、智能家居等各种应用而设计。......

qq_44078824的博客 1万+

【人工智能】大模型可以分为L0层:基础大模型/通用大模型、L1层:行业大模型、L2层:细分场景模型三个层级

大模型确实可以分为L0、L1、L2三个层级,这种分层架构不仅有助于提升模型的泛化能力和适应性,还能更好地满足不同行业和场景的需求。华为盘古大模型的分层架构(L0、L1、L2)在多个证据中得到了详细描述和验证。例如,华为云盘古大模型3.0明确分为L0基础大模型、L1行业大模型和L2场景模型三层架构。此外,其他来源也一致支持这一分层架构,如用友网络的企业服务大模型、智谱AI的GLM-4系列等。

奶爸的编程之路,也就一周冷个三天 3982

05JAVA运算符

1 运算符 1.1 运算符概述 运算符 用于连接 表达式 的 操作数,并对操作数执行运算。 例如,表达式num1+num2,其操作数是num1和num2,运算符是”+”。 在java语言中,运算符可分为5种类型: 算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符。 根据操作数的不同,运算符又分为单目运算符、双目运算符和三目运算符。 单目运算符只有一个操作数,双目运算符有两个操作数,三目运算符则有三个操作数。 位运算符涉及到二进制位的运算,在java 程序中运用不是很多。 1.2 运算符具体功能 1.

蟑螂恶霸的博客 253

IgH EtherCAT 从入门到精通:第 29 章 实战:EoE 远程维护通道搭建

摘要:本章详细介绍了基于EoE(Ethernet over EtherCAT)协议的远程维护通道搭建方案。主要内容包括:1)网络架构设计,采用管理网络与EoE子网隔离的方案;2)从站EoE支持确认与IP地址配置,提供API和命令行两种方式;3)路由/交换两种部署模式,重点推荐路由模式并给出自动化配置脚本;4)SSH远程访问配置,包括直接连接和跳板访问两种方式;5)安全加固措施,如防火墙规则、SSH密钥认证等;6)故障恢复机制与性能注意事项。该方案实现了通过EtherCAT网络对从站设备的远程SSH访问、文件

从事嵌入式linux android驱动开发,拥有全栈能力 360

C++学习笔记之运算符重载(赋值运算符,关系运算符重载)C++运算符重载 运算符重载 重载运算符

C++学习笔记之运算符重载(赋值运算符,关系运算符重载)C++运算符重载 运算符重载 重载运算符 赋值运算符重载 C++编译器至少要给一个类添加4个函数 默认构造函数 默认析构函数 默认拷贝构造函数 赋值运算符 operator=对属性进行值拷贝 如果类中有属性指向堆区,做赋值操作的时候会出现深浅拷贝的问题 应该要先判断是否有属性在堆区,如果要先释放干净,然后再进行深拷贝 if(m_Age != NULL){ delete m_Age; m_Age = NULL; } #include <io

qq_36711295的博客 293

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++面向对象之赋值运算符和关系运算符重载解析

赋值运算符的重载 先简单回顾一下 C++编译器至少给一个类添加四个函数 默认构造函数(无参,函数体为空) 默认的析构函数(无参,函数体为空) 默认拷贝构造函数,对属性进行值拷贝 赋值运算符operator=,对属性进行值拷贝(这里问题就来了,浅拷贝和深拷贝的坑又来了———堆区内存重复释放因此要对简单的赋值即浅拷贝,重载成深拷贝) 这里注意:被赋值的一方要先进行判断是否本身有属性在堆区,如果有就释放干净,然后再进行深拷贝。 上面的程序有一点小问题:这样的赋值运算重载还不能实现链式编程;即(p

lg201601的博客 423

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++类和对象-C++运算符重载->加号运算符重载、左移运算符重载、递增运算符重载、赋值运算符重载、关系运算符重载、函数调用运算符重载

ostream& operator<<(ostream& cout, Person& p) //本质 operator<<(cout,p) 简化 cout<<p。cout << "p1的年龄为:" << *p1.m_Age << endl;cout << "p2的年龄为:" << *p2.m_Age << endl;cout << "p3的年龄为:" << *p3.m_Age << endl;

鲸鱼的博客 2027

C++学习第二十天:类与对象:运算符重载(赋值运算符,关系运算符,函数调用运算符重载)

运算符重载。赋值运算符,关系运算符,函数调用运算符重载。赋值运算符重载要注意用深拷贝解决内存空间重复释放的问题,函数调用运算符重载中会有一个新名词:匿名函数对象,执行后会被立即释放。

hm_uin的博客 417

C++运算符重载(超全)

C++运算符重载 1) 运算符重载的本质为函数重载,但有一定的规则需要遵循。[1] (1)重载运算符时,运算符的运算顺序和优先级不变,操作数个数不变。 (2)不能创造新的运算符,只能重载C++中已有的运算符,并且规定有6个运算符不能重载,如表所示。 不能重载的运算符 含义 . 类属关系运算符 .* 成员指针运算符 :: 作用域运算符 ?: 条件运算符 # 编译预处理符号 sizeof() 取数据类型的长度 (3)运算符重载是针对新类型的实际需求,对原有的运算符进行适当

LancasterLiu的博客 3万+

咱们一起学C++ 第一百六十二篇:之深度探索C++二元运算符重载与赋值运算符重载

大家好!学习C++就像是一场充满挑战的冒险,每一个新的知识点都是旅途中的宝藏。一直以来,我写这个系列博客就是希望能和大家一起探索C++的奥秘,共同进步。今天,咱们继续深入研究C++中的运算符重载,这次聚焦在文档中涉及的二元运算符重载以及赋值运算符重载相关内容。

wj_rdk的博客 1699

【C++从练气到飞升】05---运算符重载

对于关系运算符可以考虑加上const修饰,因为并不会改变对象本身,但是并不是所有的成员函数都要加const修饰,要修改对象成员变量的函数,例如:重载的+=、-=等,是不能加const修饰的,因为会修改成员本身,而成员函数中如果没有修改对象的成员变量,可以考虑加上const修饰,这样不仅普通对象可以调用该成员函数(权限的缩小),const对象也能调用该成员函数(权限的平移)

m0_68662723的博客 1362

【C++】运算符重载

但是我们如果重载成全局函数,就需要类成员变量是公有属性,因为类外无法访问类的私有成员。但是这样就会破坏封装性。 因此,为了保证封装性,我们一般将运算符重载为类的友元函数或类的成员函数。

炸掉地球的博客 1791

关系运算符的重载 > < ==

Boy.h #pragma once #include <string> class Boy { public: Boy(const char* name = NULL, int age = 0, int salary = 0, int darkHouse = 0); ~Boy(); std::string description(); //重载赋值运算符 Boy& operator=(Boy& boy); //关系运算符重载 bool operator>

weixin_52034946的博客 302

【C++知识点】重载

📣专栏定位:整理一下 C++ 相关的知识点,供大家学习参考~🎏唠叨唠叨:在这个专栏里我会整理一些琐碎的 C++ 知识点,方便大家作为字典查询~

Newin2020的博客 663

程序设计二(面向对象)_实训8_完整的Int包装类(头歌)

该项目一共有 5 个文件,main.cpp,Int.h,Int.cpp,IntOp.h 和 IntOp.cpp。

2303_80517143的博客 1560

C++核心编程——详解运算符重载

C++的一大特性就是重载,重载使得程序更加简洁高效。在C++中不只函数可以重载,运算符也可以重载,运算符重载主要是面向对象之间的。运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 运算符重载语法: 在C++中,使用operator关键字定义运算符重载。运算符重载语法格式如下: 函数的参数列表中参数个数取决于两个因素。通过案例两个对象相加演示“+”运算符的重载: 通过上面案例可以知道,重载运算符并没有改变其原来的功能,只是增加了针对自定义数据类型的运算功能,具有了更广泛的

阿标de杂货铺 1594

C++ ----- 运算符重载

C++ ----- 运算符重载

qq_62774463的博客 256
上一篇: C++ 构造函数之指针的叛逆
下一篇: C++ 字符串也能做下标?之 [ ] 运算符重载
cpp_learners
博客等级 码龄7年 1526粉丝 274原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值