C++基础(五:运算符重载)

  • 运算符重载

对于基本数据类型,可以直接运算,但是类不能直接参与运算,

没有对运算符进行重载

【1】运算符重载函数名格式

返回值  operator运算符(参数)
{
   //函数体
}

【2】运算符重载的目的

让自己定义的类也能直接参与运算

运算符重载的要求:

  1. 不能创造运算符,必须对已有的运算符重载
  2. 不能更改运算符本身的功能,+运算重载后实现乘法运算

【3】运算符重载函数的格式

  1. 成员函数的格式:给哪个类重载运算符,就把重载函数定义为哪个类的成员函数
  2. 全局函数的格式:需要在类内声明全局函数为友元函数

成员函数版的运算符重载一定比全局函数版的运算符重载一个参数,成员函数本身提供了一个类对象

【4】算数运算符的重载

算术运算都是双目运算:

格式:L # R  ---->需要两个类对象作为参数

结果:右值

参数:运算过程中不需要修改操作数,可以定义为const

【5】赋值运算符的重载

operator= :拷贝赋值函数

+=、-=···运算符的重载

格式:L # R

结果:对左操作数的修改,是一个左值

参数:左操作数运算过程中可以修改,右操作数不能修改

【6】条件运算符的重载

<   >·····

格式:L # R

结果:bool类型的真值或者假值

参数:运算过程中不需要修改操作数,可以定义为const

bool operator>(Complex &c1,Complex &c2)

{}

【7】()运算符的重载

  1. 对()运算符,调用函数的性质重载
  2. 对()强转的性质重载    float a;  int(a);

格式:operator 数据类型(){}    ---->因为强转类型已经明确了返回值类型

【8】自增自减运算符的重载

a++、 ++a、

前自增:

成员函数:Complex &operator++(){}

全局函数:Complex &operator++(Complex &c1){}

后自增: ----->需要使用哑元和前自增区分

成员函数:Complex &operator++(int){}

全局函数:Complex &operator++(Complex &c1,int){}

【9】插入/提取运算符的重载***

(输入输出运算符)

int a;  cout << a<< endl;

返回值 operator<<(){}   成员函数版的提取运算符

c4.operator<<(cout)   调用格式,不符合日常使用

cout << c4;

cout<<本身有一个可以级联输出的性质,重载后也要求能实现这个性质

cout << a << b; --->  operator<<(cout,a) << b  ----->说明函数的返回值是cout

#include <iostream>using namespace std;class Complex
{int real;int vir;
public:Complex(){}Complex(int real,int vir):real(real),vir(vir){}//输出类对象的成员void show(){
        cout << real << "+" << vir << "i" << endl;}friend Complex operator-(const Complex &c1,const Complex &c2);//成员函数版的+运算符重载
    Complex operator+(const Complex &other){
        Complex temp;
        temp.real = this->real+other.real;
        temp.vir = this->vir+other.vir;return temp;}//成员函数版的混合赋值运算符重载
    Complex operator+=(const Complex &c1){this->real = this->real+c1.real;this->vir = this->vir+c1.vir;return *this;}friend bool operator==(const Complex &c1,const Complex &c2);//使用成员函数,实现强转功能的重载 int()//强转功能重载的固定格式,只有成员函数版的重载函数//operator 类型()operator int(){return this->real;}//重载()运算符,调用函数功能的()//实现了一个伪函数void operator()(){
        cout << 123 << endl;}void operator()(string name){
        cout << name << endl;}friend Complex &operator--(Complex &c1,int);//成员函数版的前自增
    Complex &operator++(){++this->real;++this->vir;return *this;}friend ostream &operator<<(ostream &out,Complex &c1);
};//全局函数版实现后自减运算符的重载
Complex &operator--(Complex &c1,int)
{static Complex temp = c1;   //使用temp获取自减前的值
    c1.real--;
    c1.vir--;return temp;  //返回自减前的值
}
//全局函数版-运算符重载
Complex operator-(const Complex &c1,const Complex &c2)
{
    Complex temp;
    temp.real=c1.real-c2.real;
    temp.vir=c1.vir-c2.vir;return temp;
}
//全局函数版的==运算符重载
bool operator==(const Complex &c1,const Complex &c2)
{return c1.real==c2.real&&c1.vir==c2.vir;
}//全局函数实现提取运算符的重载
ostream &operator<<(ostream &out,Complex &c1)
{
    out << c1.real << "+" << c1.vir << "i" << endl;return out;
}
int main()
{
    Complex c1(3,5);
    Complex c2(1,4);
    c1.show();
    c2.show();
    Complex c3 = c1+c2;/*c3.show();
    c2+=c1;    //左调右参,c2调用了混合运算符重载,参数是c1
    c2.show();
    c2();
    c2("zhangsan");
*/
    Complex c4 = c3--;    cout << c4 << c3 << 3 << endl;//cout << c4 --->operator<<(cout,c4)--->返回值cout//operator<<(cout,c4)<<c3//operator<<(operator<<(cout,c4),c3) << 3//ostream &operator<<(ostream &out,Complex &c1){}int a=9,=3;//cout << a << b;   //先输出a再输出b  //operator<<(cout,a)<<b//operator<<(cout,a)  ---->会返回一个cout继续输出//cout是ostream类的类对象,自己不能不能定义,但是可以通过引用传入函数再返回//cout应该是ostream类的类对象return 0;
}插入运算符重载
//全局函数实现插入运算符的重载
istream &operator>>(istream &in,Complex &c1)
{
    in >> c1.real >> c1.vir;return in;
}

【10】不能重载的运算符

  1. sizeof()
  2. 成员访问运算符.    
  3. 指针访问运算符  *  ---->对指针访问
  4. ::  域限定符
  5. a?a:b    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/698545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion 3震撼发布模型与Sora同架构

Prompt&#xff1a;Epic anime artwork of a wizard atop a mountain at night casting a cosmic spell into the dark sky that says "Stable Diffusion 3" made out of colorful energy Stability AI发布Stable Diffusion 3文本到图像模型。该模型采用扩散变换架构…

SQL库操作

1、创建数据库 概念 创建数据库&#xff1a;根据项目需求创建一个存储数据的仓库 使用create database 数据库名字创建 数据库层面可以指定字符集:charset/character set 数据库层面可以指定校对集:collate 创建数据库会在磁盘指定存放处产生一个文件夹 创建语法 create …

【算法分析与设计】1的个数

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位…

【初始RabbitMQ】交换机的实现

交换机概念 RabbitMQ消息传递模型的核心思想就是&#xff1a;生产者生产的消息从不会直接发送到队列。实际上&#xff0c;通常生产者不知道这些消息会传递到那些队列中 相反&#xff0c;生产者只能将消息发送到交换机&#xff0c;交换机的工作内容也很简单&#xff0c;一方面…

云服务器发展史

在数字化浪潮的推动下&#xff0c;云服务器作为信息技术领域的一颗璀璨明珠&#xff0c;其发展史是一部科技进步和创新思维的缩影。从最初的概念提出到现如今的广泛应用&#xff0c;云服务器经历了翻天覆地的变化&#xff0c;不仅极大地推动了信息技术的发展&#xff0c;也彻底…

JavaScript运算符

文章目录 运算符介绍算术运算符递增和递减运算符比较运算符逻辑运算符短路运算逻辑与 逻辑或 赋值运算符运算符优先级 运算符介绍 算术运算符 %取余运算符的主要用途&#xff1a; 判断某个数是否能被某个数整除。 浮点数的精度问题&#xff1a; 所以&#xff1a;不要直接判断…

Unicode转换 [ASIS 2019]Unicorn shop1

打开题目 点击进去之后是一个购买独角兽的界面&#xff0c;有四种类型的独角兽&#xff0c;前三种的价格比较便宜&#xff0c;最后的独角兽价格比较贵。 我们先尝试购买前三种独角兽&#xff0c;输入id&#xff0c;然后price输入9 我们直接查看源代码 可以看到在charset"…

操作符的属性:优先级、结合性(缺表达式求值)

C语言的操作符有2个重要的属性&#xff1a;优先级、结合性&#xff0c;这两个属性决定了表达式求值的计算顺序。 我们先简单了解一下操作符的优先级和结合性&#xff0c;附上表格&#xff0c;简单记一下顺序&#xff0c;搭配几道题来加深印象。 1.优先级 优先级指的是&#x…

linux常用的网络命令实战分享

文章目录 ifup/down命令ifconfig命令观察网络接口信息修改接口参数增加虚拟网络接口 route命令查看路由表增加路由表规则删除路由表规则 IP 命令ip linkip addr设定路由 ip route arp 命令 在实际研发运维工作中常常会涉及到网关相关的操作和知识&#xff0c;这里对linux下常用…

要赢,且不止一次,2024创维汽车势不可挡!

随着除夕钟声的敲响&#xff0c;创维汽车迎来了全新的一年。过往取得的成绩已成为了历史&#xff0c;全新的未来还有待奋斗者们去开创。为辞旧迎新&#xff0c;创维汽车于2月22日及2月23日召开了“新春启航&#xff0c;共谋发展”营销会议&#xff0c;为2024做下全新布局。 创维…

js设计模式:组合模式

作用: 可以用来将数据组合成树形的数据,可以像操作单独的对象一样去操作整个树形结构 树是相对复杂的数据,使用组合模式去封装树形的组件,是很重要的,可以对外暴露很多树的操作方法 示例: //一个树型的对象数据class Organ {constructor(label, value, parentName) {this.la…

离散化算法

离散化算法的思想是将一组连续的数据映射到一组离散的取值&#xff0c;通常是整数。它的主要目的是将连续的数据转换为离散的数据&#xff0c;以便进行统计、计数、排序等操作。 C代码实现: #include<iostream> #include<vector> #include<algorithm> usi…

数据库事物复习

事务 比如说将张三的银行账户拿出一千给李四&#xff0c;首先需要查询张三的账户余额&#xff0c;扣除1000&#xff0c;然后如果给李四加上1000的过程中出现异常会回滚事务&#xff0c;临时修改的数据会回复回去。 -- 1. 查询张三账户余额 select * from account where name …

如何用GPT进行成像光谱遥感数据处理?

第一&#xff1a;遥感科学 从摄影侦察到卫星图像 遥感的基本原理 遥感的典型应用 第二&#xff1a;ChatGPT ChatGPT可以做什么&#xff1f; ChatGPT演示使用 ChatGPT的未来 第三&#xff1a;prompt 提示词 Prompt技巧&#xff08;大几岁&#xff09; 最好的原则和策…

已解决org.springframework.web.HttpSessionRequiredException异常的正确解决方法,亲测有效!!!

已解决org.springframework.web.HttpSessionRequiredException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 文章目录 问题分析 报错原因 解决思路 解决方法 步骤一&#xff1a;检查Session状态 步骤二&#xff1a;确保属性名正确 步骤…

洛谷P8772 [蓝桥杯 2022 省 A] 求和(前缀和差分)

#include <stdio.h> #include<stdlib.h> int main() {int n;scanf("%d", &n);// 读取数组 aint* a (int*)malloc(n * sizeof(int));for (int i 0; i < n; i) {scanf("%d", &a[i]);}// 计算前缀和数组 prefix_sumlong long *prefi…

Windows下面使用C# 获取记事本里面的文本内容并返回数据

C#中平常我们用到最多的读取文件的方法是通过System.IO里面提供的类来操作文件,这里就不再赘述,今天我们用另外一种特殊的方式来取指定文件能用记事本打开的的文件内容。原理大概是用windows底层提供的函数去读取记事本里面的内容。大概流程如下:程序启动记事本进程并打开指…

unity学习(30)——跳转到角色选择界面(跳转新场景)

1.在scene文件夹中&#xff08;[siːn]&#xff09;&#xff0c;右键->create->scene&#xff0c;名字叫SelectMenu&#xff08;选择角色场景&#xff09;。 2.把新建场景拖拽到hierarchy[ˈhaɪərɑːki]中。 3.此时才能在file->build setting中Add open scene&…

【Docker快速入门】Docker部署MySQL

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

Kotlin filterIsInstance filterNotNull forEach

Kotlin filterIsInstance filterNotNull forEach fun main(args: Array<String>) {val i1 MyItem(1, 1)val i2: MyItem? nullval i3: Int 3val i4 "4"val i5 nullval i6 MyItem(6, 6)val list mutableListOf<Any?>(i1, i2, i3, i4, i5, i6)lis…