64.C++运算符重载

news2025/1/15 12:59:33

       

目录

1.可重载\不可重载运算符

 2.重载运算符:+

3.重载运算符:++

4.重载运算符:- -

5.重载运算符:<< 

6.重载运算符:=


        运算符重载是一种C++的特性,它允许重新定义或扩展已存在的运算符,以使其适用于用户自定义的数据类型。运算符重载使得您可以创建更直观、自然的操作符行为,从而增强代码的可读性和易用性。

1.可重载\不可重载运算符

 2.重载运算符:+

class Point {
public:
	// 定义属性
	int x;
	int y;
	// 定义构造函数,⽤来初始化属性
	Point() : x(0), y(0) {}
	Point(int x, int y) : x(x), y(y) {}
	// 在类内实现的运算符重载
	Point operator+(const Point& p) const {
		return { x + p.x, y + p.y };
	}
};
// 全局函数实现运算符重载
Point operator-(const Point& p1, const Point& p2) {
	return { p1.x - p2.x, p1.y - p2.y };
}
int main() {
	Point p1(10, 20);
	Point p2(15, 25);
	Point res = p1 + p2; 
	cout << "res.x = " << res.x << ", res.y = " << res.y << endl;//输出 res.x=25,res.y=45
	Point res2 = p1 - p2;
	cout << "res2.x = " << res2.x << ", res2.y = " << res2.y << endl;//输出 res.x=-5,res.y=-5
	return 0;
}

3.重载运算符:++

class Point {
public:
	// 定义属性
	int x;
	int y;
	// 定义构造函数,⽤来初始化属性
	Point() : x(0), y(0) {}
	Point(int x, int y) : x(x), y(y) {}
	// 运算符前置,先运算、后取值
	Point operator++() {
		x++;
		y++;
		return *this;
	}
	// 在类内实现的运算符重载,运算符后置
	Point operator++(int) {
		// 先创建⼀个对象,记录原来的值
		Point tmp = *this;
		// 属性⾃增
		x++;
		y++;
		// 返回之前记录的值
		return tmp;
	}
};
int main() {
	Point p1(10, 20);
	Point p2(15, 25);
	Point res1 = ++p1;
	cout << "res1.x = " << res1.x << ", res1.y = " << res1.y << endl;
	cout << "p1.x = " << p1.x << ", p1.y = " << p1.y << endl;
	Point res2 = p2++;
	cout << "res2.x = " << res2.x << ", res2.y = " << res2.y << endl;
	cout << "p2.x = " << p2.x << ", p2.y = " << p2.y << endl;
	return 0;
}

4.重载运算符:- -

class Point {
public:
	// 定义属性
	int x;
	int y;
	// 定义构造函数,⽤来初始化属性
	Point() : x(0), y(0) {}
	Point(int x, int y) : x(x), y(y) {}
};
//类外实现 运算符前置 先运算再赋值
Point operator--(Point& point) {
	point.x--;
	point.y--;
	return point;
}
//类外实现 运算符后置 先赋值再运算
Point operator--(Point& point, int) {
	Point tmp = point;
	point.x--;
	point.y--;
	return tmp;
}
int main() {
	Point p1(10, 20);
	Point p2(15, 25);
	Point res1 = --p1;
	cout << "res1.x = " << res1.x << ", res1.y = " << res1.y << endl;
	cout << "p1.x = " << p1.x << ", p1.y = " << p1.y << endl;
	Point res2 = p2--;
	cout << "res2.x = " << res2.x << ", res2.y = " << res2.y << endl;
	cout << "p2.x = " << p2.x << ", p2.y = " << p2.y << endl;
	return 0;
}

 

5.重载运算符:<< 

class Point {
	friend ostream& operator<<(ostream& os, const Point& p);
public:
	// 定义属性
	int x;
	int y;
	// 定义构造函数,⽤来初始化属性
	Point() : x(0), y(0), privateField(0) {}
	Point(int x, int y) : x(x), y(y), privateField(0) {}
private:
	int privateField;
};
// 在类外定义运算符重载,全局函数
// 我希望在这⾥能够将Point类中的私有属性也拼接起来,因此需要做成友元
ostream& operator<<(ostream& os, const Point& p) {
	os << "x = " << p.x << ", y = " << p.y << ", privateField = " << p.privateField;
	return os;
}
int main() {
	Point p1(10, 20);
	cout << "p1: " << p1 << endl;
	return 0;
}

6.重载运算符:=

class Person {
public:
	int age;
	int score;
	int* p;
	Person() : age(0), score(0), p(nullptr) {}
	Person(const Person& person) {
		cout << "拷贝构造函数执行了" << endl;
		age = person.age;
		score = person.score;
		p = new int(*person.p);
	}
	// 重载赋值运算符
	Person& operator=(const Person& person) {
		cout << "重载赋值运算符执行了" << endl;
		age = person.age;
		score = person.score;
		p = new int(*person.p);
		return *this;
	}
	~Person() {
		cout << "析构函数执行了" << endl;
		if (p == nullptr) {
			delete p;
			p = nullptr;
		}
	}
};
int main() {
	// 创建⼀个对象
	Person p1;
	p1.age = 18;
	p1.score = 99;
	p1.p = new int(100);
	// 在这⾥,虽然是等号运算符,但是p2对象还没有完成空间开辟、实例化,那么在这⾥会调⽤拷⻉构造函数,⽽⾮重载的等号运算符
	Person p2 = p1;
	// 修改p2的属性值
	p2.age = 20;
	p2.score = 100;
	p2.p = new int(200);
	// 这⾥的p1已经开辟空间了,这⾥就会触发?载的等号运算符
	p1 = p2;
	cout << p1.age << ", " << p1.score << ", " << p1.p << " =>" << *p1.p << endl;
	cout << p2.age << ", " << p2.score << ", " << p2.p << " =>" << *p2.p << endl;
	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/980909.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

语音芯片NV040D在电动车的防盗应用

在现代社会&#xff0c;人们的出行方式往往有多种多样。但电动车在交通工具中依然占据着重要地位&#xff0c;帮助人们节省了较长的通勤时间。随着电动车数量的不断增加&#xff0c;车辆的防盗也成为了人们万分重视的问题。因而选择一辆具备预警功能与故障提示的智能电动车是必…

Lua01——概述

Lua是啥&#xff1f; 官网 https://www.lua.org Lua这个名字在葡萄牙语中的意思是“美丽的月亮”&#xff0c;诞生于巴西的大学实验室。 这是一个小巧、高效且能够很好的和C语言一起工作的编程语言。 在脚本语言领域中&#xff0c;Lua因为有资格作为游戏开发的备选方案&…

WebGL 纹理——在矩形表面贴上图像

目录 WebGL要进行纹理映射&#xff0c;需遵循以下四步&#xff1a; 1. 准备好映射到几何图形上的纹理图像。 2. 为几何图形配置纹理映射方式。 3. 加载纹理图像&#xff0c;对其进行一些配置&#xff0c;以在WebGL中使用它。 4. 在片元着色器中将相应的纹素从纹理中抽取出…

密码找回安全

文章目录 密码找回安全任意秘密重置 密码找回安全 用户提交修改密码请求;账号认证:服务器发送唯一ID (例如信验证码)只有账户所有者才能看的地方&#xff0c;完成身份验证&#xff1b;身份验证:用户提交验证码完成身份验证;修改密码:用户修改密码。 任意秘密重置 登录metinfo4…

STM32 软件IIC 控制OLED 显示屏

1. 硬件IIC 实在是太难用了&#xff0c;各种卡死&#xff0c;各种发不出来数据&#xff0c;没那么多时间折腾了&#xff0c;还是用软件IIC 先吧&#xff0c;初始化 void OLED_Software_IIC_Init(void) {GPIO_InitTypeDef GPIO_InitStruct;RCC_AHBPeriphClockCmd(OLED_SOFTWARE…

分布式锁java程序怎么处理 zk与redis

curator 基于zk实现实现了一套高级功能&#xff0c;比如有分布式锁 当第二客户端加锁时&#xff0c;会先判断它前面有没有第一个节点&#xff0c;如果有就加锁失败&#xff0c;同时就对它上一个节 点加一个watcher监听器&#xff0c;当第一个节点释放或客户端A宕机时&#xff…

Redis从基础到进阶篇(四)----性能调优、分布式锁与缓存问题

目录 一、Redis 集群演变 1.1 ReplicationSentinel*高可用 1.2 ProxyReplicationSentinel(仅仅了解) 1.3 Redis Cluster 集群 (重点&#xff09; 1.3.1 Redis-cluster架构图 1.3.2 工作原理 1.3.3 主从切换 1.3.4 副本漂移 1.3.5 分片漂移 二、Redis版本历史&#xf…

flink学习之广播流与合流操作demo

广播流是什么&#xff1f; 将一条数据广播到所有的节点。使用 dataStream.broadCast() 广播流使用场景&#xff1f; 一般用于动态加载配置项。比如lol&#xff0c;每天不断有人再投诉举报&#xff0c;客服根本忙不过来&#xff0c;腾讯内部做了一个判断&#xff0c;只有vip3…

Android开发-Mac Android开发环境搭建(Android Studio Mac环境详细安装教程,适合新手)...

1.进入Android Studio官网 https://developer.android.google.cn/studio 2.点击下载Android Studio. 3.将说明拉到最下方,选择Mac With Apple Chip.苹果芯片选择Apple Chip,如果是Intel芯片可以选择Intel. 4.下载完成后,双击进入Android Studio. 点击打开. 5.如果是第一次安装,…

【枚举子序列+组合数学+推式子】Cf Edu11 E

https://codeforces.com/contest/660/problem/E 题意&#xff1a; 思路&#xff1a; 重点在于枚举子序列&#xff0c;一般是先枚举子序列长度&#xff0c;然后枚举别的 算是经典套路 Code&#xff1a; #include <bits/stdc.h>#define int long longusing i64 long lo…

使用 WebGL 为 HTML5 游戏创建逼真的地形

推荐&#xff1a;使用 NSDT场景编辑器快速搭建3D应用场景 建 模 和 3D 地形 大多数 3D 对象是 使用建模工具创建&#xff0c;这是有充分理由的。创建复杂对象 &#xff08;如飞机甚至建筑物&#xff09;很难在代码中完成。建模工具 几乎总是有意义的&#xff0c;但也有例外&am…

如何正确的写出第一个java程序:hello java

1 前言 最近公司由于项目需要&#xff0c;开始撸java代码了。学习一门新的编程语言&#xff0c;刚开始总是要踩很多坑&#xff0c;所以记录一下学习过程&#xff0c;也希望对java初学者有所帮助。 2 hello java 2.1 程序源码 程序内容十分简单&#xff0c;这里就不再过多赘…

ICCV 2023 | MoCoDAD:一种基于人体骨架的运动条件扩散模型,实现高效视频异常检测

论文链接&#xff1a; https://arxiv.org/abs/2307.07205 视频异常检测&#xff08;Video Anomaly Detection&#xff0c;VAD&#xff09;扩展自经典的异常检测任务&#xff0c;由于异常情况样本非常少见&#xff0c;因此经典的异常检测通常被定义为一类分类问题&#xff08;On…

记录--CSS 滚动驱动动画 scroll()

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 CSS 滚动驱动动画 scroll() animation-timeline 通过 scroll() 指定可滚动元素与滚动轴来为容器动画提供一个匿名的 scroll progress timeline. 通过元素在顶部和底部(或左边和右边)的滚动推进 scroll…

界面控件DevExpress WPF(v23.2)下半年发展路线图

本文主要概述了DevExpress官方在下半年&#xff08;v23.2&#xff09;中一些与DevExpress WPF相关的开发计划。 通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress …

如何让 Llama2、通义千问开源大语言模型快速跑在函数计算上?

:::info 本文是“在Serverless平台上构建AIGC应用”系列文章的第一篇文章。 ::: 前言 随着ChatGPT 以及 Stable Diffusion,Midjourney 这些新生代 AIGC 应用的兴起&#xff0c;围绕AIGC应用的相关开发变得越来越广泛&#xff0c;有呈井喷之势&#xff0c;从长远看这波应用的爆…

算法基础-数学知识-高斯消元、求组合数

高斯消元、求组合数 高斯消元883. 高斯消元解线性方程组 组合数AcWing 885. 求组合数 IAcWing 886. 求组合数 IIAcWing 887. 求组合数 IIIAcWing 888. 求组合数 IV 高斯消元 找到当前列绝对值最大的数 所在的行将改行的该列的系数变成1&#xff0c;其他列也要跟着变将这行和最…

使用GPT-4生成训练数据微调GPT-3.5 RAG管道

OpenAI在2023年8月22日宣布&#xff0c;现在可以对GPT-3.5 Turbo进行微调了。也就是说&#xff0c;我们可以自定义自己的模型了。然后LlamaIndex就发布了0.8.7版本&#xff0c;集成了微调OpenAI gpt-3.5 turbo的功能 也就是说&#xff0c;我们现在可以使用GPT-4生成训练数据&a…

taro vue3 ts nut-ui 项目

# 使用 npm 安装 CLI $ npm install -g tarojs/cli 查看 Taro 全部版本信息​ 可以使用 npm info 查看 Taro 版本信息&#xff0c;在这里你可以看到当前最新版本 npm info tarojs/cli 项目初始化​ 使用命令创建模板项目&#xff1a; taro init 项目名 taro init myApp …

《TCP/IP网络编程》阅读笔记--基于UDP的服务器端/客户端

目录 1--TCP和UDP的主要区别 2--基于 UDP 的数据 I/O 函数 3--基于 UDP 的回声服务器端/客户端 4--UDP客户端Socket的地址分配 5--UDP存在数据边界 6--UDP已连接与未连接的设置 1--TCP和UDP的主要区别 ① TCP 提供的是可靠数据传输服务&#xff0c;而 UDP 提供的是不可靠…