C++基本操作符重载

article/2025/11/11 15:41:39

基本操作符重载

  • 基本操作符重载
  • reference

基本操作符重载

操作符重载指的是将 C++ 提供的操作符进行重新定义,使之满足我们所需要的一些功能。
在 C++ 中可以重载的操作符有:

+  -  *  /  %  ^  &  |  ~  !  =  <  >  +=  -=  *=  /=  %=  ^=  &=  |= 
<<  >>  <<=  >>=  ==  !=  <=  >=  &&  ||  ++  --  ,  ->*  ->  ()  [] 
new  new[]  delete  delete[]

上述操作符中,[ ]操作符是下标操作符,( )操作符是函数调用操作符。自增自减操作符的前置和后置形式都可以重载。长度运算符sizeof、条件运算符:?、成员选择符.、对象选择符.*和域解析操作符::不能被重载。

complex operator+(const complex & A)const;

为了介绍基本操作符的重载,我们先来看一个操作符重载的示例。

#include <iostream>
using namespace std;class complex
{
public:complex();complex(double a);complex(double a, double b);complex operator+(const complex & A)const;complex operator-(const complex & A)const;complex operator*(const complex & A)const;complex operator/(const complex & A)const;void display()const;
private:double real;   //复数的实部double imag;   //复数的虚部
};complex::complex()
{real = 0.0;imag = 0.0;
}complex::complex(double a)
{real = a;imag = 0.0;
}complex::complex(double a, double b)
{real = a;imag = b;
}//打印复数
void complex::display()const
{cout<<real<<" + "<<imag<<" i ";
}//重载加法操作符
complex complex::operator+(const complex & A)const
{complex B;B.real = real + A.real;B.imag = imag + A.imag;return B;
}//重载减法操作符
complex complex::operator-(const complex & A)const
{complex B;B.real = real - A.real;B.imag = imag - A.imag;return B;
}//重载乘法操作符
complex complex::operator*(const complex & A)const
{complex B;B.real = real * A.real - imag * A.imag;B.imag = imag * A.real + real * A.imag;return B;
}//重载除法操作符
complex complex::operator/(const complex & A)const
{complex B;double square = A.real * A.real + A.imag * A.imag;B.real = (real * A.real + imag * A.imag)/square;B.imag = (imag * A.real - real * A.imag)/square;return B;
}int main()
{complex c1(4.3, -5.8);complex c2(8.4, 6.7);complex c3;//复数的加法c3 = c1 + c2;cout<<"c1 + c2 = ";c3.display();cout<<endl;//复数的减法c3 = c1 - c2;cout<<"c1 - c2 = ";c3.display();cout<<endl;//复数的乘法c3 = c1 * c2;cout<<"c1 * c2 = ";c3.display();cout<<endl;//复数的除法c3 = c1 / c2;cout<<"c1 / c2 = ";c3.display();cout<<endl;return 0;
}

在这里插入图片描述
在这个例子中,我们定义了一个复数类,一个复数包含实部和虚部两部分,我们分别用 real 和 imag 来表示复数的实部和虚部,并将这两个变量作为复数类的成员变量,并设置为 private 属性。在复数类中,我们定义了三个构造函数用于初始化复数类的对象。之后声明了四个操作符重载函数,分别重载加减乘除四种操作符。最后定义了一个打印复数的 display() 函数。

为了避免大家不熟悉复数的四则运算,在这里将其一一列出,以助于大家对例 1 的理解。
在例 1 中,我们是将操作符重载函数声明为成员函数,首先需要关注的是操作符重载函数的声明。例如,重载加法操作符时,其函数声明为:

complex operator+(const complex & A)const;

两个复数相加,函数返回值为 complex 类对象,仍然为一个复数。复数相加需要两个复数进行运算,调用函数的类对象本身就是一个复数,因此还需要另外一个复数作为参数。在该函数声明中,函数的参数为复数类对象的引用并加上了 const 关键字,确保在函数中不会修改该对象的引用。

我们再来看一下加法操作符重载函数的类外定义(第 45 行)。在函数体中,我们先定义了一个复数类对象 B,之后按照复数的加法运算规则将计算结果赋给 B 的 real 和 imag 成员变量。由于系统会给类生成一个默认的拷贝构造函数,因此采用传值的形式将计算结果返回没有问题。

调用操作符重载函数的语法和调用普通成员函数的语法相同,例如我们定义三个 complex 类的对象 A、B 和 C,调用的语法是C=A.operator+(B);,由于 operator 关键字的作用,operator+() 这个成员函数也可以通过我们非常熟知的方法调用:C = A + B;,采用这种方式调用 operator+() 这个操作符重载函数,意义非常明了,在本例中我们也都是按照这种方式调用的。

我们知道,进行加法运算时需要两个操作数,也即需要两个复数对象,但是在声明操作符重载函数时,complex operator+(const complex & A)const;确只有一个函数参数。这一点无需奇怪,我们看其调用方式就明白了,比较规范的调用方法是C = A.operator+ ( B );,此处是 A 对象调用该函数,并且函数参数是另一个复数类对象。如此一来,两个操作数分别是 A 和 B。加法操作符二元操作符,但是将其作为成员函数声明时则只需要有一个参数即可,如果重载的操作符是一元操作符,并将其作为类的成员函数,则不需要参数。

class test
{
public:test operator!();
};

例 2 中重载的是一元操作符“!”(非),因为是作为成员函数重载的,因此不需要参数

reference

微学苑 C++基本操作符重载


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

相关文章

【Groovy】map 集合 ( map 集合操作符重载 | + 操作符重载 | 代码示例 )

文章目录 一、map 集合 " " 操作符重载二、代码示例 一、map 集合 " " 操作符重载 对 map 集合使用 " " 操作符 , 操作符两侧都是 map 集合 , 调用的是 map 集合的 plus 方法 , plus 函数有 2 2 2 个参数 : 第一个参数 , Map<K, V> l…

【Groovy】map 集合 ( map 集合操作符重载 | - 操作符重载 | 代码示例 )

文章目录 一、map 集合 " - " 操作符重载二、完整代码示例 一、map 集合 " - " 操作符重载 对 map 集合 使用 " - " 操作符 , 相当于调用了 map 集合的 minus 方法 , 该方法传入 2 2 2 个参数 : Map<K,V> self 参数 : 相当于 " - &…

【C++】操作符重载

注意&#xff1a;操作符重载可以当做“自定义类的运算” 1 为什么需要操作符重载&#xff1f; 对于基础的变量&#xff0c;int等&#xff0c;不需要重载就知道如何做&#xff0c;但是对于自定义类&#xff0c;就无法进行运算&#xff0c;比如复数类。 2 操作符重载总结 1&…

C++ 操作符重载

输出操作符"<<" 和输入操作运算符">>" 操作符重载&#xff0c;也叫运算符重载&#xff0c;是C的重要组成部分&#xff0c;它可以让程序更加的简单易懂&#xff0c;简单的运算符使用可以使复杂函数的理解更直观。 操作符重载可对 已有的运算…

C++-操作符重载

定义&#xff1a; Salesitem.h /* * This file contains code from "C Primer, Fifth Edition", by Stanley B. * Lippman, Josee Lajoie, and Barbara E. Moo, and is covered under the * copyright and warranty notices given in that book: * * "Copyrig…

c++操作符重载

转自https://www.cnblogs.com/xudong-bupt/p/3557525.html 1.什么是操作符重载 可以使用分词将操作符重载理解为&#xff1a;操作符重载。 C中的操作符很多&#xff0c;如&#xff0c;-&#xff0c;*&#xff0c;\等等。 C中的重载也是C中面向对象多态的体现。 简单说操作符重…

操作符重载——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…