C++标准语言day05

news/2024/3/19 17:54:08/文章来源:https://blog.csdn.net/weixin_61180910/article/details/127250085

一、运算符函数

    在C++中会把运算当作函数处理,一个表达式,其实就是调用了很多运算符函数完成计算

        这种特性对于内建类型是没有意义的,但是对于自建类型的数据,可以进行个性化设计

        可以大大地提高了代码的可读性、易用性

    例如string类

        string s1,s2;

        s1 += s2    strcat()

        s1.cat(s2);

        s1 = s2

        s1 == s2

    运算符函数的格式:[#是运算符 O是类对象]

        单目运算符:    #O  或者   O#

            成员函数:

            [] O::operator#(void)

            {

            }

            注意:返回值不确定,运算对象就是函数的

            调用者,没有参数

            全局函数:

            [] operator#(O& o)

            {

                //  全局运算符函数不属于任何类,因此需要把调用者作为参数传递过来

            }

            注意:运算符成员函数、全局函数,只能实现一个,不能同时实现,编译器会产生歧义

        双目运算符:    a # b

            注意:一定是运算符左边的对象发起的函数调用

            成员函数:

            [] A::operator#(B& b)

            {

                //  类A对象必须是运算符函数的调用者

            }

            全局函数:

            [] opertor#(A& a,B& b)

            {

                //  函数调用者放第一个参数

            }

    思考:如何实现一个坐标类

    Point p1(1,1), p2(2,2);

    p1 + p2

    (1,2)+(2,1) = (3,3)

二、运算类的双目运算符

    class T

    {

        int x;

    };

    成员函数: a+b

    const T T::operator+(const T& b)const

    {

        return T(x+b.x)

    }

    全局函数:

    const T T::operator+(const T& a,const T& b)

    {

        return T(a.x+b.x);  //  x是私有的,无法直接类外访问

    }

    友元:

        在实现全局类的全局运算符函数时,可能会使用类内的私有成员,此时全局运算符函数是没有访问权限的

            如果把私有成员变成public会打破类的封装性,或者实现get函数会很麻烦,C++提供了友元这种方式

            来为全局的运算符函数提供独家授权,该函数就成为友元函数

        方法:

            在类内对全局运算函数进行声明,并且在声明前加 friend 关键字即可

三、输入输出运算符

    在C++中 << >> 运算符不光是按位左移、右移,同时它们还是 cout 和 cin 的输出和输入运算符

        输出运算符:  cout << 10 << endl;

            Test t;

            cout << t << endl;

            此时 << 运算符的调用者是 cout,所以我们无法在cout类中实现 << 运算符函数重载,

            只能实现全局的 << 运算符函数

        ostream& operator<<(ostream& os,const Test& t)

        {

            return os << t.x;   // 不建议换行

        }

        输入运算符: cin >> num;

            Test a,b;

            cin >> a >> b;

        istream& operator>>(istream& is,Test& t)

        {

            return is >> t.x;

        }

        注意:

            1、由于输入、输出运算符是可以连续调用,因此返回值应该还是cin、cout,应该返回istream& ostream&

            2、由于输入、输出运算符的调用者是左边的cin、cout,我们无法实现它们的成员运算符函数,

                只能实现全局的输入输出运算符函数

            3、如何在全局运算符函数中使用了私有成员,需要声明全局运算符函数为友元函数

   

四、运算符的单目运算符

    单目运算符: ++/-- ! ~ * & sizeof -

    成员函数:  ! ~ -

        const Test operator-(void)

        {

            return Test(-x,-y);

        }

    注意: 单目运算类的运算符对象都可以带常属性,因此重载的单目运算符函数必须是常函数,并且运算过程中都不会改变自身的值

        而是产生一个临时的结算结果,并且是右值,只能返回带const的临时对象

    全局函数:

        const Test operator-(const Test& t)

        {

            return Test(-t.x,-t.y);

        }

五、自变运算符函数

    前自变运算符: ++i / --i

    注意: 在C语言中无论前、后自变得到的结果都是右值,但是在C++中前自变的结果是左值,后自变的结果是右值

    int num = 10;

    ++(num++)   C C++ 报错

    (++num)++   C++可以 C报错

    成员函数:

        T& operator++(void)//必须不能是常函数

        {

            x++,y++;

            return *this;   //一定要要返回引用

        }

    全局函数:

        T& operator++(Test& t)//必须不能是常形参

        {

            t.x++,t.y++;

            return t;   //一定要要返回引用

        }

    后自变运算符函数:  i++ / i--

        哑元:在参数列表中增加一个不会使用的哑元类型参数,唯一目的就是为了区分前自变还是后自变 (哑元唯一用处)

    成员函数:

        const T operator++(int)

        {

            return T(x++,y++);//    必须返回临时对象,不能是引用

        }

    全局函数:

        const T operator++(T& t,int)

        {

            return T(t.x++,t.y++);//    必须返回临时对象,不能是引用

        }

    注意:要会写

六、特殊的运算符函数

    1、下标运算符[]

        当你想让一个类对象当作数组使用时,可以考虑重载下标运算符,例如vector类中就重载了[]

    2、函数运算符[]

        当想让一个类对象当作函数一样使用时,可以考虑重载该运算符

    注意:[] () 只能重载为成员函数,不能重载成全局函数

    3、解引用* 和 访问成员运算符->

        重载这两个运算符时可以让一个类对象像指针一样使用

        比如: C++的智能指针就是重载了它们来实现的

    4、new和delete

        为什么要重载new和delete运算符?

            1、可以在重载该运算符函数时记录每次分配、释放内存的地址、时间、行数等信息到日志中

                可以检查哪里出现了内存泄漏、什么时候出现的

        成员函数与全局函数格式一样:

            void* operator new(size_t size)

            {

                //  size是要申请内存的字节数,编译器会自动计算并传递过来

                //  自己的操作

                void* ptr = malloc(size);

                return ptr;

            }

            void operator delete(void* ptr)

            {

                //  做一些自己的操作

                free(ptr);

            }

            注意: 如果只是针对某个类重载它的new\delete,那么只需要实现成员函数即可,

                如果想要所有类型进行new\delete时都是用重载的函数,则实现为全局函数

七、重载运算符的规则

    1、有些运算符是不能重载的

        ::  域限定符

        .   直接访问成员的运算符

        ? : 三目运算符

        sizeof 计算字节数的运算符

        typeid 获取类型信息的运算符

    2、只能重载成全局函数的运算符

        <<  输出运算符

        >>  输入运算符

    3、只能重载成成员函数的运算符

        []  下标运算符

        ()  函数运算符  arr[i]  [i]arr

        =   赋值操作运算符  类内一定有一个 = 成员函数

        ->  间接访问成员的运算符

    4、运算符重载可以自定义运算的过程,但是无法改变运算符的优先级

    5、运算的运算对象数量和格式不能改变

    6、不能发明新的运算符

    建议:

        1、重载运算符要遵循运算符含义一致性,不要改变运算符的运算规则

        2、不要忘记重载运算符的初衷,不要炫技

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

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

相关文章

Spring Boot(4):@Import注解和@Conditional注解

说明&#xff1a;基于atguigu学习笔记。 在了解spring boot自动配置原理前&#xff0c;再来了解下两个注解Import注解和Conditional注解。 Import Import注解主要用于导入某些特殊的Bean&#xff0c;这些特殊的Bean和Bean Definitaion 有关。 主要用于导入Configuration 类…

Python实现桌面挂件,做一只可爱的桌面宠物~

文章目录嗨嗨&#xff0c;大家好 ~ 我是小圆相关文件开发工具相关模块&#xff1a;环境搭建安装原理简介1.初始化一个窗口组件&#xff1a;效果2.设置一下窗口的属性&#xff1a;随机导入一张图片&#xff0c;看效果随机导入一个宠物的所有图片的函数代码3.宠物随机出现在桌面上…

服务端渲染的探索与实践

服务端渲染(SSR)近两年炒得很火热,相信各位同学对这个名词多少有所耳闻。本节我们将围绕“是什么”(服务端渲染的运行机制)、“为什么”(服务端渲染解决了什么性能问题 )、“怎么做”(服务端渲染的应用实例与使用场景)这三个点,对服务端渲染进行探索。 服务端渲染是一…

GOM引擎登录器的研究,逆向技术在这款GOM20151108引擎上是一个大舞台

最近遇到一个逆向类课题&#xff0c;是关于GOM20151108版本对应登录器研究。刚接触传奇的时候是2002年&#xff0c;那时候网吧玩SF&#xff0c;都是手动用IP直接连接&#xff0c;当时的一款 联创传奇 很好玩&#xff0c;有传送戒子&#xff0c;木域戒指&#xff0c;土域戒指&am…

不会 Vue,但不影响我学 diff 算法

前言 现在社会各行各业大都面临着寒冬&#xff0c;互联网行业最近还出现了裁员潮&#xff0c;导致前端是越来越卷&#xff0c;普通学校的应届生不仅要跟985、211毕业的学生以及研究生进行竞争&#xff0c;甚至还需要和最近刚被裁的、有了几年工作经验的程序员竞争&#xff0c;…

page.json

uni-app需要给page.json文件需要进行配置路由,否则会不报错,也跳转不过去

【数模/启发式算法】蚁群算法

文章目录简介符号说明核心思想流程图文章使用到的测试函数基本步骤蚁群算法代码简介 蚁群算法是一种用来寻找优化路径的概率型算法。它由Marco Dorigo于1992年在他的博士论文中提出&#xff0c;其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。 这种算法具有分布计算、信息正…

Arduino播放声音

玩软件有点虚无&#xff0c;没有实际东西&#xff0c;所以接下来要体验下硬件与软件结合。 1 Arduino Arduino是一种包含硬件&#xff08;各种型号的Arduino板&#xff09;和软件&#xff08;Arduino IDE&#xff09;的开源电子平台。硬件部分是可以用来做电路连接的Arduino电…

小白学习Java第四十三天

Git概述 &#xff08;一&#xff09;什么是Git Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理&#xff0c;是软件配置管理的核心思想之一…

设计模式学习笔记(五) - 观察者模式 Observer

目录 观察者模式 Observer 一、背景描述 Version 1 (面向过程) Version 2 (面向对象) Version 3 (单个观察者) Version 4 (多个观察者) Version 5 (分离观察者与被观察者) 二、不同事件下的观察者模式 三、事件本身也可以形成继承体系 四、观察者常用场景 观察者模式…

Selenium基础 — 鼠标操作

1、鼠标事件介绍 前面例子中我们已经学习到可以用click()来模拟鼠标的单击操作&#xff0c;而我们在实际的web产品测试中发现&#xff0c;有关鼠标的操作&#xff0c;不单单只有单击&#xff0c;有时候还要用到右击&#xff0c;双击&#xff0c;拖动等操作&#xff0c;这些操作…

【Nginx】认识与基本使用 Nginx 实现反向代理、配置负载均衡

文章目录1. Nginx 概述1.1 Nginx 介绍1.2 Nginx 下载和安装1.3 Nginx 目录结构2. Nginx 命令3. Nginx 配置文件结构4. Nginx 具体应用4.1 部署静态资源4.2 反向代理4.2.1 介绍4.2.2 配置反向代理4.3 负载均衡4.3.1 介绍4.3.2 配置负载均衡4.3.3 负载均衡策略1. Nginx 概述 1.1…

Ubuntu开机界面出现“error found when loading /root/.profile”

原因 今天一开始按照一篇文章&#xff0c;想把普通用户的权限提高到最高权限&#xff0c;修改了**/etc/passwd**文件&#xff0c;然后重启&#xff0c;发现之前的用户进不去了&#xff0c;一开机就出现如下信息 解决方法 1、重启虚拟机进入recovery模式&#xff08;长按shi…

计算机网络-第一章 | 王道考研

目录 一、基本介绍 定义 功能 组成 分类 标准化工作 标准的分类 标准化工作相关组织 二、性能指标 ※ 速率 带宽 ※吞吐量 时延 时延带宽积 往返时延RTT 利用率 三、分层结构 ※ 分层基本规则 正式认识分层 7层OSI参考模型 怎么来的 怎么分的 怎么传的…

<特殊类设计与单例模式>——《C++高阶》

目录 1.请设计一个类&#xff0c;不能被拷贝 2. 请设计一个类&#xff0c;只能在堆上创建对象 3. 请设计一个类&#xff0c;只能在栈上创建对象 4. 请设计一个类&#xff0c;不能被继承 5. 请设计一个类&#xff0c;只能创建一个对象(单例模式) 后记&#xff1a;●由于…

GD32F307VC+WIN10+VSCODE+GCC+JLINK环境build

为了构建Cortex M系列单片机免费开源的开发环境&#xff0c;网络上了解来看VSCODEGCCJLINK是一套比较高效的组合方式&#xff0c;下面记录环境搭建的流程。 我这边的PC环境为 WIN10专业版64bit。 工具准备 1. arm-none-eabi-gcc下载及安装 官网下载链接&#xff1a;Downloa…

c++数据结构:数组和向量

线性表&#xff1a; 在数据元素的非空有限集中 存在唯一的一个被叫做“第一个”的数据元素存在唯一的一个被叫做“最后一个”的数据元素除第一个之外&#xff0c;集合中的每个数据元素均只有一个前驱除最后一个之外&#xff0c;每个集合元素均只有一个后继数据结构中线性结构指…

文字识别检测入门(1)

CTPN 优点&#xff1a;对水平文字检测效果超级好 缺点&#xff1a;对扭曲的文字不好 RRPN 在faster的基础上改进 RPN改为RRPN ROI pooling改进为RROI pooling 能解决旋转&#xff0c;但是解决不了弯曲的曲面问题 EAST Anchor free 特征合并&#xff0c;检测不同尺度文本 检测各…

刷爆leetcode第三期 0007~0010

刷爆leetcode第三期 0007~0010 题目一 反转链表解法一解法二题目二 链表的中间节点题目三 链表的倒数第K个节点题目四 合并两个有序链表题目一 反转链表 解法一 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a…

python与人工智能:线性回归和逻辑回归

线性回归 线性回归是利用数理统计中回归分析&#xff0c;来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法&#xff0c;运用 十分广泛。梯度下降&#xff1f; 梯度下降法的基本思想可以类比为一个下山的过程。 假设这样一个场景&#xff1a;一个人被困在山上&a…