运算符重载三大补充(前置后置,操作数与参数顺序,指针参数权限),const修饰成员函数,对>> <<的重载与友元函数声明

news2024/11/14 4:10:18

TIPS

  1. 构造函数在这里插入图片描述
  2. 析构函数在这里插入图片描述
  3. 拷贝构造函数在这里插入图片描述
  4. 运算符重载在这里插入图片描述
  5. 赋值运算符重载在这里插入图片描述
  6. 当代码当中的运算符连接的全是内置类型的时候,由于内置类型,它是知道该怎么去进行运算的,所以说会直接转化为指令,然后但凡有一个不是内置类型,而是属于自定义类型,那么这时候就会转化为去调用一个函数,就是你自己写的运算符重载

接下来我还需要对运算符重载知识进行进一步补充:

一,关于运算符重载的++与–前置/后置的效率与其他补充

  1. 对于++与–的前置还是后置的问题,一般来讲的话,如果说对于内置类型而言,这前置与后置的效率相差并不是很大,可以说是微乎其微;
  2. 但是如果说对于那些自定义类型的前置++与后置++而言的话(减也是一样),前置的效率肯定是比后置要更高一点。
  3. 因为对于后置而言的话,你需要多拷贝两次,第一次拷贝就是因为由于你是后置,所以说你需要返回变化之前的值,所以说你需要在变化之前把原先那个直线给他拷贝一份作为最终的返回值;然后第二次的多余拷贝就在于在函数返回的时候,这时候不能采用引用返回,而是只能采用传值返回,这也就意味着有多需要去生成一个临时变量来存储这个返回值,而这些对于前置而言的话都是不存在的,所以说后置的效率会更慢一点
  4. 然后对于前置与后置再进行运算符重载的时候,区分的标志就在于参数,函数名称肯定都是一模一样的,都是operator符号,对于后置而言的话就在参数那边加一个int以示区分
d1++;  
Date operator++(int);
++d2;
Date operator++();

二,关于运算符重载的传参顺序问题(全局函数+类成员函数)

操作数与函数参数从左往右必须一一对应(并不要求类型也一样)

  1. 任何一个操作符的话,他肯定都会有一个或者多个若干个操作数,这些操作数之间肯定有左右关系,谁在左边谁在右边之类的
  2. 不管这个运算符重载充当的是全局函数还是类当中的成员函数,这个运算符各个操作数的左右顺序就直接决定了在运算符重载函数当中各个参数的左右顺序,就是说操作数的左右顺序与参数的左右顺序必须是要一模一样与完全一一对应的,不然的话你这个运算符重载函数就会出问题,达不到想要的执行效果
  3. 当运算符重载充当全局函数的时候就问题不大,因为各个操作数的左右顺序与函数参数的左右顺序都是十分明确的,左右顺序之间是否一一对应上的话肉眼就能看出来
  4. 当运算符重载函数充当类的成员函数的时候,由于这边有个小坑,主要是这个this指针,this指针首先它是隐藏的,并且充当的是类当中成员函数的第一个参数,所以说类当中成员函数的第一个参数一定是那个隐藏掉的this指针,这点非常关键
  5. 这个this指针充当的是一个函数的形参,它对应的一个实参:就是实例化对象的地址,这两个成一对,他们都是在代码当中是隐藏的,也就是不能够显示出现,是看不见的。
  6. 所以如图:在这里插入图片描述

三,关于指针传参的权限大小(有关于const修饰)问题

  1. 首先需要复习一下之前的那个知识,就是说如果说用const去修饰指针的话,这个const如果出现在星号的前面,那么就表示不能去修改这个指针所指向的内存空间里面的数据;如果说那个const出现在那个星号的右边的话,就表示不能修改这个指针本身,也就是说不能去修改这个指针所指向的地址,这指针所指向的那块内存空间里面的数据可以去改变。
  2. 然后this指针他其实也是被const给修饰的,只不过那个const应该出现在那个星号的右边: 类名 const this*
  3. 然后至于权限的理解,对权限大小的判断,这个与之前的引用都是完全一模一样的,这边的这个权限实际上就是指读写方面,读的话,权限相对来说就要小一点,写的话就说明权限很大。如果被const修饰了,那么就表示只读而不能写。
  4. 然后对于指针传参,从实参到形参的过程当中,权限只能够平移与缩小,而不能够进行权限的放大,比如说原先的实参指针是const A* ,在形参当中指针的类型变成了A*,那么这个相当于就是权限的放大,这个是不被允许的,权限只能够缩小与平移。
  5. 这个指针传参的权限大小问题,尤其是在类的成员函数访问当中去指针传参的时候尤其需要注意。
  6. 很明显对于这个权限起决定性作用的就是是否被const修饰,但是仅局限于这个指针类型当中*的前面部分,后面部分有没有const与这边的权限问题,一点关系都没有。
    在这里插入图片描述
    以上三点就是补充

const修饰的成员函数

  1. 将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
  2. 在这里插入图片描述
  3. 所谓的const修饰的成员函数,其实在本质上就是去修饰这个this指针,因为按道理来说,原先这个this指针它的类型应该是类名* const this,正是因为如此,所以说是可以去修改this指针所指向的内存空间当中的内容。如果说我需要禁止修改,那就需要在函数定义的时候,在this指针的星号前面加上一个const,但是由于一个很恶心的地方就在于,This指针在形参那边是不能够进行显示出现,this倒是在成员函数里面是可以进行显示的使用,所以这就导致没有办法去修改它的一个默认指针类型。
  4. 只能想出一个很挫的办法,就是说在成员函数定义的时候,在它的参数括号后面去加上const,实际上就是去修饰这个this指针,把它的权限给他放小。
    在这里插入图片描述

关于iostream,istream,ostream,cin,cout与流插入,流提取运算符重载的新认识

  1. 在这里插入图片描述
  2. 整体逻辑理一下是这样子的,首先就是在头文件当中去定义了两个类:分别是istream与ostream
  3. 然后对于这两个类istream,ostream又分别创建了各自的两个实例化对象cin与cout
  4. 然后就是在对运算符流插入流提取进行重载,也就是说去实现(operator>> operator<<)的这么一个函数;在具体实现函数的逻辑的时候:又运用到了函数重载知识,也就是说函数名称是一样的,但是对于不同的内置类型单独设置了一个函数(参数不同,其实就是说构成了函数重载),所以这就导致你在用的时候有点能够自动识别类型的这种感觉,但是在底层看来的话,就是对不同的那些内置类型进行了各自的函数重载分别处理而已…
  5. 流插入流提取的运算符重载函数当中已经把内置类型全部实现完了,也就是说支持内置类型的一个输入与输出,但是如果说我创建了一个自定义类型的话,想用这些运算符进行输入输出的话,那我就继续像库当中一样再去运算符重载+函数重载一下下即可
  6. <<操作符的话,它是有两个操作数,其中这个cout是类对象,是ostream的实例化对象,然后这个类ostream是库定义的,也就是说是在iostream这个头文件当中去定义的,所以说你只要把这个头文件给他包含上,再把命名空间给他展开,就可以去使用了。
  7. 代码演示:注意一下这边的函数的返回值,之所以需要这么去设置,是因为为了可以让运算符连续使用。
#include <iostream>
using namespace std;
class Stu
{
public:
	int age = 0;
	double score = 0;
};
istream& operator>>(istream& in, Stu& s)
{
	cin >> s.age >> s.score;
	return in;
}
ostream& operator<<(ostream& out, Stu& s)
{
	cout << "年龄为:" << s.age << " " << "成绩为:" << s.score << endl;
	return out;
}
int main()
{
	Stu s1;
	Stu s2;
	cin >> s1 >> s2;
	cout << s1 << s2 << endl;
	return 0;
}

类中友元函数的声明

  1. 对于一般的函数来说,如果说是在类外面的话,是无法对类的实例化对象进行访问到他的私有成员。但是如果硬要访问的话也不是不可以,就在那当中去声明一下,这个函数是我的朋友,是可以在类外面直接访问我的私有成员变量,没事儿。在类中就这样去声明友元函数
friend 友元函数的声明;
  1. 代码样本
#include <iostream>
using namespace std;
class Stu
{
private:
	friend istream& operator>>(istream& in, Stu& s);
	friend ostream& operator<<(ostream& out, Stu& s);
	int age = 0;
	double score = 0;
};
istream& operator>>(istream& in, Stu& s)
{
	cin >> s.age >> s.score;
	return in;
}
ostream& operator<<(ostream& out, Stu& s)
{
	cout << "年龄为:" << s.age << " " << "成绩为:" << s.score << endl;
	return out;
}
int main()
{
	Stu s1;
	Stu s2;
	cin >> s1 >> s2;
	cout << s1 << s2 << endl;
	return 0;
}

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

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

相关文章

JS 实现区块链添加可视化功能

JS 实现区块链添加可视化功能 学习的最后一部分了&#xff0c;完整的资源在这里&#xff1a;https://download.csdn.net/download/weixin_42938619/87765530&#xff0c;有需求的可以自取。 最后一部分是增加一些可视化的功能&#xff0c;完整实现后如下&#xff1a; HTML 部…

基于yolov7开发构建学生课堂行为检测识别系统

yolov7也是一款非常出众的目标检测模型&#xff0c;在我之前的文章中也有非常详细的教程系列的文章&#xff0c;感兴趣的话可以自行移步阅读即可。 《基于YOLOV7的桥梁基建裂缝检测》 《YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程》 《基于YOLOv7融合…

windows 编译 opencv

编译需要的基础工具 #cmake是配置构建工具&#xff0c;mingw是编译工具 cmake CMake是一款跨平台的编译管理工具&#xff0c;可以自动生成各种不同编译环境&#xff08;如Makefile、Visual Studio Solution等&#xff09;&#xff0c;从而实现在不同平台上进行代码编译的目的…

PLC与无线开关量测控终端之间Modbus通信实例

本方案是基于Modbus RTU协议下实现的1主多从自组网无线通信形式&#xff0c;主站为S7-1200 PLC&#xff0c;DTD433H作为从站。DTD433H具备输入和输出开关量信号功能&#xff0c;信号传输方向由用户原系统主从设备所实现的功能决定。方案中采用无线开关量信号测控终端DTD433H与欧…

python调用海康sdk报错问题

sdk参考&#xff1a; (68条消息) Python调用海康威视网络相机_调用海康SDK_python 海康威视_有一点点麻瓜的博客-CSDN博客https://blog.csdn.net/yinweizhehd/article/details/118722052 报错1&#xff1a; 生成解决方案的时候&#xff0c;显示LNK2001&#xff1a;无法解析的…

【AI大模型】SparkDesk讯飞星火认知大模型震撼发布,国产AI技术再创新高!

文章目录 前言SparkDesk讯飞星火认知大模型简介语言理解知识问答逻辑推理数学题解答代码理解与编写亲自体验写在最后 前言 5月6日&#xff0c;讯飞星火认知大模型成果发布会在安徽合肥举行。科大讯飞董事长刘庆峰、研究院院长刘聪发布讯飞星火认知大模型&#xff0c;现场实测大…

C++面向对象编程

面向对象编程 面向对象编程和面向过程编程面向过程面向对象 类型设计类的成员函数对象的创建和使用C对象模型this指针构造函数和析构函数构造函数定义和使用析构函数的定义和使用 对象的生存周期拷贝构造函数深拷贝与浅拷贝 运算符的重载 面向对象编程和面向过程编程 面向过程…

设计模式之【适配器模式】,两个人之间确实需要月老的搭线~

文章目录 一、什么是适配器模式1、适配器模式使用场景2、代理、桥接、装饰器、适配器 4 种设计模式的区别3、适配器模式结构 二、类适配器1、实例 三、对象适配器1、实例 四、接口适配器1、实例 五、源码中的应用 一、什么是适配器模式 适配器模式&#xff08;Adapter Design …

第2天学习Docker——Docker安装

一、前言 Docker 是一个用于开发、传送和运行应用程序的开放平台。Docker 使您能够将应用程序与基础设施分开&#xff0c;以便您可以快速交付软件。使用 Docker&#xff0c;您可以像管理应用程序一样管理基础设施。通过利用 Docker 的快速交付、测试和部署代码的方法&#xff0…

vue3学习一 setup

vue3中没有 data 等配置项&#xff0c; 并且它的引入方式也不是像vue2中的 import vue就可以了&#xff0c; 而是用到什么再引入什么&#xff0c; 其中 setup() 函数&#xff0c; 是最大的区别 vue3中的 setup 有点像vue2中的 data , 但又不完全是 setup 会在 生命周期create…

关于C语言

C99是啥 很多书籍开篇会突然提到C99标准&#xff0c;因此这里搜了一下。 C99是C语言的官方标准第二版。1999年12月1日&#xff0c;国际标准化组织和国际电工委员会旗下的C语言标准委员会正式发布了这个标准文件 &#xff1b; C99是在C89和C90的基础上发展起来的&#xff0c;增加…

独立站平台选哪个好?5个独立站平台优缺点分析

选择适合自己的独立站平台需要综合考虑多个方面的因素&#xff0c;包括平台的优缺点、自己的需求和预算等因素。下面是几个常见的独立站平台的优缺点分析供您参考&#xff1a; 一、Shopify&#xff1a; 优点&#xff1a;简单易用&#xff0c;拥有丰富的主题和应用程序&#xf…

JavaScript实现求1-100之间不能被3整除的数之和,求100以内偶数的和的两个程序代码

以下为实现求1-100之间不能被3整除数之和求100以内偶数的和的两个程序代码和运行截图 目录 前言 一、实现输入两个数比较两个数的大小 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 二、求100以内偶数的和 2.1 运行流程及思想 2.2 代码段 2.3…

泰坦尼克号幸存者预测(案例)----决策树版

1、导入需要的库 import pandas as pd from sklearn.tree import DecisionTreeClassifier import matplotlib.pyplot as plt from sklearn.model_selection import GridSearchCV2、导入数据 在此下载泰坦尼克号训练数据 data pd.read_csv(r"F:\data\train1.csv") …

内网安全:Cobalt Strike 安装.

内网安全&#xff1a;Cobalt Strike 安装. Cobalt Strike是一款渗透测试神器&#xff08;又称为CS&#xff09;。拥有多种协议主机上线方式&#xff0c;集成了端口转发&#xff0c;socket代理&#xff0c;office攻击&#xff0c;文件捆绑&#xff0c;钓鱼&#xff0c;提权&…

哈希算法原理与应用:确保数据完整性和安全性的关键技术

哈希算法是一种将任意长度的消息映射为固定长度摘要或哈希值的算法。哈希算法主要被用于验证数据的完整性和安全性。哈希算法的应用广泛&#xff0c;例如在密码学中用于验证数据完整性和数字签名&#xff0c;也用于检索数据和进行散列分布式存储。下面将详细介绍哈希算法的原理…

《Linux 内核设计与实现》12. 内存管理

文章目录 页区获得页获得填充为 0 的页释放页 kmalloc()gfp_mask 标志kfree()vmalloc() slab 层slab 层的设计slab 分配器的接口 在栈上的静态分配单页内核栈 高端内存的映射永久映射临时映射 每个 CPU 的分配新的每个 CPU 接口 页 struct page 结构表示系统中的物理页&#x…

区间预测 | MATLAB实现QRCNN卷积神经网络分位数回归时间序列区间预测

区间预测 | MATLAB实现QRCNN卷积神经网络分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRCNN卷积神经网络分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 区间预测 | MATLAB实现QRCNN卷积神经网络分位数回归时间序列区间预测…

超级详细的 FinalShell 安装 及使用教程

一、引言 FinalShell 是一款免费的国产的集 SSH 工具、服务器管理、远程桌面加速的良心软件&#xff0c;同时支持 Windows,macOS,Linux&#xff0c;它不单单是一个 SSH 工具&#xff0c;完整的说法应该叫一体化的的服务器&#xff0c;网络管理软件&#xff0c;在很大程度上可以…

新唐NUC980使用记录(5.10.y内核):在用户应用中使用GPIO

文章目录 目的使用参考与演示使用参考存在的问题问题定位修改设备树使用测试 总结设备树文件内容 目的 GPIO是最基础的外设&#xff0c;使用频率也非常高&#xff0c;这篇文章将简单体验在NUC980 Liunx用户应用中使用GPIO功能。 这篇文章中内容均在下面的开发板上进行测试&am…