【C++】运算符重载

目录

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

运算符重载

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

加号运算符

目标:实现两个对象相加或类和其他数据类型相加

Animal dog(10);//实例对象
Animal cat(20);//实例对象
Animal pig1 = dog + cat;//对象+对象
Animal pig2 = dog + 10;//对象+整数

重写operator+实现加号运算符重载
有两种实现:成员函数实现和全局函数实现

class Animal{
pubilc:Animal(int a){this->a = a;    }
//成员函数实现 + 号运算符重载Animal operator+(const Animal& p) {Animal temp;temp.a = this->a + p.a;//成员相加return temp;//返回临时对象}
pubilc:int a;//成员变量
}//全局函数实现 + 号运算符重载
//传参不一样,跟成员函数重载不冲突
Animal operator+(const Animal& p,int b){Animal temp;temp.a = p.a + b;//成员相加return temp;//返回临时对象
}int main(){Animal dog(10);//实例对象Animal cat(20);//实例对象Animal pig1 = dog + cat;//使用成员函数实现,相当于dog.operator+(cat)Animal pig2 = dog + 10;//使用全局函数实现,相当于operator+(dog,10);
}

左移运算符

目标:实现对象的<<链式编程

Animal dog();//实例对象
cout << dog << "hello world" << endl; //链式编程

重写operator<<实现左移运算符重载
成员函数无法实现预期的 << 号运算符重载效果,只能用全局函数实现
左移运算符需要一个左值和一个右值,如果使用成员函数实现,那就是:dog.operator<<(x),左值是对象,右值是传入参数,那么要使用这个重载,对象应写在左值位置,dog<<,这与我们想实现的cout << dog不符合

class Animal{pubilc:int a = 10;//成员变量int b = 20;//成员变量
}//全局函数实现 << 运算符重载
ostream& operator<<(ostream& out,Animal p){out << "a:" << p.a << " b:" << p.b;return out;//返回ostream类型,主要是考虑到链式编程连续<<的使用
}int mian(){Animal dog;//实例对象cout << dog << "hello world" << endl; //链式编程
}

递增运算符

目标:实现对象的++递增运算

Animal dog(10);//实例对象
dog++;
++dog;

重写operator++实现递增运算符重载

class Animal{
public:
//前置++Animal& operator++(){num++;//先++return *this;//再返回//返回引用,考虑到++(++a)的情况,应该递增同一个a对象    }
//后置++,使用传参int来区分于前置Animal operator++(int){Animal temp = *this; //记录当前本身的值num++;//再++return temp;//返回记录的值}
pubilc:int num = 10;//成员变量
}int mian(){Animal dog;//实例对象dog++;
}

赋值运算符

c++编译器默认会给类添加赋值运算符重载operator=, 对属性进行值拷贝
如果类中有属性指向堆区,做赋值操作时也会出现深浅拷贝问题

目标:实现对象的=号赋值运算

Animal p1(18);
Animal p2(20);
Animal p3(30);
p3 = p2 = p1; //赋值操作

重写operator=实现赋值运算符重载

class Animal{
pubilc:Animal(int a){m_Age = new int(a);//将数据开辟到堆区     }//重载赋值运算符Animal& operator=(Animal &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;}}
public:int *m_Age;
}int mian(){Animal p1(18);Animal p2(20);Animal p3(30);p3 = p2 = p1; //赋值操作
}

关系运算符

目标:实现对象之间的关系运算

Animal dog(10);//实例对象
Animal cat(20);//实例对象
if(dog == cat){//对比两个实例
}

重写operator==实现关系运算符重载

class Animal{
pubilc:Animal(int a){this->a = a;   }bool operator==(Animal& p){if (this->a == p.a){return true;}else{return false;}}
publicint a;
}int main(){Animal dog(10);//实例对象Animal cat(20);//实例对象if(dog == cat){cout << "dog和cat相等" << endl;}
}

函数调用运算符

函数调用运算符 () 也可以重载
由于重载后使用的方式非常像函数的调用,因此称为仿函数
仿函数没有固定写法,非常灵活
重写operator()实现函数调用运算符重载
例程:

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();
}

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

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

相关文章

java面试之jvm常见面试题

1、JVM是什么&#xff1f;JVM的主要组成部分&#xff1f; JVM&#xff08;Java Virtual Machine&#xff09;是Java程序的执行环境&#xff0c;它使得Java程序能够“一次编写&#xff0c;到处运行”。JVM主要由以下部分组成&#xff1a; 1、类加载器&#xff08;ClassLoader&…

MySQL篇-SQL优化实战

SQL优化措施 通过我们日常开发的经验可以整理出以下高效SQL的守则 表主键使用自增长bigint加适当的表索引&#xff0c;需要强关联字段建表时就加好索引&#xff0c;常见的有更新时间&#xff0c;单号等字段减少子查询&#xff0c;能用表关联的方式就不用子查询&#xff0c;可…

某Dota/IM的某电竞对战平台玩家助手、查看战绩、胜率等

功能说明 WAR3游戏启动后&#xff0c;可以自动获取游戏双方的玩家列表&#xff0c;然后查询显示玩家的战绩及个人信息。附带查看玩家的战绩详情、最近游戏&#xff0c;查看对手及友方的战绩详情&#xff0c;据此推算出是否开黑、是否小号等信息 使用方法及运行效果 启动 查…

腾讯地图异步调用

<template><!-- 定义地图显示容器 --><div id"container"></div> </template><script setup>import { onMounted } from vue;const mapKeys import.meta.env.VITE_GLOB_TX_MAP_KEYS;function initMap() {// //定义地图中心点坐…

【MySQL备份】mysqldump基础篇

目录 1.简介 2.基本用途 3.命令格式 3.1常用选项 3.2常用命令 4.备份脚本 5.定时执行备份脚本 1.简介 mysqldump 是 MySQL 数据库管理系统的命令行实用程序&#xff0c;用于创建数据库的逻辑备份。它能够导出数据库的结构&#xff08;如表结构、视图、触发器等&#xf…

【C++题解】1456. 淘淘捡西瓜

问题&#xff1a;1456. 淘淘捡西瓜 类型&#xff1a;贪心 题目描述&#xff1a; 地上有一排西瓜&#xff0c;每个西瓜都有自己的重量。淘淘有一个包&#xff0c;包的容量是固定的&#xff0c;淘淘希望尽可能在包里装更多的西瓜&#xff08;当然要装整个的&#xff0c;不能切开…

C#——异步Task详情

C#异步Task 异步&#xff1a;多任务开始执行&#xff0c;只需要主任务 A 执行完成就算结束&#xff0c;主任务执行的时候&#xff0c;可以同时执行异步任务 B、C&#xff0c;主任务 A 可以不需要等待异步任务 B、C 的结果。 在C#中&#xff0c;异步编程主要通过async和await关…

三维地图Cesium中,如何监听地图点击事件,实现在实体上面鼠标右击时做处理。

在 Cesium 中&#xff0c;如果你想在实体&#xff08;Entity&#xff09;上实现鼠标右击&#xff08;右键点击&#xff09;的处理&#xff0c;你需要使用 Cesium 的事件系统来监听鼠标事件&#xff0c;并结合一些逻辑来判断点击是否发生在实体上。由于 Cesium 没有直接提供“点…

03-《含羞草》

含羞草 含羞草&#xff08;学名&#xff1a;Mimosa pudica Linn. &#xff09;&#xff1a;为豆科多年生草本或亚灌木&#xff0c;由于叶子会对热和光产生反应&#xff0c;受到外力触碰会立即闭合&#xff0c;所以得名含羞草。形状似绒球。开花后结荚果&#xff0c;果实呈扁圆形…

sql获取下个月开始日期与结束日期

mysql获取下个月开始日期与结束日期 SELECTid,DATE_FORMAT(DATE_ADD(LAST_DAY(limitStartTime), INTERVAL 1 DAY), %Y-%m-01) AS limitStartTime,LAST_DAY(DATE_ADD(limitStartTime, INTERVAL 1 MONTH)) AS limitEndTime,createTime,creator FROMorder_special_drugs;这里的SQ…

学习笔记——动态路由——OSPF(工作原理)

九、OSPF协议的工作原理 1、原理概要 (1)相邻路由器之间周期性发送HELLO报文&#xff0c;以便建立和维护邻居关系。 (2)建立邻居关系后&#xff0c;给邻居路由器发送数据库描述报文(DD)&#xff0c;也就是将自己链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由器…

LabVIEW汽车ECU测试系统

开发了一个基于LabVIEW开发的汽车发动机控制单元&#xff08;ECU&#xff09;测试系统。该系统使用了NI的硬件和LabVIEW软件&#xff0c;能够自动执行ECU的功能测试和性能测试&#xff0c;确保其在不同工作条件下的可靠性和功能性。通过自动化测试系统&#xff0c;大大提高了测…

使用 Rustup 管理 Rust 版本

文章目录 安装 Rustup配置镜像源安装 Rustup 安装 RustVS Code插件创建项目代码示例 Rust 官网&#xff1a;https://www.rust-lang.org/zh-CN/Crates 包管理&#xff1a;https://crates.io/Rust 程序设计语言&#xff1a;https://kaisery.github.io/trpl-zh-cn/通过例子学 Rust…

Jdk17是否有可能代替 Jdk8

JDK发展历史和开源 2006年SUN公司开源JDK&#xff0c;成立OpenJDK组织。2009年Oracle收购SUN&#xff0c;加快JDK发布周期。Oracle JDK与OpenJDK功能基本一致&#xff0c;但Oracle JDK提供更长时间的更新支持。 JDK版本特性 JDK11是长期支持版本&#xff08;LTS&#xff09;…

DevOps认证是什么?DevOps工具介绍

DevOps 这个词是由Development&#xff08;开发&#xff09; 和 Operations&#xff08;运维&#xff09;组合起来的&#xff0c;你可以把它理解成为一种让开发团队和运维团队紧密合作的方法。 DevOps从2009年诞生到现在已经14年多了&#xff0c;一开始大家还在摸索&#xff0…

因为文件共享不安全,所以你不能连接到文件共享。此共享需要过时的SMB1协议,而此协议是不安全的 解决方法

目录 1. 问题所示2. 解决方法3. 解决方法1. 问题所示 输入共享文件地址的时候,出现如下信息: 因为文件共享不安全,所以你不能连接到文件共享。此共享需要过时的SMB1协议,而此协议是不安全的,可能会是你的系统遭受攻击。你的系统需要SMB2或更高版本截图如下所示: 2. 解决…

mongodb中常用的运算符和正则表达式

在mongodb中不能><&#xff0c;>&#xff0c;<&#xff0c;!等运算符&#xff0c;需要使用替代符号 1.前言&#xff1a; >----$gt <----$lt >----$gte < ----$lte !----$ne 例如&#xff1a;查询id比三大的所有记录 db.students.find({id:{$gt:3}});…

ASPICE培训:推动汽车行业软件质量的新高度

在当今日新月异的汽车行业中&#xff0c;软件技术已经成为推动行业发展的核心动力。随着智能化、网联化、电动化等趋势的加速&#xff0c;汽车软件的质量和性能要求也越来越高。为了满足这一需求&#xff0c;ASPICE&#xff08;Automotive SPICE&#xff09;标准应运而生&#…

【Elasticsearch】一、概述,安装

文章目录 概述全文搜索引擎概述ES&#xff08;7.x&#xff09; 安装ES&#xff08;Docker&#xff09;测试&#xff0c;是否启动成功 可视化工具配置中文 客户端Postman下载 概述 ES是开源的高扩展的分布式全文搜索引擎&#xff0c;实时的存储、检索数据&#xff1b;本身扩展性…

助力游戏实现应用内运营闭环,融云游戏社交方案升级!

通信能力在所有应用场景都是必备组件&#xff0c;这源于社交属性带给应用的增长神话。 在游戏场景&#xff0c;玩家从少数核心向大众用户泛化扩展的过程&#xff0c;就是游戏深度融合社交能力的过程。 从单机到联机&#xff0c;游戏乐趣的升级 1996 年&#xff0c;游戏界顶流…