c++操作符重载

article/2025/11/10 16:30:45

转自https://www.cnblogs.com/xudong-bupt/p/3557525.html

1.什么是操作符重载

  可以使用分词将操作符重载理解为:操作符+重载。

  C++中的操作符很多,如+,-,*,\等等。

  C++中的重载也是C++中面向对象多态的体现。

  简单说操作符重载:

    C++中有:int a=2+3;  那么a=5

    操作符重载可以实现对自定义类型的操作:

复制代码

 1 #include <iostream>2 using namespace std;3 4 class Point{5 public:6     int x;7     int y;8     Point(int _x,int _y):x(_x),y(_y){9     }
10 
11     Point operator+(Point &p){
12         int t1=this->x+p.x;
13         int t2=this->y+p.y;
14         Point t(t1,t2);
15         return t;
16     }
17 };
18 
19 int main()
20 {
21     Point p1(1,3);
22     Point p2(2,6);
23     Point p3 = p1+p2;
24     cout<<"p3:("<<p3.x<<","<<p3.y<<")";     ///执行输出:p3:(3,9)
25     return 0;
26 }

复制代码

 2.操作符重载的方式

  操作符重载的实现方式有两种,即通过“友元函数”或者“类成员函数”。如下面代码显示了这两种操作符重载:

复制代码

 1 class Point{2 public:3     int x;4     int y;5     Point(int _x,int _y);6 7     Point operator+(Point &p);  ///类成员函数,类成员函数可以使用this指针获取自身对象8 9     friend int operator*(Point &p1,Point &p2);  ///友元函数
10 };

复制代码

  可以看出,一个重载“+”,一个重载“*”,都是双目运算符,但是类成员函数只有一个参数。这是因为类成员函数可以使用this指针获取自身的对象,而友元函数则不行。

  所以类成员实现操作符重载需要的形式参数比原来少一个,这样使用类成员函数实现一元操作符就不需要参数了。

3.操作符重载例子

复制代码

 1 #include <iostream>2 using namespace std;3 4 class Point{5 public:6     int x;7     int y;8     Point(int _x,int _y):x(_x),y(_y){9     }
10 
11     Point operator+(Point &p){  ///实现坐标向量加
12         int t1=this->x+p.x;
13         int t2=this->y+p.y;
14         Point t(t1,t2);
15         return t;
16     }
17 
18     friend int operator*(Point &p1,Point &p2);  ///实现内积
19 };
20 
21 int operator*(Point &p1,Point &p2)
22 {
23     return (p1.x*p2.x)+(p1.y*p2.y);
24 }
25 
26 int main()
27 {
28     Point p1(1,3);
29     Point p2(2,6);
30     cout<<p1*p2<<endl;  ///输出内积:20
31 
32     Point p3 = p1+p2;
33     cout<<"p3:("<<p3.x<<","<<p3.y<<")"<<endl;   ///输出坐标和:(3,9)
34     return 0;
35 }

复制代码

 4.重载操作符注意事项

(1)重载操作符必须有一个类类型的参数。也就是说不能 int  operator+(int,int);

(2)操作符的优先级和结核性是固定的。

(3)不在具有短路求值特性。如&&、||等,两个数都会进行求值,而且顺序不定。

(4)不要重载具有内置含义的操作符。重载操作符主要是弥补普通操作符对类类型数据的作用。像赋值操作符、取地址操作符、逗号操作符等对类类型操作数都有默认的含义。

(5)只能对已有的C++运算符进行重载,不允许用户自己定义新的运算符。

(6)绝大部分的运算符可重载,除了成员访问运算符.,作用域运算符::,长度运算符sizeof以及条件运算符?:

(7)运算符重载后不能改变运算符的操作对象(操作数)的个数。

5.特例操作符"++"、"--"的重载

  自增、自减操作符有前后之分,通过一个无意义的整数参数来区分。无参数的是前置运算符,带参数的是后置运算符。

  如:

    int operator++();  //前置

    int operator++(int x);  //后置

  自增操作符实例

复制代码

 1 #include <iostream>2 using namespace std;3 4 class Array{5 public:6     Array(int _num){    ///初始化一个数组,大小为_num7         this->a=new int[_num];8         this->num=_num;9         this->pos=0;
10         for(int i=0;i<num;i=i+1)
11             *((this->a)+i)=i;
12     }
13 
14     ~Array(){
15         delete [] a;
16     }
17 
18     int operator++(){  ///++前置
19         if(pos == num-1){
20             cout<<"Fuck"<<endl;
21             return 0;
22         }
23         return *((this->a)+(++pos));
24     }
25 
26     int operator++(int x){   ///++后置
27         if(pos == num-1){
28             cout<<"Fuck"<<endl;
29             return 0;
30         }
31         return *((this->a)+(pos++));
32     }
33 
34     int *a;
35     int pos;
36     int num;
37 };
38 
39 int main()
40 {
41     Array array(100);
42     cout<<"pos="<<array.pos<<endl;
43     cout<<"pre_position:"<<(++array)<<endl;
44     cout<<"pos="<<array.pos<<endl;
45     cout<<"********************************************************"<<endl;
46 
47     cout<<"pos="<<array.pos<<endl;
48     cout<<"post_position:"<<(array++)<<endl;
49     cout<<"pos="<<array.pos<<endl;
50     cout<<"********************************************************"<<endl;
51     return 0;
52 }

复制代码

执行结果:


http://chatgpt.dhexx.cn/article/607aH2cc.shtml

相关文章

操作符重载——C/C++学习笔记

此篇文章来自于网上&#xff0c;作为自己学习中的笔记&#xff0c;若有侵权行为&#xff0c;请告之&#xff0c;24小时之内必删除&#xff01;下面就转入正题吧&#xff01; 一、什么是操作符重载&#xff1f; 一看到重载&#xff0c;很容易就让人联想到成员函数重载&#xff0…

什么是操作符重载

一、什么是操作符重载 操作符重载可以分为两部分&#xff1a;“操作符”和“重载”。说到重载想必都不陌生了吧&#xff0c;这是一种编译时多态&#xff0c;重载实际上可以分为函数重载和操作符重载。运算符重载和函数重载的不同之处在于操作符重载重载的一定是操作符。我们不妨…

前端知识点总结 Vue JS CSS

前端知识点 MVVM和MVC的区别什么是Vue生命周期钩子函数触发顺序 VueVue优点父子通信&#xff0c;兄弟通信指令V-if和V-show区别 Vue-loaderVue-key的作用v-modalVue data必须是函数的问题Vue slot Vue-router多个router-viewroute与router的区别导航守卫懒加载 ES6JavaScript同…

JavaScript进阶之手写Promise

前言 Promise异步编程的一种解决方案&#xff0c;比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现&#xff0c;ES6 将其写进了语言标准&#xff0c;统一了用法&#xff0c;原生提供了Promise对象。这里手写一次&#xff0c;希望能和大家一起彻底…

【数据库】MongoDB数据库详解

目录 一&#xff0c;数据库管理系统 1&#xff0c; 什么是数据库 2&#xff0c;什么是数据库管理系统 二&#xff0c; NoSQL 是什么 1&#xff0c;NoSQL 简介 2&#xff0c;NoSQL数据库 3&#xff0c;NoSQL 与 RDBMS 对比 三&#xff0c;MongoDB简介 1&#xff0c; MongoDB 是什…

面试06,[长亮科技]()(offer)、[荔枝]()FM(在确定部门和薪资)、[涂鸦智能]()(第一轮电话面半小时,待后续)、华资软件(HR面)、[广州速游]()(已挂)。至于公司怎么样不加以言论。

作者&#xff1a;Carson-Zhao 链接&#xff1a;https://ac.nowcoder.com/discuss/522002?type2&order0&pos16&page1&ncTraceId&channel-1&source_iddiscuss_tag_nctrack 来源&#xff1a;牛客网 总结一下这几天的面试吧&#xff01;从19号到现在23号…

SQL Foundation(1--13)

1&#xff1a;关系数据库的由来&#xff1a; IBM的工程师Dr E F codd 的关系型数据库模型发表于1970 论文名称&#xff1a; A relational Model of data for Large Shared Data Bank (这个在wiki 和google上可以搜到) SQL: Structured query language&#xff1a; oracle官方…

一、快速入门 MongoDB 数据库

文章目录 一、NoSQL 是什么1.1 NoSQL 简史1.2 NoSQL 的种类及其特性1.3 NoSQL 特点1.4 NoSQL 的优缺点1.5 NoSQL 与 SQL 数据库的比较 二、MongoDB 基础知识2.1 MongoDB 是什么2.2 MongoDB 的体系结构2.3 MongoDB 的特点2.4 MongoDB 键特性2.5 MongoDB 的核心服务和工具2.6 Mon…

数据库总结(考研复试和期末复习皆可用)

数据库总结 点击下载该文档 密码&#xff1a;cqoq 本人自制了简答题的速记卡片 地址&#xff0c;大家可以参考使用。[下载Markji App 使用] 第一章 绪论 1.1 数据库系统概述 数据库管理系统(DBMS)的功能: 数据定义功能数据组织、存储和管理数据库操纵功能数据库的事务和运行…

一步步教你轻松学KNN模型算法

一步步教你轻松学KNN模型算法 ( 白宁超 2018年7月24日08:52:16 ) 导读&#xff1a;机器学习算法中KNN属于比较简单的典型算法&#xff0c;既可以做聚类又可以做分类使用。本文通过一个模拟的实际案例进行讲解。整个流程包括&#xff1a;采集数据、数据格式化处理、数据分析、数…

Oracle实战详解

Oracle实战详解 1.oracle介绍 ORACLE数据库系统是美国ORACLE公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的一种中间件。ORA…

数据库|SQL / MySQL的基本理论用法

本文从数据库MySQL的数据类型、关系模型、增删改查语句、管理MySQL、实用SQL语句、事务等方面进行介绍。 数据类型 对于一个关系表&#xff0c;除了定义每一列的名称外&#xff0c;还需要定义每一列的数据类型。关系数据库支持的标准数据类型包括数值、字符串、时间等&#xf…

KNN模型算法研究与案例分析

KNN模型算法研究与案例分析( 白宁超 2018年8月29日15:39:13 ) 导读&#xff1a;机器学习算法中KNN属于比较简单的典型算法&#xff0c;既可以做聚类又可以做分类使用。本文通过一个模拟的实际案例进行讲解。整个流程包括&#xff1a;采集数据、数据格式化处理、数据分析、数据归…

SQL总结

目录 简介 在Android中存储数据有时会用到数据库&#xff0c;Android给我们提供了 一系列的API来操作数据库&#xff0c;非常简单&#xff0c;我们只需要输入对应的SQL语句&#xff0c;甚至不懂SQL语句&#xff0c;只传入对应的参数即可使用。还有一些第三方库&#xff0c;如G…

Windows开机启动项设置详解

一、开机启动原理 Windows系统都有一个“启动”文件夹&#xff0c;把需要打开的程序的快捷方式或脚本放到“启动”文件夹里&#xff0c;就可以实现开机自启动。 启动”文件夹分为两种&#xff1a;“系统启动文件夹”和“用户启动文件夹”。 系统启动文件夹 Win10系统“启动”…

「C#」设置开机启动

自己写了个监控键盘按键的小程序。 在界面上实时显示按下的键&#xff0c;但是想实现程序的开机自启如何实现呢。 开机自启动一种是在windows的“C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup”家快捷方式。但是这种方法自测有时候不成功。…

centos7 设置开机启动项

高端的废话就是没有引言这种废话。 1.这里我已我的centos7为例输入&#xff1a; systemctl list-unit-files #查看开机启动表如图下&#xff1a; 最左边就是服务 &#xff0c;最右边就是状态 。如当你想要服务器开机启动firewalld&#xff08;防火墙&#xff09;输入 system…

计算机怎么管理自启,电脑如何设置开机启动项

大家都知道将程序添加到开机启动项进入系统就可以自动打开了&#xff0c;但是有些流氓软件会强制进入开机启动项&#xff0c;这就导致电脑开机速度变慢&#xff0c;内存占用过多&#xff0c;运行卡顿的问题。下面&#xff0c;我就教大家如何设置开机启动 现在几乎家家户户都配备…

电脑设置开机

我们知道电脑可以通过修改系统任务计划来实现定时关机的功能&#xff0c;那么&#xff0c;能不能让电脑实现自动开机的功能呢?答案是可以的&#xff0c;我们可以通过BIOS设置&#xff0c;指定电脑在某个时间点自动开机&#xff0c;接下来&#xff0c;小编来介绍一下如何通过BI…

nginx 设置开机自启动

一、下载 在windows下实现开机自启动需要一个开源项目Windows Service Wrapper 来实现。 我用的是这个版本。 下载下来&#xff0c;放在Nginx根目录下 下载下来&#xff0c;放在Nginx根目录下&#xff0c;名字改为start-nginx.exe&#xff0c;再新建一个txt文件&#xff0c…