当前位置: 首页 > news >正文

【c++】运算符重载实例

重载自增自减运算符

Intger num(2);
num++;
++num;

对自增运算符的重载要区分前置和后置。在重载之前需要思考一个问题,num++是返回一个临时变量还是num对象的本体。

为了解决这个问题可以考虑实现一个Inc_()函数和_Inc()函数分别模仿后置++和前置++的行为

Integer Inc_(){int t=this->_num;this->_num+=1;        return Integer(t);
}
Integer& _Inc(){this->_num++;return *this;
}

分别调用这两个函数

Integer num(3);
auto t=num.Inc_();
std::cout<<t.getValue();

调用Inc()_输出结果如下
在这里插入图片描述

Integer num(3);
auto t=num._Inc();
std::cout<<t.getValue();

调用_Inc()输出结果如下
在这里插入图片描述

通过这个例子不难看出后置++返回的是临时对象,前置++返回的是本体。

接下来就开始重载前置++和后置++

Integer operator++(){//后置++int t=this->_num;this->_num+=1;return Integer(t);
}
Integer& operator++(){//前置++   this->_num++;return *this;
}

但是如果这样写就会报错,因为函数重载是通过参数列表进行区分的,而不是通过返回值类型进行区分。
在这里插入图片描述

通常对于后置++要使用站位参数

Integer operator++(int){//后置++int t=this->_num;this->_num+=1;return Integer(t);
}

重载逻辑运算符和单目运算符

逻辑与

bool operator&&(const Integer&right)const
{return this->_num&&right._num;
}
std::cout<<std::boolalpha<<(Integer(0)&&Integer(1));

在这里插入图片描述

单目负

Integer operator -(){return Integer(-this->_num);
}

括号运算符

()函数调用运算符

重载了这运算符,对象就有了函数的行为(仿函数)

class Program
{
public:void operator()(){//第一个括号是运算符std::cout<<"hello world";}
};
Program p;
p();//调用括号运算符

在这里插入图片描述

重载括号运算符是可以有参数的

class Program
{
public:void operator()(int i){//第一个括号是运算符std::cout<<"i="<<i<<"hello world";}
};

在这里插入图片描述
说明

  • 函数调用运算符只能用非静态成员函数重载
  • 函数调用运算符可以有任意个参数,但不能有默认参数

[]下标访问运算符

class String
{
private:int size;char*str;
public:String(const char*str){size=strlen(str);this->str=new char[size+1]{0};strcpy(this->str,str);}int Size(){return size;}
};
int main()
{String str="hello world";return 0;
}

假设现在要有这样的一个操作

//循环遍历str内部的字符串
for(int i=0;i<str.Size();i++)
{//to do
}

这个时候如何重载了下标访问运算符就可以通过str[i]遍历内部的字符串,这样操作是不是就相当方便了

char& operator[](int i){return str[i];
}

说明

  • []是一个二元运算符,具有数组名和下标两个参数,数组名由编译器通过this指针隐式传递,因此参数表中只需要提供一个参数。
  • []可以同时出现在赋值运算符左边和右边,所以重载是常常返回引用,因为返回引用的函数可以出现在=的左边调用。
  • 只能用非静态成员函数重载

和指针有关的运算符

int main()
{int*a=new int[5];return 0;
}

上面的这个程序进行new操作后没有delete会造成内存泄漏,但如果就是忘掉了delete呢?这个可以通过自己实现一个类来解决这个问题。

class Auto_Ptr
{
public:Auto_Ptr(int*ptr):m_ptr(ptr){}~Auto_Ptr(){delete m_ptr;}
private:int*m_ptr;
};
int*a=new int[5];
Auto_Ptr pa(a);

Auto_Ptr这个类帮我们完成了delete操作,这样就不用担心new了之后忘记delete了。
那么如何让Auto_Ptr则个类更像指针,那么就要重载一些运算符

class People
{
private:int age_;std::string name_;
public:People(const std::string name,int age):name_(name),age_(age){}std::string name()const{return name_;}
};
class Auto_Ptr
{
public:Auto_Ptr(People*ptr):m_ptr(ptr){}~Auto_Ptr(){delete m_ptr;}People *operator->(){return m_ptr;}People *operator&(){return m_ptr;}People operator*(){return m_ptr[0];}
private:People*m_ptr;
};

在这里插入图片描述

总结

  1. 目的:为已有的运算符赋予新的含义,以方便我们使用。
  2. 实质:函数重载的一种形式,或者说是一种特殊的函数。
  3. 规则:
    • 只能重载C++中已经定义好的运算符。
    • 不能创建新的运算符。
    • 运算符重载后,其优先级、结合性等保持不变。
    • 不能改变运算符的语法结构。
  4. 重载运算符的函数原型:返回类型 operator 运算符 (参数列表)。
  5. 重载运算符的参数:可以有一个或多个参数。当运算符有多个参数时,参数之间用逗号隔开。
  6. 重载运算符的返回类型:可以是任何数据类型,包括基本数据类型和自定义类型。
  7. 运算符重载的方法:
    • 前缀形式:例如,重载++运算符时,函数名为 operator++()。
    • 后缀形式:例如,重载++运算符时,函数名为 operator++(int)。注意,这里的int是虚拟参数,并不代表真实的类型。
      注意事项:
  8. 重载的运算符必须与用户使用的输入匹配。如果用户使用了不同的输入,则不会调用该重载的运算符。
  9. 应该小心使用复杂的运算符重载,因为这可能导致程序的可读性和可维护性下降。如果发现自己在重载运算符时使用了过多的参数或者做出了过于复杂的操作,那么可能需要重新考虑一下设计。
  10. 在重载运算符时,需要确保不会破坏原有运算符的语义和语法规则。例如,你不能改变运算符的优先级或结合性。
    在重载运算符时,需要确保重载后的运算符能够与使用它的代码和谐共存。例如,你不能让重载后的运算符破坏了原有代码的结构或者逻辑。

总的来说,虽然运算符重载提供了很大的灵活性,但是需要谨慎使用,以避免引入不必要的复杂性。在重载运算符时,应该尽量保持原有的语义和语法规则,以确保代码的可读性和可维护性。

相关文章:

【c++】运算符重载实例

重载自增自减运算符 Intger num(2); num; num;对自增运算符的重载要区分前置和后置。在重载之前需要思考一个问题&#xff0c;num是返回一个临时变量还是num对象的本体。 为了解决这个问题可以考虑实现一个Inc_()函数和_Inc()函数分别模仿后置和前置的行为 Integer Inc_(){i…...

用*画田字形状,numpy和字符串格式化都可以胜任

numpy的字符型元素矩阵&#xff0c;可以方便画&#xff1b;直接python字符串手撕&#xff0c;也可以轻巧完成。 (本笔记适合熟悉循环和列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《…...

搭建一个windows的DevOps环境记录

边搭建边记录&#xff0c;整个DevOps环境的搭建可能会很久。。。 一、安装Jenkins&#xff1a; 参考&#xff1a;Jenkins基础篇--windows安装Jenkins-CSDN博客 注意上面选择JDK的路径&#xff0c;选择到安装目录&#xff0c;该目录并不一定要在path中配置了&#xff08;就是…...

漏洞扫描系统的主要功能有哪些

漏洞扫描系统是一种自动化的工具&#xff0c;用于发现和报告计算机网络系统中的安全漏洞。这些漏洞可能包括软件漏洞、配置错误、不安全的网络设备等。漏洞扫描系统的主要功能包括以下几个方面&#xff1a; 目标识别&#xff1a;漏洞扫描系统首先需要识别目标系统的基本信息&am…...

Spring Boot配置多个Kafka数据源

一、配置文件 application.properties配置文件如下 #kafka多数据源配置 #kafka数据源一&#xff0c;日志审计推送 spring.kafka.one.bootstrap-servers172.19.12.109:32182 spring.kafka.one.producer.retries0 spring.kafka.one.producer.properties.max.block.ms5000 #kafk…...

Learning Open-World Object Proposals without Learning to Classify(论文解析)

Learning Open-World Object Proposals without Learning to Classify 摘要1 介绍2 相关工作3 方法3.1 基线3.2 基于纯定位的对象性3.3. 对象定位网络 (OLN)4 实验4.1跨类泛化4.2.开放世界类不可知检测4.3更多的跨数据集泛化4.3.1 Objects365 泛化4.3.2 EpicKitchens 的泛化4.4…...

前端在项目中添加自己的功能页面

1.src—>mock–>sideMenue:边表(sidemenue)的子功能的添加&#xff1a;左边功能框中的显示 在相应的父功能添加子功能 id号不能和他人的一样&#xff0c;casecode:就是路由名字 title&#xff1a;中文名称 2.前后端接口(后端程序员给),定义好接口名称 src—>moudles—…...

数据库MySQL(二):DDL数据定义语言

数据定义语言&#xff08;Data Definition Language&#xff0c;DDL&#xff09; 该语言主要用于定义数据库对象&#xff0c;操作对象为数据库、表或字段。 数据库操作 # 查询所有数据库 SHOW DATABASES;# 查询当前数据库 SELECT DATABASE(); # 创建数据库 CREATE DATABASE […...

Spring FactoryBean 源码讲解

Spring FactoryBean 源码讲解 什么是Spring FactoryBean Spring FactoryBean是一个特殊的Bean&#xff0c;它实现了FactoryBean接口并重写了其getObject()方法&#xff0c;用于生产其他Bean的实例。在Spring容器启动时&#xff0c;会自动调用FactoryBean的getObject()方法来获…...

【C语言】零碎知识点|细节

除法运算符(/)的使用规则 在C语言中,除法运算符(/)的使用规则如下: 当两个整数相除时,结果也是一个整数。例如,如果A和B都是整数,那么A / B的结果也是一个整数。这意味着,除法运算的结果会忽略小数部分。例如,10 / 3 的结果是3,而不是3.3333。 当一个整数和一个浮点…...

电影评分数据分析案例-Spark SQL

# cording:utf8from pyspark.sql import SparkSession from pyspark.sql.types import IntegerType, StringType, StructType import pyspark.sql.functions as Fif __name__ __main__:# 0.构建执行环境入口对象SparkSessionspark SparkSession.builder.\appName(movie_demo)…...

vue如何使用冻结对象提升代码效率及其原理解析

先给大家伙整个实际工作中一定会碰到的问题 如下vue dome ,它的代码非常简单功能也1非常简单,就是一个按钮,点击后会显示有多少条数据 来看看源码, html部分就是一个按钮绑定了一个loadData事件,然后在p标签内展示了这个myData这个数据的长度 <template><div id&quo…...

基于深度学习网络的手势识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(pwd)); rng(default)load gnet.mat[Pr…...

[论文笔记] 多语言模型中的负干扰研究结果和元学习算法

On Negative Interference in Multilingual Models: Findings and A Meta-Learning Treatment 多语言模型中的负干扰:研究结果和元学习解决办法 概述: 训练语料库大小(训练数据大小和 负干扰 无关)。 语言亲缘关系/语系 和 负干扰 有关。添加相似的语言并不能减轻负面干扰。…...

【OpenVINO】行人摔倒检测 — 基于 OpenVINO C# API 部署PP-Human-下篇

行人摔倒检测 — 基于 OpenVINO C# API 部署PP-Human 4. 配置 PP-Human_Fall_Detection 项目4.1 环境配置4.2 创建 AlxBoard_deploy_yolov8 项目4.3 添加项目源码4.4 添加 OpenVINO C# API4.5 添加 OpenCvSharp 5. 测试 PP-Human_Fall_Detection 项目5.1 创建视频读取器5.2 行人…...

运行报错(三)git bash报错fatal: detected dubious ownership in repository at

报错现象 在运行git 命令时&#xff0c;出现报错 “fatal: detected dubious ownership in repository at” 报错原因 文件夹的所有者和现在的用户不一致 栗子&#xff1a; 文件夹的所有者是root&#xff0c;而当前用户是admin 解决方案 方法一、 将文件夹的所有者替换成ad…...

nvm 的安装及使用

文章目录 一、nvm是什么&#xff1f;二、下载nvm三、在cmd控制台进行操作1、nvm 查询版本号2、查询可以下载的node版本3、安装指定版本4、查看已经安装的node版本5、切换node版本(如果失败那就用管理员身份打开cmd进行切换) 一、nvm是什么&#xff1f; nvm是一个node的版本管理…...

xcode Simulator 安装

xcode Simulator 安装 参考文档 xcode又又又升级了&#xff0c;升级完成之后不下载最新的 iOS 17 Simulator就不能编译运行了&#xff0c;只能静静的等他下载。但是离谱的是这个居然没有断点续下&#xff0c;每次都要重新下载&#xff0c;眼睁睁的看着下载了4个G然后断掉了从…...

【Maven教程】(八):使用 Nexus 创建私服 ~

Maven 使用 Nexus 创建私服 1️⃣ Nexus简介2️⃣ 安装 Nexus2.1 下载 Nexus2.2 Bundle 方式安装 Nexus2.3 WAR 方式安装 Nexus2.4 登录 Nexus 3️⃣ Nexus 的仓库与仓库组3.1 Nexus 内置的仓库3.2 Nexus 仓库分类的概念3.3 创建 Nexus 宿主仓库3.4 创建 Nexus 代理仓库3.5 创…...

螺旋矩阵[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个m行n列的矩阵matrix&#xff0c;请按照顺时针螺旋顺序&#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xf…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

MeshGPT 笔记

[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭&#xff01;_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...