C++ 重载运算符

article/2025/9/21 8:48:39

一、运算符重载

运算符重载是一种形式的C++多态。
在C++中,编译器有能力把一个由数据、对象和操作符共同组成的表达式,解释为对一个全局或成员函数的调用。该全局或成员函数被称为操作符函数,通过重定义操作符函数,可以实现针对自定义类型(结构,类)的运算法则,并使之与内置类型一样参与各种表达式。
重载运算符可使代码看起来更加自然。

要重载运算符,需使用被称为运算符函数的特殊函数形式:

operator op (argument-list)
  • operator是关键字
  • op必须是有效的C++运算符,不能虚构一个新的符号

可重载的运算符

+-*/%^
&|~=!=<
>+=-=*=/=%=
^=&=|=<<>>>>=
<<===!=<=>=&&
||++,->*->
( )[ ]newdeletenew[ ]delete[ ]
操作符的分类

这里写图片描述

二、典型的单目运算符重载

运算符重载有两种方法:
一种是在类中以成员函数定义,则对于单目运算符来说由于类中会默认提供this指针,所以不需要其他参数;第二种是以全局函数实现,则由于没有this指针,需要有类作为形参。
设有这样一个类

class Number
{int x;int y;
public:Number (void) { }Number(int x,int y):x(x),y(y){}~Number() { }
};

作为成员函数时:

  • 前++/–
Number& operator ++/-- (void){this->x++;this->y++;return *this;}
  • 后++/–:后++/– 会先使用初始的值,等语句执行后在进行加减
Number operator ++/-- (int)//int为虚参
{Number n(*this);//拷贝构造一个对象记录未++/--前的值this->x++;this->y++;return n;
}

作为全局函数时:

可能会访问到参数的私有成员,解决方法:

  • 1、把成员变成公开,但会破坏类的封闭性。
  • 2、把全局函数声明为友元函数

友元的声明:

friend Number& operator ++ (Number &num);//前++
friend Number operator ++ (Number &num,int);//后++

前++/–

 Number& operator ++/-- (Number& num) //++i{num.x++;num.y++;return num;
}

后++/–

Number operator ++/-- (Number &num,int)//int(虚参)用于区分前++/--和后++/--
{Number n1 = num;num.x++;num.y++;return n1;
}

三、典型的双目运算符重载

作为成员函数

Number operator /+-*%|^& (Number & that){Number t; // 调用无参构造t.x = x / that.x;t.y = y / that.y;return t; // 不能返回局部对象的引用,否则会出现悬空引用}

注意:原对象的值不变,需要产生一个临时的对象存储值来传递

 bool operator > < >= <= == != || && (Number & that){return this.x > that.y;}

判断运算符,返回bool值

Number & operator += -= *= /= (Number& that)
{this->x += that.x;this->y += that.y;    return *this; 
}

会改变自身的值,应该返回类引用.

全局函数

 Number operator + (Number& a,Number& b){Number t(a.x+b.x,a.y+b.y);return t;}

同样也需要声明为友元函数。

四、输入、输出运算符重载

输入、输出运算符不能重载为成员函数,只能是友元。
//输出
ostream& operator << (ostream& os,Number & num)
{cout << num.x << num.y << endl;return os;
}
//输入
istream& operator >> (istream& is,Number & num)
{return is >> num.x >> num.y;
}
//重载后就可以通过下面语句直接输入输出
Number n1;
cin >> n1;
cout << n1 << endl;

五、特殊的运算符的重载

  • [ ] 下标运算符,可以把对象当作数组来使用。
  • ( ) 函数运算符,可以把对象当作函数来使用。
  • -> 成员访问运算符,可以把对象当作指针来使用。
  • * 解引用运算符,可以把对象当作指针来使用。
  • new/delete 也可以进行重载,但不建议使用。
  • new会自动调用重载的new函数再构造函数。
  • delete会先调用析构再调用重载的delete函数。

六、运算符重载的一些限制

1、不能重载的运算符

:: (作用域限定符). (成员访问运算符)*(成员指针解引用)
?: (三目运算符)sizeof (字节长度运算符)typeid (类型信息操作符)

2、运算符的重载改变不了运算符的优先级
3、无法改变运算符的操作个数
4、无法发明新的运算符
5、重载运算符要注意运算符的一致性,不要改变运算符默认的运算规则
6、运算符的重载是为了方便使用、增强可读。


http://chatgpt.dhexx.cn/article/8fFtgDId.shtml

相关文章

C++重载决议

目录 前言一些与overload易混淆的概念override运算符重载 为什么需要重载决议&#xff1f;声明函数重载 什么是重载决议&#xff1f;什么不是函数重载&#xff1f; 重载决议之过程函数重载 && 函数模板before 重载决议more detailstype conversion(类型转换)rank&#…

重载

实质&#xff1a;重载的实质就是写一个重载函数语法&#xff1a;函数类型 operator 运算符名称 {对运算符的重载处理}说明&#xff1a;如果要对加号进行重载&#xff0c;则 “operator ” 就是函数名。方法&#xff1a; &#xff08;1&#xff09;成员函数法 定义&#xff1a…

重载运算符

输入带有空格的字符串 cin.getline(a[i]) 运算符重载的语法 定义一个重载的运算符与定义一个函数类似&#xff0c;只是这个函数的名称必须以operator开头。 运算符重载函数的一般形式为&#xff1a;类型 类名::operator 重载的运算符(参数表) {函数体 }参数的个数由以下两个…

Python——运算符重载

Python——运算符重载 1.加法运算符重载和减法运算符重载2.__str__()方法重载和__ge__()方法重载3.索引的切片重载 运算符重载指的是将运算符与类方法关联起来&#xff0c;每个运算符对应一个指定的内置方法。 Python通过重写一些内置方法&#xff0c;实现了运算符的重载功能。…

C++ 运算符重载

前言 本文引用于“C语言中文网”&#xff0c;我整理出来放在博客&#xff0c;方便大家共同学习。所有知识点和代码均已亲测可用&#xff0c;如有疑问&#xff0c;可提出&#xff0c;一起讨论学习。 本章内容&#xff1a; 1. C运算符重载的概念和原理 2. C重载&#xff08;C重…

配置使用Navicat或PLSQL可视化工具远程连接Oracle

写在前面 本文讲解的是在没有 Oracle 环境&#xff0c;如何使用可视化工具配置远程连接服务器 Oracle 数据库。 目录 写在前面一、概述二、下载 Oracle Instant Client三、配置环境变量四、配置监听五、可视化工具环境配置5.1、Navicat5.2、PLSQL 一、概述 很多时候&#xff0c…

Windows系统远程连接Linux系统操作

远程连接服务器管理时&#xff0c;系统不同可分为两种&#xff1a;一是Linux系统和Mac系统或者Linux系统之间连接&#xff1b;二是Windows系统连接到Linux系统 第一种情况下&#xff1a;在Linux系统和Mac系统下可以相互用命令"ssh [-p] 22 连接主机名主机IP地址"连…

怎么删除远程桌面连接计算机,win10系统强制删除远程桌面连接软件的方法

大家都知道win10系统中&#xff0c;自带有远程桌面连接软件&#xff0c;能够帮助我们实现远程控制其他计算机进行一系列操作&#xff0c;但是有些用户可能用不到这个软件&#xff0c;就想要强制删除远程桌面连接软件&#xff0c;那该怎么操作呢&#xff0c;小编这就给大家带来w…

被远程连接的windows一定要设置账号的密码吗

背景 我们有个windows系统&#xff08;方便表述叫P)&#xff0c;比如win10的&#xff0c;平时使用的用户名是a&#xff0c;没有登录密码&#xff0c;平时使用P的过程是允许没有密码登录操作系统的。 但是&#xff0c;如果使用另外一台windows远程连接它&#xff0c;就得为a设…

SecureCRT--远程连接工具

SecureCRT简介 Linux一般作为服务器使用&#xff0c;而服务器一般放在机房&#xff0c;你不可能在机房操作你的Linux服务器。这时我们就需要远程登录到Linux服务器来管理维护系统。 Linux系统中是通过SSH服务实现的远程登录功能&#xff0c;默认ssh服务端口号为 22。Window系…

【rdesktop】超实用的ubuntu远程连接windows软件

个人定制命令行 rdesktop 192.168.50.118 -u zhankun -p LPjj1234 -z -a 16 -x lan -r clipboard -g 1920x105000 -r sound:local -r disk:share/home/lyp/zk_share1、ubuntu端 sudo apt install rdesktop2、Windows端 1.计算机—属性—远程设置—远程&#xff0c;勾选&…

Mac远程控制软件有哪些?Macos好用的远程桌面连接软件推荐

Mac功能强大&#xff0c;但是远程协助有点麻烦&#xff0c;此时需要专业的 Mac远程控制软件。远程桌面自带系统连接不太好用&#xff0c;一般不懂计算机的人很难成功。还推荐使用专用的远程控制软件实现&#xff0c;操作简单&#xff0c;不需要很多计算机知识。就下载量和好评率…

远程连接——Win连接远程Linux的软件

SSH客户端主要用来远程访问服务器。 因为像Linux之类的系统要想在Windows上面存在&#xff0c;基本都是通过虚拟机&#xff0c;就好比搭建了一个服务器&#xff0c;你要连接这个系统&#xff0c;自然需要用到一些工具&#xff0c;而SSH客户端就属于这样的工具&#xff0c;或者…

有服务器可以远程连接电脑软件,支持远程控制电脑的工具有哪些?这几款软件值得一试!...

对于普通人来说,如果自己身处于一线工作城市,与异地的家人进行聊天时,他们遇到了电脑上的某种问题时,而我们直接靠说话或文字,并不能直接来解决他们所遇到的问题,他们自己又根本不会操作,此时直接控制他们的电脑就是一个非常棒的方法,既可以解决了问题,不需要多费口舌…

centos 7.6上面安装向日葵远程连接软件

原文&#xff1a;https://www.cnblogs.com/yunjisuan1024/p/11731369.html 下载&#xff1a;https://sunlogin.oray.com/download/ 安装教程&#xff1a;https://service.oray.com/question/11017.html 依赖问题&#xff1a;https://service.oray.com/question/8286.html Cen…

Navicat远程连接MySQL服务器

文章目录 一、准备二、配置Navicat允许远程连接MySQL数据库1、使用Navicat直接连接MySQL2、使用 Navicat 通过 SSH 远程登录后再本地方式连接 MySQL3、查看连接 为什么使用ssh登录1.便捷性 Navicat:数据库可视化工具 一、准备 一台开启 SSH 登录的 Linux 服务器 或 已开启远程…

Linux远程连接和软件安装

Linux远程连接和软件安装 文章目录 Linux远程连接和软件安装1.Linux远程连接简介2.远程连接准备3.Linux进程和程序4.moba实现远程连接步骤:5.软件安装1)yum命令:在线安装2)rpm命令:直接安装3)tar:解压安装4)unzip:解压安装 1.Linux远程连接简介 SSH协议(Secure Shell):专为远程…

推荐|6 款免费又好用的远程管理工具

「 读者福利&#xff01;2 TB 各类技术资源免费赠送 」 大家好&#xff0c;我是你们的民哥。 2020年开年&#xff0c;让大家意想不到的是&#xff0c;本以为很短暂的假期&#xff0c;却因为这个疫情一推再推&#xff0c;很多人做梦也没有想到&#xff1a;能在家呆这么长时间&am…

推荐几款主流好用的远程终端连接管理软件

一、介绍 远程终端连接管理软件是管理服务器、虚拟机等远程计算机系统不可或缺的工具之一&#xff0c;它可以通过网络连接到另一台计算机&#xff0c;以执行命令、编辑文件或进行其他管理任务&#xff0c;下面我将为大家介绍几款主流好用的远程终端连接管理软件&#xff0c;并…

SSO单点登录原理及实现

一、SSO简介 单点登录&#xff08; Single Sign-On , 简称 SSO &#xff09;是多个相关但独立的软件系统访问控制的一个属性。通过使用该属性&#xff0c;用户登录与单个ID和密码来访问所连接的一个或多个系统&#xff0c;而不使用不同的用户名或密码&#xff0c;或在某些配置…