重载运算符

article/2025/9/21 8:43:47

输入带有空格的字符串

cin.getline(a[i])

运算符重载的语法

  • 定义一个重载的运算符与定义一个函数类似,只是这个函数的名称必须以operator开头。

运算符重载函数的一般形式为:类型	类名::operator 重载的运算符(参数表)
{函数体
}

 

参数的个数由以下两个因素决定:

  1. 该操作符是一元操作符还是二元操作符。
  2. 重载为成员函数还是友元函数。

 

运算符重载的两种形式

 

运算符重载函数是如何调用的?

 

运算符重载函数作为类的成员函数

 

成员运算符重载函数在类中的声明格式为:
class  X
{   …… <返回数据类型> operator <运算符> (<参数表>);……
};成员运算符重载函数在类外定义的格式为:
<返回数据类型>  X:: operator <运算符> (<参数表>)
{ <函数体>
}

举例:

class CComplex
{public:CComplex(double r=0.0,double i=0.0){real=r,imag=i;}void print() const;CComplex operator++();		//前缀CComplex operator++(int);		//后缀CComplex operator--();		//前缀CComplex operator--(int);		//后缀
};

常对象

 

运算符重载的限制

  • 只能重载已经存在的C++运算符
  • 运算符重载不能改变运算符操作数的个数,优先级和结合性
  • 运算符的操作数必须至少有一个某个类的类对象,否则不能对运算符进行重载
  • 重载运算符不可以使用缺省参数;
  • 除了赋值运算符 = 外,重载运算符可由派生类继承下去;
  • 下列运算符不能重载:   ::            .*    .    ?:    sizeof

 

运算符重载函数作为友元函数

  • 运算符重载函数可以用友元函数的形式来实现。
  • 函数参数的个数与运算符原有操作数个数相同
  1. 第一个参数表示左操作数
  2. 第二个参数表示右操作数
  3. 第一个参数类型为类对象的引用
  • 赋值运算符‘=’、下标运算符‘[]’、成员选择运算符‘->’和函数调用运算符‘()’等不能用友元函数形式重载
友元运算符重载函数在类中的声明格式为:class  X{  …… friend  <返回数据类型> operator <运算符> (<参数表>);……};
友元运算符重载函数在类外定义的格式为:<返回数据类型>  operator <运算符> (<参数表>){ <函数体>} 

 

重载为成员函数与重载为友元函数的比较

“+”重载为成员函数
CComplex   CComplex::operator+(const CComplex&  c)
{return CComplex(real+c.real, image+c.image);
}
“+”重载为友元函数
CComplex  operator+(const CComplex&  c1,const CComplex& c2)
{return Complex(c1.real+c2.real,  c1.image+c2.image);
}										

 

运算符重载应用

  • 以下运算符经常需要重载:

             1.算术运算符   2.关系运算符

             3.逻辑运算符   4.赋值运算符

             5.下标运算符   6.函数调用运算符

 

特殊运算符的重载

= 运算符的重载

class Complex
{public:Complex(double r=0.0,double i=0.0){real=r,imag=i;}void display();Complex& operator=(const Complex& r_c);
};

【*如果类没有定义赋值运算符重载函数,则编译程序会提供缺省的赋值运算符,就是将赋值运算符右边对象的数据域复制给其左边对象的数据成员。】

注意:分配空间

 

重载下标运算符“[ ]”

  • 下标运算符“[ ]”用来取某个向量的某个元素,或直接对向量中某个元素赋值,它被视为一个二元运算符。
  • 下标运算符只能作类成员运算符进行重载,不可作为友元运算符。
  • 重载下标运算符的最大好处是提供一种向量访问的安全方法。

 

重载()运算符

  • 函数调用运算符”()”可以看作一个双目运算符,它的两个操作数分别为函数名和函数参数列表。             f (x,y)        f ()    
  • 函数调用运算符只能采用非静态的成员函数重载。
  • 函数调用运算符重载可以不带或带任意个参数。

举例

数学函数的抽象:f(x,y) = 2x+yclass Function {
public:double operator() (double x, double y) const{return 2*x+y;}
};int main( ){Function fun;cout << fun(1.5, 2.2) << endl;return 1;
}

 

new和delete的重载

例:重载new和delete运算符。
#include <iostream>
using namespace std;
#include <stddef.h>
class memmanager{
public:memmanager(){cout<<"default constructor"<<endl;}void *operator new(size_t size);//分配一块大小为size的内存void *operator new(size_t size,char tag);//分配一块大小为size的内存,并且用字符tag赋值void operator delete(void *p);//释放指针p所指向的一块内存空间
};
void *memmanager::operator new(size_t size)
{cout<<"new1 operator"<<endl;char *s=new char[size];   		//分配大小为size的内存空间*s='a';                    		//用字符'a'赋值return s;                    		//返回指针
}
void *memmanager::operator new(size_t size,char tag)
{cout<<"new2 operator"<<endl;char *s=new char[size];*s=tag;                    		//用字符tag赋值return s;                   		//返回指针
}
void memmanager::operator delete(void *p)
{cout<<"delete operator"<<endl;char *s=(char *)p;          		//强制类型转换delete[] s;                 		//释放内存空间
} 
void main()
{memmanager *m=new memmanager();delete m;memmanager *m1=new('B') memmanager();delete m1;
}

 

类型之间的转换

C++语言允许的类型转换有4种:

  • 标准类型->标准类型。
  • 标准类型->类类型。
  • 类类型->标准类型。
  • 类类型->类类型。

【标准类型是除class,struct和union类型外的其他所有类型】

对于标准类型,C++语言提供了两种类型转换:

  • 隐式类型转换。
  • 显式类型转换。

举例:

 

自定义类对象的输入输出

  • 插入运算符<<  和  抽取运算符>>的重载
  • 重载插入和抽取运算符只能用访问类的私有成员的友元函数来实现,因为插入和抽取运算符为双目运算符,且运算符的左操作数为流,右操作数为类对象,因而插入和抽取运算符的重载不能以类成员函数形式出现

举例:


class CComplex		//复数类声明
{double real;double image;
public:CComplex(double r=0.0,double i=0.0):real(r),image(i){}friend ostream& operator<<(ostream& stream, CComplex &obj);friend istream& operator>>(istream&	stream, CComplex &obj);
};//注意:在oj上,往往需要
// friend ostream& operator<<(ostream& stream, const Complex &obj);ostream& operator<<(ostream& stream, CComplex &obj)
{if (obj.image < 0)stream<< obj.real << obj.image << "i"<<endl;else if (obj.image > 0)stream << obj.real << "+" << obj.image << "i"<<endl;elsestream << obj.real << endl;return stream;
}istream& operator>>(istream& stream, CComplex &obj)
{stream>>obj.real;stream>>obj.image;return stream;
}int main()
{CComplex obj;cin>>obj;cout<<obj;return 1;
}

 

 


http://chatgpt.dhexx.cn/article/qtEBXun1.shtml

相关文章

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;或在某些配置…

单点登录三个方法及原理:共享Session、基于OpenId的单点登录、基于Cookie的OpenId存储方案

单点登录三个方法及原理&#xff1a;共享Session、基于OpenId的单点登录、基于Cookie的OpenId存储方案 单点登录在现在的系统架构中广泛存在&#xff0c;他将多个子系统的认证体系打通&#xff0c;实现了一个入口多处使用&#xff0c;而在架构单点登录时&#xff0c;也会遇到一…

单点登录原理与实现方式

一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构&#xff0c;http作为通信协议。http是无状态协议&#xff0c;浏览器的每一次请求&#xff0c;服务器会独立处理&#xff0c;不与之前或之后的请求产生关联&#xff0c;这个过程用下图说明&#xff0c;三次…

Shiro-单点登录原理

单点登录原理 一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构&#xff0c;http作为通信协议。http是无状态协议&#xff0c;浏览器的每一次请求&#xff0c;服务器会独立处理&#xff0c;不与之前或之后的请求产生关联&#xff0c;这个过程用下图说明…