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

C++基础之运算符重载(十一)

首先为什么要对运算符进行重载?因为C++内置的运算符只能作用于一些基本数据类型,而对类和结构体这种自定义数据类型是不管用的。所以这时我们需要对运算符进行重新定义满足一定的运算规则。

运算符重载的三种形式

1.以普通的函数进行重载

#include <iostream>using std::cout;
using std::cin;
using std::endl;class Complex
{
private:int _real;int _image;
public:Complex(int real=0 ,int image=0);~Complex();int getReal()const;int getImage()const;void print();
};Complex::Complex(int real ,int image)
:_real(real)
,_image(image)
{cout<<"complex()"<<endl;
}Complex::~Complex()
{cout<<"~Complex()"<<endl;
}
int Complex::getImage() const
{return _image;
}
int Complex::getReal() const
{return _real;
}
Complex operator+(const Complex& rhs1,const Complex& rhs2)
{return Complex(rhs1.getReal()+rhs2.getReal(),rhs1.getImage()+rhs2.getImage());
}void Complex::print()
{cout<<_real<<" + "<<_image<<"i"<<endl;
}int main()
{Complex a(1,2);Complex b(2,3);Complex c=a+b;c.print();return 0;
}

有几个问题需要注意:

1.在类外调用private成员变量需要写个public接口函数。

2.返回临时对象不能加&引用,此时调用两次拷贝构造函数,将临时对象返回给operator+()时满足拷贝函数调用时机3,而将operator+()函数赋值给c又满足拷贝构造函数调用时机1。

3.const 对象只能调用const成员函数,因此Complex operator+(const Complex& rhs1,const Complex& rhs2)中的rhs1和rhs2两个对象只能调用const的成员函数,所以要将getReal()和getImage()设置成const。

4.当构造函数的定义和声明分开时,在设置默认参数时要注意只需要在一个地方设置默认参数,要么在声明出设置默认参数,要么在定义出设置默认参数。

2.以成员函数进行重载

#include <iostream>using std::cin;
using std::cout;
using std::endl;class Complex
{
private:int _real;int _image;public:Complex(int real, int image);~Complex();//函数中隐藏了this指针,+参数只能有两个Complex operator+(const Complex& rhs2);void print() const{cout<<_real<<" + "<<_image<<"i"<<endl;}
};Complex::Complex(int real=0, int image=0): _real(real), _image(image)
{cout<<"Complex()"<<endl; 
}Complex::~Complex()
{cout<<"~Complex()"<<endl;
}
//
Complex Complex::operator+(const Complex& rhs2)
{Complex temp;temp._real=this->_real+rhs2._real;temp._image=this->_image+rhs2._image;return temp;
}
int main()
{Complex a(1,2);Complex b(2,3);Complex c=a+b;c.print();}

 要注意的是:

在定义成员函数的运算符重载时,在非静态成员函数的参数第一个位置默认有一个this变量。

因此我们只需要设置一个Complex形参。

3.以友元函数进行重载

#include <iostream>using std::cout;
using std::endl;class Complex
{
private:int _real;int _image;
public:Complex(int real,int image);~Complex();friend Complex operator+(const Complex& rhs1,const Complex& rhs2);void print() const;
};Complex::Complex(int real=0,int image=0)
:_real(real)
,_image(image)
{cout<<"Complex()"<<endl;
}Complex::~Complex()
{cout<<"~Complex()"<<endl;
}Complex operator+(const Complex& rhs1,const Complex& rhs2)
{return Complex(rhs1._real+rhs2._real,rhs1._image+rhs2._image);
}
void Complex::print() const
{cout<<_real<<" + "<<_image<<"i"<<endl;
}
int main()
{Complex a(2,3);Complex b(3,4);Complex c=a+b;c.print();return 0;
}

可以看出在运算符重载时用友元函数比其他两种方法更加清晰简单。

在举个(a++)和(++a)的例子

#include <iostream>using std::cout;
using std::endl;class Complex
{
private:int _real;int _image;
public:Complex(int real,int image);~Complex();friend Complex operator+(const Complex& rhs1,const Complex& rhs2);Complex& operator++();Complex operator++(int);void print() const;
};Complex::Complex(int real=0,int image=0)
:_real(real)
,_image(image)
{cout<<"Complex()"<<endl;
}Complex::~Complex()
{cout<<"~Complex()"<<endl;
}Complex operator+(const Complex& rhs1,const Complex& rhs2)
{return Complex(rhs1._real+rhs2._real,rhs1._image+rhs2._image);
}
void Complex::print() const
{cout<<_real<<" + "<<_image<<"i"<<endl;
}Complex& Complex::operator++()
{++_real;++_image;return *this;
}
Complex Complex::operator++(int)
{Complex tem=*this;_real++;_image++;return tem;
}
int main()
{Complex a(2,3);Complex b(3,4);cout<<"(a++).print() = ";(a++).print();cout<<endl<<endl;cout<<"a.print() = ";a.print();cout<<endl<<endl;cout<<"(++b).print() = ";(++b).print();return 0;
}

运算符重载的规则

1.为了防止用户对标准类型进行运算符重载,C++规定重载的运算符的操作对象必须至少有一个是自定义类型或枚举类型。

2.重载运算符之后,其优先级和结合性还是固定不变的。

3.重载逻辑运算符(&&,||)后,不再具备短路求值特性。

4.重载不会改变运算符的用法,如操作数的个数、操作数的位置,这些都不会改变。

5.不可重载的运算符 (  .   ::   ?:     *.     sizeof   )

相关文章:

C++基础之运算符重载(十一)

首先为什么要对运算符进行重载&#xff1f;因为C内置的运算符只能作用于一些基本数据类型&#xff0c;而对类和结构体这种自定义数据类型是不管用的。所以这时我们需要对运算符进行重新定义满足一定的运算规则。 运算符重载的三种形式 1.以普通的函数进行重载 #include <…...

初始Java篇(JavaSE基础语法)(2)(逻辑控制)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 逻辑控制 顺序结构 分支结构 if语句 switch 语句 循环结构 while 循环 for 循环 do while 循环 输入输出 输出到控制台 从键盘输入 …...

家用路由器和企业路由器的区别?

一、家用路由器 家用路由器路由器交换机 它只有一个WAN口和一个LAN口&#xff0c;WAN口接公网一个地址&#xff0c;LAN口接你电脑一个IP地址&#xff0c;完全符合路由器的设计&#xff0c;而因为家里如果用了&#xff0c;说明要接多个电脑&#xff0c;那么如果还需要对每个接口…...

Gin简介(Go web基础知识)

Gin简介 https://geektutu.com/post/quick-go-gin.html我是从这个网站上面摘录的&#xff0c;就是做个笔记&#xff0c;仅分享。膜拜极客兔兔大佬 Go特性&#xff1a; 快速&#xff1a;路由不使用反射&#xff0c;基于Radix树&#xff0c;内存占用少。 中间件&#xff1a;HT…...

HBase的Bulk Load流程

目录 1. 数据准备 2. 文件移动 3. 加载数据 4. Region处理 5. 元数据更新 6. 完成加载 7. 清理 8. 异常处理 LoadIncrementalHFiles&#xff08;也称为Bulk Load&#xff09;是HBase中一种将大量数据高效导入到HBase表的机制。以下是LoadIncrementalHFiles的主要流程步…...

vue中图片替换 遇到问题

问题&#xff1a; 在img标签里动态绑定路径&#xff1a;<img v-bind:src"imgSrc" /> data里这样写是错误的&#xff1a;imgSrc:xx/xx.png 这样渲染的路径会有问题&#xff0c;导致出不来图片 解决了 是这样的 data(){return(){imgSrc:require("../…...

Android 观察者模式

在Android中&#xff0c;观察者模式&#xff08;Observer Pattern&#xff09;是一种常用的设计模式&#xff0c;用于在对象之间建立一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。在Android开发中&#xff0…...

阿里云部署MySQL、Redis、RocketMQ、Nacos集群

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容MySQL集群配置云服务器选购CPU选择内存选择云盘选择ESSD AutoPL云盘块存储性能&#xff08;ESSD&#xff09; 镜像选择带宽选择密码配置注意事项 安装docker和docker-compose部署MySQL三主六从半同步集群一主二从同步集群规…...

day05-店铺营业状态设置

1. Redis入门 1.1 Redis简介 Redis 是一个基于内存的 key-value 结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。 官网&#xff1a; https://redis.io 中文网&#xff1a; https://www.redis.net.cn/ 主要特点&#xff1a; 基于内存存储&#xff0c;读写性能高…...

哈希表(c++)

1、介绍 哈希表&#xff0c;也称为散列表&#xff0c;是一种非常高效的数据结构。它通过将键&#xff08;Key&#xff09;映射到数组的特定位置来快速查找、插入和删除数据。这个映射过程由哈希函数&#xff08;Hash Function&#xff09;完成&#xff0c;该函数将键转化为一个…...

C#基础-标识符命名规则

目录 1、标识符定义 2、遵循规则 3、标识符的例子 4、MSDN中英文解释 英文...

Zabbix Web界面中文汉化

要想达到上图的效果&#xff0c;第一步先查看 /usr/share/zabbix/assets/fonts/ [rootservice yum.repos.d]# ll /usr/share/zabbix/assets/fonts/ 总用量 0 lrwxrwxrwx. 1 root root 33 3月 23 16:58 graphfont.ttf -> /etc/alternatives/zabbix-web-font 继续查看graph…...

esp32CAM环境搭建(arduino+MicroPython+thonny+固件)

arduino ide 开发工具 arduino版本&#xff1a;1.8.19 arduino ide 中文设置&#xff1a;​ file >> preferences >> ​ arduino IDE 获取 ESP32 开发环境&#xff1a;打开 Arduino IDE &#xff0c;找到 文件>首选项 ,将 ESP32 的配置链接填入附加开发板管理网…...

Spring Boot从入门到实战

课程介绍 本课程从SpringBoot的最基础的安装、配置开始到SpringBoot的日志管理、Web业务开发、数据存储、数据缓存&#xff0c;安全控制及相关企业级应用&#xff0c;全程案例贯穿&#xff0c;案例每一步的都会讲解实现思路&#xff0c;全程手敲代码实现。让你不仅能够掌Sprin…...

Spring Boot(七十一):整合RateLimiter实现接口限流

1 简介 RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可证。如果必要的话,每个acquire() 会阻塞当前线程直到许可证可用后获取该许可证。一旦获取到许可证,不需要再释放许可证。 RateLimiter使用的是一种叫令牌桶的流控算法,RateLimiter会按照一定的频率…...

通过jsDelivr实现Github的图床CDN加速

最近小伙伴们是否发现访问我的个人博客http://xiejava.ishareread.com/图片显示特别快了&#xff1f; 我的博客的图片是放在github上的&#xff0c;众所周知的原因&#xff0c;github访问不是很快&#xff0c;尤其是hexo博客用github做图床经常图片刷不出来。一直想换图床&…...

Kafka系列之:Connect 中的错误报告

Kafka系列之:Connect 中的错误报告 Kafka Connect 提供错误报告来处理各个处理阶段遇到的错误。默认情况下,转换期间或转换中遇到的任何错误都会导致连接器失败。每个连接器配置还可以通过跳过此类错误、选择性地将每个错误以及失败操作的详细信息和有问题的记录(具有各种详…...

MySQL面试题--开发(最全,涵盖SQL基础、架构、事务)

MySQL面试题--事务https://mp.csdn.net/mp_blog/creation/editor/136947072 MySQL面试题--MySQL内部技术架构https://blog.csdn.net/Timebro/article/details/136946046?spm1001.2014.3001.5501 MySQL面试题--最全面-索引https://blog.csdn.net/Timebro/article/details/136…...

【移动端】Flutter 获取Android AMap实例

背景 本文的背景&#xff0c;是因为我在开发高德地图时&#xff0c;需要自定义高德比例尺位置和样式&#xff1b;但结果查看了AMap Flutter插件和AMap SDK源码后&#xff0c;发现AMap无法添加自定义MyMethodCallHandler的实现类&#xff01; why&#xff1f; 源码 在Flutte…...

什么是PLC物联网关?PLC物联网关有哪些功能?

在数字化浪潮的推动下&#xff0c;工业物联网&#xff08;IIoT&#xff09;正逐步成为推动制造业智能化转型的关键力量。而在这一变革中&#xff0c;PLC物联网关扮演着至关重要的角色。今天&#xff0c;就让我们一起走进PLC物联网关的世界&#xff0c;了解它的定义、功能&#…...

PDF-Extract-Kit-1.0在Linux系统下的高效部署指南

PDF-Extract-Kit-1.0在Linux系统下的高效部署指南 1. 开篇&#xff1a;为什么选择PDF-Extract-Kit&#xff1f; 如果你经常需要从PDF文档中提取内容&#xff0c;肯定遇到过各种头疼的问题&#xff1a;格式错乱、表格识别不准、公式无法提取、排版复杂难以处理。PDF-Extract-K…...

编程新手必看:C语言基础全解析

在当今这个数字化时代&#xff0c;编程已成为一项不可或缺的技能。而C语言&#xff0c;作为编程世界的“老牌强者”&#xff0c;不仅因其高效、灵活的特点被广泛应用于系统编程、嵌入式开发等领域&#xff0c;更是许多编程爱好者学习编程的首选语言。本文将带你走进C语言的世界…...

OpenClaw+百川2-13B量化模型:个人知识库自动整理方案实测

OpenClaw百川2-13B量化模型&#xff1a;个人知识库自动整理方案实测 1. 为什么需要自动化知识管理 作为一个长期与技术文档打交道的开发者&#xff0c;我的电脑里堆积着超过200GB的未整理资料——从会议录音转写的文字稿、GitHub扒下来的开源项目说明&#xff0c;到随手保存的…...

MySQL大小写规则与存储引擎详解

目录 MySQL在Linux下数据库名、表名、列名、别名大小写规则 SQL编写建议&#xff1a; 默认数据库里都是什么内容&#xff1f; &#xff08;1&#xff09;mysql &#xff08;2&#xff09;information_schema &#xff08;3&#xff09;performance_schema &#xff08;4…...

GLM-OCR硬件优化指南:为GPU部署调整显存与算力配置

GLM-OCR硬件优化指南&#xff1a;为GPU部署调整显存与算力配置 如果你正在尝试部署GLM-OCR模型&#xff0c;是不是也遇到过这样的困惑&#xff1a;明明选了看起来不错的GPU&#xff0c;但推理时要么爆显存&#xff0c;要么速度慢得让人着急&#xff0c;钱花了效果却没达到预期…...

基于MATLAB与机器学习(SVM)的裂缝检测识别系统,附GUI界面、特征参数计算与Excel...

基于MATLAB和机器学习&#xff08;向量机&#xff09;的裂缝检测&#xff08;识别&#xff09;系统程序&#xff0c;带GUI界面&#xff0c;对裂缝主要参数&#xff08;长度&#xff0c;宽度&#xff0c;面积&#xff09;进行计算&#xff0c;已经训练好分类器&#xff0c;包含裂…...

PouchContainer安全最佳实践:从镜像安全到运行时保护的终极指南

PouchContainer安全最佳实践&#xff1a;从镜像安全到运行时保护的终极指南 【免费下载链接】pouch An Efficient Enterprise-class Container Engine 项目地址: https://gitcode.com/gh_mirrors/po/pouch PouchContainer作为企业级容器引擎&#xff0c;为生产环境提供了…...

JAVA面试-JVM内存结构详解

Java虚拟机&#xff08;JVM&#xff09;内存结构&#xff0c;也称内存模型&#xff0c;是程序运行时的数据存储区域。根据《Java虚拟机规范》&#xff0c;可划分为线程私有和线程共享两大部分&#xff0c;以实现高效的内存管理和线程安全。其主要构成如下表所示&#xff1a; 内…...

别再只查表了!用MATLAB调用Python包(如NumPy, Pandas)的完整环境配置教程

MATLAB与Python强强联合&#xff1a;从环境配置到实战调用的全流程指南 当MATLAB遇上Python&#xff0c;会碰撞出怎样的火花&#xff1f;作为两个在科学计算领域举足轻重的工具&#xff0c;MATLAB以其强大的矩阵运算和可视化能力著称&#xff0c;而Python则凭借丰富的第三方库生…...

特征根法在三对角线型行列式求解中的高效应用

1. 三对角线型行列式为何需要特征根法 第一次遇到三对角线型行列式时&#xff0c;我像大多数人一样尝试用常规的展开法计算。结果发现当阶数超过4阶时&#xff0c;计算量呈指数级增长&#xff0c;草稿纸堆了半尺高还是算不对。这种主对角线及其相邻两条对角线上有非零元素&…...