当前位置: 首页 > 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…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

Ray框架:分布式AI训练与调参实践

Ray框架&#xff1a;分布式AI训练与调参实践 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 Ray框架&#xff1a;分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...

SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈

【导读】 本文针对无人机&#xff08;UAV&#xff09;视频中目标尺寸小、运动快导致的多目标跟踪难题&#xff0c;提出一种更简单高效的方法。核心创新在于从低置信度检测启动跟踪&#xff08;贴合无人机场景特性&#xff09;&#xff0c;并改进传统外观匹配算法以关联此类检测…...