<C++> 一文详解 - 运算符重载

2023-05-16

🛒本文收录于专栏:【大战C++】
📢专栏目的是对于C++的讲解,重点的逐个击破,会持续输出,欢迎免费订阅!!

🍔彩蛋:
🔎牛客网是一个兼具 面经、刷题、求职 的神器,是我们的最佳选择,我用过很不错呢~ 👉点击注册开始刷题
小鸣人因为准备考研,学完C++准备浅练下算法,后续会推出牛客网刷题记录专栏,到时希望大家多多关注~

✨鲜衣怒马少年时,不负韶华行且知✨

在这里插入图片描述

目录

  • 🔎运算符重载
    • 🔥加号运算符重载
    • 🔥左移运算符重载
    • 🔥递增运算符重载
    • 🔥赋值运算符重载
    • 🔥关系运算符重载
    • 🔥函数调用运算符重载


🔎运算符重载

概念:
对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型

🔥加号运算符重载

作用:实现两个自定义数据类型相加的运算

class Person {
public:
	Person() {};
	Person(int a, int b)
	{
		this->m_A = a;
		this->m_B = b;
	}
	//成员函数实现 + 号运算符重载
	Person operator+(const Person& p) {
		Person temp;
		temp.m_A = this->m_A + p.m_A;
		temp.m_B = this->m_B + p.m_B;
		return temp;
	}


public:
	int m_A;
	int m_B;
};

//全局函数实现 + 号运算符重载
//Person operator+(const Person& p1, const Person& p2) {
//	Person temp(0, 0);
//	temp.m_A = p1.m_A + p2.m_A;
//	temp.m_B = p1.m_B + p2.m_B;
//	return temp;
//}

//运算符重载 可以发生函数重载 
Person operator+(const Person& p2, int val)  
{
	Person temp;
	temp.m_A = p2.m_A + val;
	temp.m_B = p2.m_B + val;
	return temp;
}

void test() {

	Person p1(10, 10);
	Person p2(20, 20);

	//成员函数方式
	Person p3 = p2 + p1;  //相当于 p2.operaor+(p1)
	cout << "mA:" << p3.m_A << " mB:" << p3.m_B << endl;


	Person p4 = p3 + 10; //相当于 operator+(p3,10)
	cout << "mA:" << p4.m_A << " mB:" << p4.m_B << endl;

}

int main() {

	test();

	system("pause");

	return 0;
}

🎁补充:
对于内置的数据类型的表达式的的运算符是不可能改变的


🔥左移运算符重载

作用:可以输出自定义数据类型

class Person {
	friend ostream& operator<<(ostream& out, Person& p);

public:

	Person(int a, int b)
	{
		this->m_A = a;
		this->m_B = b;
	}

	//成员函数 实现不了  p << cout 不是我们想要的效果
	//void operator<<(Person& p){
	//}

private:
	int m_A;
	int m_B;
};

//全局函数实现左移重载
//ostream对象只能有一个
ostream& operator<<(ostream& out, Person& p) {
	out << "a:" << p.m_A << " b:" << p.m_B;
	return out;
}

void test() {

	Person p1(10, 20);

	cout << p1 << "hello world" << endl; //链式编程
}

int main() {

	test();

	system("pause");

	return 0;
}

🎁补充:
重载左移运算符配合友元可以实现输出自定义数据类型


🔥递增运算符重载

作用: 通过重载递增运算符,实现自己的整型数据

class MyInteger {

	friend ostream& operator<<(ostream& out, MyInteger myint);

public:
	MyInteger() {
		m_Num = 0;
	}
	//前置++
	MyInteger& operator++() {
		//先++
		m_Num++;
		//再返回
		return *this;
	}

	//后置++
	MyInteger operator++(int) {
		//先返回
		MyInteger temp = *this; //记录当前本身的值,然后让本身的值加1,但是返回的是以前的值,达到先返回后++;
		m_Num++;
		return temp;
	}

private:
	int m_Num;
};


ostream& operator<<(ostream& out, MyInteger myint) {
	out << myint.m_Num;
	return out;
}


//前置++ 先++ 再返回
void test01() {
	MyInteger myInt;
	cout << ++myInt << endl;
	cout << myInt << endl;
}

//后置++ 先返回 再++
void test02() {

	MyInteger myInt;
	cout << myInt++ << endl;
	cout << myInt << endl;
}

int main() {

	test01();
	//test02();

	system("pause");

	return 0;
}

🎁补充:
前置递增返回引用,后置递增返回值


🔥赋值运算符重载

c++编译器至少给一个类添加4个函数

  1. 默认构造函数(无参,函数体为空)
  2. 默认析构函数(无参,函数体为空)
  3. 默认拷贝构造函数,对属性进行值拷贝
  4. 赋值运算符 operator=, 对属性进行值拷贝
    如果类中有属性指向堆区,做赋值操作时也会出现深浅拷贝问题
class Person
{
public:

	Person(int age)
	{
		//将年龄数据开辟到堆区
		m_Age = new int(age);
	}

	//重载赋值运算符 
	Person& operator=(Person &p)
	{
		if (m_Age != NULL)
		{
			delete m_Age;
			m_Age = NULL;
		}
		//编译器提供的代码是浅拷贝
		//m_Age = p.m_Age;

		//提供深拷贝 解决浅拷贝的问题
		m_Age = new int(*p.m_Age);

		//返回自身
		return *this;
	}


	~Person()
	{
		if (m_Age != NULL)
		{
			delete m_Age;
			m_Age = NULL;
		}
	}

	//年龄的指针
	int *m_Age;

};


void test01()
{
	Person p1(18);

	Person p2(20);

	Person p3(30);

	p3 = p2 = p1; //赋值操作

	cout << "p1的年龄为:" << *p1.m_Age << endl;

	cout << "p2的年龄为:" << *p2.m_Age << endl;

	cout << "p3的年龄为:" << *p3.m_Age << endl;
}

int main() {

	test01();

	//int a = 10;
	//int b = 20;
	//int c = 30;

	//c = b = a;
	//cout << "a = " << a << endl;
	//cout << "b = " << b << endl;
	//cout << "c = " << c << endl;

	system("pause");

	return 0;
}

🔥关系运算符重载

作用:重载关系运算符,可以让两个自定义类型对象进行对比操作

class Person
{
public:
	Person(string name, int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	};

	bool operator==(Person & p)
	{
		if (this->m_Name == p.m_Name && this->m_Age == p.m_Age)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	bool operator!=(Person & p)
	{
		if (this->m_Name == p.m_Name && this->m_Age == p.m_Age)
		{
			return false;
		}
		else
		{
			return true;
		}
	}

	string m_Name;
	int m_Age;
};

void test01()
{
	//int a = 0;
	//int b = 0;

	Person a("孙悟空", 18);
	Person b("孙悟空", 18);

	if (a == b)
	{
		cout << "a和b相等" << endl;
	}
	else
	{
		cout << "a和b不相等" << endl;
	}

	if (a != b)
	{
		cout << "a和b不相等" << endl;
	}
	else
	{
		cout << "a和b相等" << endl;
	}
}


int main() {

	test01();

	system("pause");

	return 0;
}

🔥函数调用运算符重载

  • 函数调用运算符 () 也可以重载
  • 由于重载后使用的方式非常像函数的调用,因此称为仿函数
  • 仿函数没有固定写法,非常灵活
class MyPrint
{
public:
	void operator()(string text)
	{
		cout << text << endl;
	}

};
void test01()
{
	//重载的()操作符 也称为仿函数
	MyPrint myFunc;
	myFunc("hello world");
}


class MyAdd
{
public:
	int operator()(int v1, int v2)
	{
		return v1 + v2;
	}
};

void test02()
{
	MyAdd add;
	int ret = add(10, 10);
	cout << "ret = " << ret << endl;

	//匿名对象调用  
	cout << "MyAdd()(100,100) = " << MyAdd()(100, 100) << endl;
}

int main() {

	test01();
	test02();

	system("pause");

	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

<C++> 一文详解 - 运算符重载 的相关文章

  • 一文详解GNN最新研究方向 | 论文合集

    22年初 xff0c 图神经网络 xff08 GNN xff09 成为互联网圈的流行语 xff0c 一整年 xff0c 关于GNN的研究热情日益高涨 xff0c 其已经成为各大深度学习顶会的研究热点 GNN处理非结构化数据时的出色能力使其在
  • <C++> 一文详解 - 运算符重载

    x1f6d2 本文收录于专栏 xff1a 大战C 43 43 x1f4e2 专栏目的是对于C 43 43 的讲解 xff0c 重点的逐个击破 xff0c 会持续输出 xff0c 欢迎免费订阅 xff01 xff01 x1f354 彩蛋 xf
  • 一文详解Softmax函数

    一 什么是Softmax xff1f Softmax从字面上来说 xff0c 可以分成soft和max两个部分 max故名思议就是最大值的意思 Softmax的核心在于soft xff0c 而soft有软的含义 xff0c 与之相对的是ha
  • 一文详解numpy中np.nonzero()函数

    np nonzero函数是numpy中用于得到数组array中非零元素的位置 xff08 数组索引 xff09 的函数 一般来说 xff0c 通过help xff08 np nonzero xff09 能够查看到该函数的解析与例程 但是 x
  • 从零开始学习HBase - 一文详解HBase常用API

    HBase常用API总结 使用的HBase版本为 1 31 1 pom xml文件 span class token comment lt 配置 Hbase 的依赖 gt span span class token tag span cla
  • 运算符重载

    加号运算符重载 作用 xff1a 实现两个自定义数据类型相加的运算 span class token keyword class span span class token class name Person span span class
  • 运算符重载(),[]

    include lt iostream gt include lt cstring gt using namespace std class yunsuan private int a b c int len num char name 3
  • C++(4) 运算符重载

    C 43 43 学习心得 xff08 1 xff09 运算符重载 from 谭浩强 C 43 43 面向对象程序设计 第一版 2014 10 6 4 1什么是运算符重载 用户根据C 43 43 提供的运算符进行重载 xff0c 赋予它们新的
  • 模板类重载>>(输入)和<<(输出)运算符

    在模板类中输入运算符 gt gt 和输出运算符 lt lt 的重载 使用友元在类内声明 在类外实现 include
  • C++模板类的使用以及运算符重载的实现

    一 类模板及运算符重载的实现 如同函数模板一样 使用类模板使用户可以为类定义一种模式 使得类中的某些数据成员 某些成员函数的参数 某些成员函数的返回值能取任意类型 类模板是对一批仅仅成员数据类型不同的类的抽象 程序员只要为这一批类所组成的整
  • C++Primer 第五版 ——《第十四章 》重载运算符 与 类型转换

    目录 基本概念 如何调用 非成员函数 和 成员函数的 重载运算符 491P 有哪些运算符就不应该被重载 491P 重载运算符的 返回类型 应该与 内置版本的返回类型兼容 492P 重载 赋值和 复合赋值运算符 应该返回左侧运算对象的一个引用
  • 重载输入输出运算符

    原文链接 http blog csdn net lyh 521 article details 49601489 重载输入输出运算符 我们平时可以用流 std cout lt
  • C++运算符重载总结

    一 C 操作符重载的意义 1 当运算符作用于类类型的运算对象时 可以通过运算符重载重新定义该运算符的含义 2 在模板编程实现的泛型编程中 对不同类型实现相同的语义 各自类通过操作符重载实现对应语义 例如 由模板类自己定义大小关系 FUNCT
  • c/c++入门教程 - 2.4.5 c++运算符重载(加号、左移、递增、赋值、关系、函数调用)

    目录 4 5 运算符重载 4 5 1 加号运算符重载 4 5 2 左移运算符重载 4 5 3 递增运算符重载 4 5 4 赋值运算符重载 4 5 5 关系运算符重载 4 5 6 函数调用运算符重载 相关教程 4 5 运算符重载 运算符重载概
  • 【运算符重载】日期类实战篇

    学习导航 一 任务清单 二 基本原则 三 功能实现 构造函数 两个对象间比大小 日期对象加减天数 1 加减运算符的重载 2 运算符的重载 3 与 之间的复用 4 前置 与后置加加 两个对象之间的日期差 流插入与流提取运算符的重载 一 任务清
  • C++运算符的重载

    前言 运算符重载是编译器提供给用户自定义的一种更方便的工作方式 定义 其实就是重新定义一些运算符的意思的 比如是让加法可以在类之间进行 当然我们要使用到关键字operator 话不多说 直接上代码 class Stu public frie
  • 类模板以及赋值运算符重载、拷贝构造函数

    编译器默认的拷贝构造函数 是发生的浅拷贝 像指针的赋值就会让指针指向同一个地址空间 析构时就会对同一个地址空间释放两次 就会造成程序崩溃 自定义在模板内的拷贝构造函数 Queue const Queue
  • C++编程入门--矩阵类重载运算符

    题目 定义3 3矩阵类Matrix 在其中重载运算符 实现矩阵的基本运算 首先 我们先确定这个矩阵类的基本功能 我们来声明其成员函数的功能 列出来如下 include
  • 日期类之运算符重载

    date h pragma once include
  • 【深入理解C++】运算符重载、插入和提取运算符、拷贝赋值运算符

    文章目录 1 运算符重载 2 重载为友元函数 3 重载为成员函数 4 插入和提取运算符 5 拷贝赋值运算符 5 1 深拷贝 1 运算符重载 运算符重载可以为运算符增加一些新的功能 C 中绝大部分的运算符允许重载 不能重载的运算符有以下几个

随机推荐

  • 拓扑排序介绍

    啥是拓扑排序 一个有向图 xff0c 如果图中有入度为 0 的点 xff0c 就把这个点删掉 xff0c 同时也删掉这个点所连的边 一直进行上面出处理 xff0c 如果所有点都能被删掉 xff0c 则这个图可以进行拓扑排序 举例子 开始时
  • 汇编语言实现C51单片机点亮流水灯

    P0作输出口 xff0c 接8只发光二极管 xff0c 编写程序实现二极管循环点亮 二极管为共阳极连接时 xff0c 即二极管正极已接通电源 xff0c 单片机输出接阴极 xff0c 所以单片机输出为低电平有效 所以为实现二极管轮流点亮 x
  • 【JAVA】判断101-200之间有多少个素数,并输出所有素数。

    package hello public class test1 public static void main String args TODO Auto generated method stub 判断101 200之间有多少个素数 x
  • QT·移植Qt到ARM平台及搭建Qt交叉编译环境

    目录 一 编译tslib库 二 移植 tslib 到文件系统 三 编译Qt源码 xff08 用于移植到ARM xff09 四 移植Qt到文件系统 五 搭建 Qt Creator 交叉编译环境 六 获得Qt可执行文件的另一种方法 要想在ARM
  • C/C++学生成绩管理系统,课程设计

    需求分析 制作一个系统实现对学生成绩的管理功能 xff0c 可以对学生信息及成绩信息进行录入 xff0c 显示 xff0c 查询 xff0c 增加 xff0c 修改 xff0c 删除功能 目录 需求分析 二 系统总体设计 基本思路 xff1
  • 全开源即时通讯(IM)系统 高仿微信,android移动应用开发

    更多 xff1a 作者 提 Bug 官网 标签 xff1a 野火 IM 是一套跨平台 全开源的即时通讯解决方案 xff0c 主要包含以下内容 仓库 说明 备注 android chat 野火 IM Android SDK 源码和 App 源
  • 数据结构初阶——顺序表

    博客写到这里 xff0c 关于C语言的相关内容就告一段落了 xff0c 从这篇开始 xff0c 跟我一起进入一个全新的领域吧 前面也为大家介绍了通讯录应该怎样去实现 xff0c 其实顺序表也与通讯录差不多 顺序表是一种线性表 xff0c 线
  • C语言基础(初识C语言)

    学习一门编程语言是一条艰辛与快乐共存的一条路 xff0c 如今选择了这条路 xff0c 就应该一直走下去 xff0c 了解 C 语言的基础知识 xff0c 要先对 C语言有一个大概的认识 xff0c 下面我介绍一下C语言的基础 一 什么是C
  • opencv摄像头 vmware虚拟机无法打开摄像头的解决方法

    WARN 0 global io opencv modules videoio src cap v4l cpp 887 open VIDEOIO V4L2 dev video0 can 39 t open camera by index C
  • Windows10系统安装Linux虚拟机(Ubuntu)详细图文教程

    在学习Linux系统编程时由于没有多余的电脑于是想到了使用虚拟机来安装Liunx系统环境 在翻阅了诸多教程后 xff0c 选择了免费的VM VirtualBox虚拟机 顺便写了一下虚拟机使用流程以及系统安装教程供初学者参考 1 下载虚拟机O
  • Ubuntu 18.04开启SSH远程服务

    Ubuntu 18 04开启SSH远程服务 准备环境具体操作注意事项 准备环境 ubuntu18 04 系统 具体操作 ubuntu默认不会开启SSH服务 xff0c 未安装或者无法安装的VM tools工具的虚拟机编辑或者复制配置文件将会
  • 结构体空间对齐和结构体数组的使用

    今天在学习linux的platform总线时 xff0c 设备对资源的描述用到了结构体数组 xff0c 以前从没见过 如下 很明显用结构体数组主要是用来给一系列相同类型的结构体赋值 xff0c 主要是来看内存分配问题 首先是结构体的内存分配
  • hypermesh-ABAQUS联合仿真关于一维单元方向的问题。

    在hypermesh中创建的一维单元导入到abaqus中后往往会报错 xff1b 显示方向有问题 xff0c 可以在property模组下 xff0c 选择图示红圈内定义一维单元方向
  • 命令执行各种绕过总结

    最近做了题目很多都有命令执行的 xff0c 这里给自己做一次总结 xff0c 也给大家一个参考 这里我感觉对于大家经典rce中可能会收获不少东西 xff0c 祝愿大家在ctf的道路上越走越远 目录 linux绕过 1 空格绕过 2 关键字绕
  • un7.23:Linux——在CentOS7上安装MySQL5.7。

    虚拟机的存在不仅让服务器更加稳定 xff0c 而且还大大提高了数据库的稳定性 xff0c 所以现在有很多开发人员将代码放到虚拟机上进行开发 xff0c 那么我们应该如何在虚拟机上安装数据库呢 xff1f 一 启动网卡 1 查看虚拟机ip 命
  • C语言爱心代码,红爱心送给您~爱心源码分享

    include lt stdio h gt include lt stdlib h gt int main int argc char argv float x y a for y 1 5 y gt 1 5 y 0 1 for x 1 5
  • <JDBC> 批量插入 的四种实现方式:你真的get到了吗?

    x1f6d2 本文收录与专栏 xff1a JDBC 专栏 x1f4e2 专栏目的是解释JDBC的关键点 xff0c 与各位一路同行 xff0c 会持续输出 xff0c 欢迎免费订阅 xff01 xff01 总有人间一两风 xff0c 填我十
  • <C++> 基于多态的职工管理系统(纯手写含源码)

    x1f6d2 本文收录于专栏 xff1a 大战C 43 43 x1f525 x1f4e2 专栏目的是对于C 43 43 的讲解 xff0c 重点的逐个击破 xff0c 会持续输出 xff0c 欢迎免费订阅 xff01 xff01 x1f35
  • <C++>解密 构造函数和析构函数

    x1f6d2 本文收录于专栏 xff1a 大战C 43 43 x1f4e2 专栏目的是对于C 43 43 的讲解 xff0c 重点的逐个击破 xff0c 会持续输出 xff0c 欢迎免费订阅 xff01 xff01 x1f354 彩蛋 xf
  • <C++> 一文详解 - 运算符重载

    x1f6d2 本文收录于专栏 xff1a 大战C 43 43 x1f4e2 专栏目的是对于C 43 43 的讲解 xff0c 重点的逐个击破 xff0c 会持续输出 xff0c 欢迎免费订阅 xff01 xff01 x1f354 彩蛋 xf