当前位置: 首页 > news >正文

黑马程序员7

算数运算符重载

运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型

加号运算符

通过自己写函数,实现两个对象相加属性后返回新的对象

在这里插入图片描述
两种方式重载
成员函数方式重载 全局函数重载
上来 person p3 = p2+p1 会报错 ,没有这种运算

成员函数重载写在类的里面
person operator+(person &p)
{
person temp;
temp.m_a =this->m_a+ p.m_a;
}

这里的 引用相当于就是传入的哪个person
void func(int& ref)
//发现是引用,转换为 int* const ref = &a; 地址
ref = 100; // ref是引用,转换为*ref = 100

Person p1(10, 10);
Person p2(20, 20);

本质上为 person p3 = p1.operator+(p2);
简化为person p3 = p2+p1。

//运算符重载 可以发生函数重载
Person p4 = p3 + 10; //相当于 p4 = operator+(p3,10)

总结1:对于内置的数据类型的表达式的的运算符是不可能改变的 1+1 = 2 无法改变

总结2:不要滥用运算符重载

左移运算符

在这里插入图片描述

在这里插入图片描述
这不是想要的结果

通常不会用成员函数重载<<运算符,因为无法实现cout在左侧
只能用全局函数实现
//ostream对象只能有一个
本质 operator<<(cout,p) 简化为 cout<<p
标准输出流对象 ,通过标准输出流这个类
cout全局只有一个 必须以引用的对象出现

ostream& operator<<(ostream& out, Person& p) {out << "a:" << p.m_A << " b:" << p.m_B;return out;
}

注意返回值 如果返回值是一个void
那么只能 cout<<p
如果 cout<<p<<endl 会报错
注意链式编程思想,返回还是一个cout得话就可以继续往后追加
cout属于标准输出流对象 ostream& 引用的方式返回

引用本质是取别名 cout名字随便取

如果对象属性设置为私有,可以用友员的方式
friend ostream& operator<<(ostream& out, Person& p);

总结:重载左移运算符配合友元可以实现输出自定义数据类型

递增运算符重载

先实现左移运算符的重载
再重载++运算符
前置 后置
返回什么值不知道就先写++
就返回void
cout << ++myInt << endl; 报错
需要返回自身 this 同时 解引用 加星号

 MyInteger& operator++() {  返回引用   对于内置的而言 cout<<++(++a)<<endl;  a连加了两次如果不返回引用 那么自己重载的a不会加两次 ,因为是返回新的对象,对新的对象进行再一次加操作//先++						m_Num++;//再返回return *this;}//后置++MyInteger operator++(int) {  涉及到了函数重载问题 int代表占位参数 区分前置和后置//先返回结果MyInteger temp = *this; //记录当前本身的值,然后让本身的值加1,但是返回的是以前的值,达到先返回后++;// 后递增m_Num++; 自身加1//最后将记录结果返回return temp;   为什么返回值 因为 局部对象不能返回引用 这里返回的局部变量}

总结: 前置递增返回引用,后置递增返回值

赋值运算符重载

c++编译器至少给一个类添加4个函数

默认构造函数(无参,函数体为空)
默认析构函数(无参,函数体为空)
默认拷贝构造函数,对属性进行值拷贝
赋值运算符 operator=, 对属性进行值拷贝

值拷贝都会引发深浅拷贝的问题
堆区数据重复释放的问题
cout << “p1的年龄为:” << *p1.m_Age << endl;
p1.m_Age 为指针,需要解引用 *p1.m_Age 获取数据

仅仅只是用了 p2 = p1 默认的赋值运算 然后再用析构函数释放 会报错
在这里插入图片描述

Person& operator=(Person &p){if (m_Age != NULL)			先判断是否有属性在堆区,如果有先释放干净,然后再深拷贝{delete m_Age;m_Age = NULL;}//编译器提供的代码是浅拷贝//m_Age = p.m_Age;//提供深拷贝 解决浅拷贝的问题m_Age = new int(*p.m_Age);//返回自身return *this;		a=b=c 要有返回值 返回自身 this指针 解引用}

int *m_Age; 申明的是指针
p1.m_age
cout << “p1的年龄为:” << *p1.m_Age << endl;
cout << “p2的年龄为:” << *p2.m_Age << endl;
cout << “p3的年龄为:” << *p3.m_Age << endl;

关系运算符重载

在这里插入图片描述
在函数中编写
返回值bool
bool operator ==(person &p)
{
}

函数调用运算符重载

函数调用运算符 () 也可以重载
由于重载后使用的方式非常像函数的调用,因此称为仿函数
仿函数没有固定写法,非常灵活

运算符重载很多都是引用传递

//匿名对象调用
cout << "MyAdd()(100,100) = " << MyAdd()(100, 100) << endl;

MyAdd()相当于创建了一个匿名对象 然后后面有个(100,100)
匿名对象 释放问题

地址传递和引用

引用传递 是 mySwap03(a, b); void mySwap03(int& a, int& b) {
地址传递 mySwap02(&a, &b); void mySwap02(int* a, int* b)

分文件编写

#include “…/touh/swap.h”
task,json中
“args”: [/
“F:/mycpp/cpp/test02.cpp”

1

职工管理类,作用于界面显示
相应的头文件 源文件

void WorkerManager::exitSystem()
{cout << "欢迎下次使用" << endl;system("pause");exit(0);
}

职工管理系统

7、添加职工

如果想在程序中维护这个不定长度的数组,可以将数组创建到堆区,并利用Worker **的指针维护

在这里插入图片描述

WorkerManager::WorkerManager() 构造函数

Worker ** newSpace = new Worker*[newSize]; 开创了一个新的work类型的数组 指针在堆区
worker类型的二次指针

if (this->m_EmpArray != NULL) 如果不是空指针 就要设置地址 不然就可以直接设置值

二级指针

int a =100;
int *p1 = &a;
int **p2 = &p1;

文件交互

​ 在上一个添加功能中,我们只是将所有的数据添加到了内存中,一旦程序结束就无法保存了

​ 因此文件管理类中需要一个与文件进行交互的功能,对于文件进行读写操作‘

this->m_EmpArray[i]->m_Id
this指针指向m_EmpArray[i] 得到了一个work指针 work指针再次指向m_id

ofs << this->m_EmpArray[i]->m_Id << " " << this->m_EmpArray[i]->m_Name << " " << this->m_EmpArray[i]->m_DeptId << endl;

不需要手动创建文件,它会自动创建文件并写入数据

读取文件

第一次使用,文件未创建
文件存在,但是数据被用户清空
文件存在,并且保存职工的所有数据

WorkerManager::WorkerManager()
{ifstream ifs;ifs.open(FILENAME, ios::in);//文件不存在情况if (!ifs.is_open()){cout << "文件不存在" << endl; //测试输出this->m_EmpNum = 0;  //初始化人数this->m_FileIsEmpty = true; //初始化文件为空标志this->m_EmpArray = NULL; //初始化数组ifs.close(); //关闭文件return;}
}

https://gitee.com/jiangjiandong/Cpp-0-1-Resource/blob/master/%E7%AC%AC4%E9%98%B6%E6%AE%B5%E5%AE%9E%E6%88%98-%E5%9F%BA%E4%BA%8E%E5%A4%9A%E6%80%81%E7%9A%84%E4%BC%81%E4%B8%9A%E8%81%8C%E5%B7%A5%E7%B3%BB%E7%BB%9F/%E8%AE%B2%E4%B9%89/%E8%81%8C%E5%B7%A5%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F.md

https://developer.aliyun.com/article/980381#:~:text=1%E3%80%81%E9%80%90%E8%A1%8C%E8%AF%BB%E5%85%A5%E6%96%87%E4%BB%B6%20void%20readTxt%20%28string%20file%29%20%7B%20ifstream%20infile%3B,%28infile%2Cs%29%29%20%7B%20cout%3C%3Cs%3C%3Cendl%3B%20%7D%20infile.close%20%28%29%3B%20%2F%2F%E5%85%B3%E9%97%AD%E6%96%87%E4%BB%B6%E8%BE%93%E5%85%A5%E6%B5%81%20%7D

逐个字符读取
while (ifs >> id && ifs >> name && ifs >> dId)

修改职工函数实现

delete this->m_EmpArray[ret];

删除

ofstream ofs(FILENAME, ios::trunc);   //打开模式 ios::trunc 如果存在删除文件并重新创建delete[] this->m_EmpArray;this->m_EmpArray = NULL;   释放原有空间,并重新指向新的

相关文章:

黑马程序员7

算数运算符重载 运算符重载概念&#xff1a;对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 加号运算符 通过自己写函数&#xff0c;实现两个对象相加属性后返回新的对象 两种方式重载 成员函数方式重载 全局函数重载 上来 perso…...

Qt安装与使用经验分享;无.pro文件;无QTextCodec file;Qt小试;界面居中;无缝;更换Qt图标;更换Qt标题。

1、切换安装下载源 《Qt安装教程》先推荐一篇安装文章&#xff1a;《Qt安装教程》 Qt 5.15 之后已经不提供离线安装包了&#xff0c;就是那个 3.7G 的 exe 安装包。请看官方说明&#xff0c;所以只能用在线安装包。 1&#xff0c;下载在线安装包 QT 在线安装包链接&#xff…...

AAAI顶会行人重识别算法详解——Relation Network for Person Re-identification

1.论文整体框架概述 在行人重识别任务中,通常都是对整个输入数据进行特征提取,但是缺少了局部信息。能不能既考虑局部与整体信息,也同时加入他们的联系呢?这篇论文主要的思想就是局部信息和全局信息的融合。 整体流程如上图所示, 首先对整体进行特征提取, 通常采用…...

hadoop调优(二)

hadoop调优(二) 1 HDFS故障排除 1.1 NameNode故障处理 NameNode进程挂了并且存储数据丢失了&#xff0c;如何恢复NameNode&#xff1f; 如果NameNode进程挂掉并且数据丢失了&#xff0c;可以利用Secondary NameNode来恢复NameNode。Secondary NameNode主要用于备份NameNode…...

【基础算法】双指针---数组元素的目标和

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…...

Javascript借用原型对象继承父类型方法

借用原型对象继承父类型方法 目的: 儿子继承父类属性和方法&#xff0c;父类之后新增的方法不会被儿子继承。 前言&#xff1a; 先理解一个问题&#xff1a; Son.prototype Father.prototype; 这一操作相当于把Son的原型对象指向Father。 意味着Son的prototype的地址与Fa…...

你不会工作1年了连枚举都还不知道吧?

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…...

ks通过恶意低绩效来变相裁员(五)绩效申诉就是「小六自证吃了一碗凉粉」

目录 一、小六吃了一碗凉粉 二、给你差绩效 公司告诉你可以绩效申诉 1、公司的实际目的是啥 2、你一旦自证&#xff0c;就掉入了陷阱 三、谁主张谁举证——让公司证明它绩效考核的客观性和公平性 四、针对公司的流氓恶意绩效行为&#xff0c;还有其他招吗 五、当公司用各…...

一阶低通滤波介绍及simulink模型

一阶低通滤波 背景介绍 低通滤波是一种过滤方式&#xff0c;规定低频信号能正常通过&#xff0c;而超过设定临界值的高频信号则被阻隔、减弱。低通滤波可以简单的认为&#xff1a;设定一个频率点&#xff0c;当信号频率高于这个频率时不能通过&#xff0c;在数字信号中&#…...

三十三、MongoDB PHP 扩展

PHP 语言访问 MongoDB 数据库需要使用 mongo 扩展 mongo 扩展不是 PHP 官方内置的扩展&#xff0c;需要开发者自己手动安装和配置 本章我们将学习如何在 Linux、Window、Mac 平台上安装 mongo 扩展 Linux 上安装 PHP MongoDB 扩展 通过 pecl 来安装 在 Linux 系统上可以通…...

2D图像处理:九点标定_上(机械手轴线与法兰轴线重合)(附源码)

文章目录 1. 九点标定2. 九点标定流程2.1 机械手轴线与法兰轴线重合代码实现1. 九点标定 在2D视觉抓取项目中,如果想要让机械手准确的抓取到工件,前提是需要知道机械手应该移动到哪里(位姿)。而移动到哪里(位姿)的获取就需要对相机和机械手进行标定。因此,九点标定(2D视…...

2023最新C++面经(一):vector内存预分配,左值引用和右值引用,move语义

文章目录零、前言一、在C中,往vector插入1000个数字&#xff0c;怎么做能保证性能最高二、在vector中对10000个数字删除偶数位置的数&#xff0c;怎么做保证性能较高三、malloc用delete会出现什么问题四、weak_ptr解决的是什么问题&#xff0c;lock返回的对象可以直接使用吗五、…...

【C语言经典例题】调整数组使奇数全部都位于偶数前面

目录 一、题目要求 二、解题思路 分步解析 从前往后找 从后往前找 交换 三、完整代码演示 一、题目要求 输入一个整数数组&#xff0c;实现一个函数&#xff0c; 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c; 所有偶数位于数组的后半…...

C++经典20题型,满满知识,看这一篇就够了(含答案)

今天找了20道c的经典题型&#xff0c;看这一篇就够了&#xff0c;全是干货 目录 1、题目&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总…...

卷积神经网络CNN之ZF Net网络模型详解(理论篇)

1.背景 2. ZF Net模型结构 3. 改进优缺点 一、背景 ZF Net是用作者的名字命名的&#xff0c;Matthew D.Zeiler 和 Rob Fergus &#xff08;纽约大学&#xff09;&#xff0c;2013年撰写的论文&#xff1b; 论文原网址https://arxiv.org/abs/1311.2901 论文名&#xff1a;Vis…...

Vue 3.0 响应性 基础 【Vue3 从零开始】

#声明响应式状态 要为 JavaScript 对象创建响应式状态&#xff0c;可以使用 reactive 方法&#xff1a; import { reactive } from vue// 响应式状态const state reactive({count: 0}) reactive 相当于 Vue 2.x 中的 Vue.observable() API &#xff0c;为避免与 RxJS 中的 ob…...

flex布局方式让最后一个(或第二个...n)元素居右显示

<div class"round"> <div class"income">收入</div> <div class"center"> <img style"width: 12px" src"../../img/big/up.png"> </div> <div class"rg"> <span cl…...

【Python语言基础】——Python MySQL Order By

Python语言基础——Python MySQL Order By 文章目录 Python语言基础——Python MySQL Order By一、Python MySQL Order By一、Python MySQL Order By 结果排序 请使用 ORDER BY 语句按升序或降序对结果进行排序。 ORDER BY 关键字默认按升序对结果进行排序。若要按降序对结果进…...

自然数学的哲学原理--复数理论的扩展

自然数学的哲学原理--复数理论的扩展 2023-03-05 10:27:12 自然数学的哲学原理--复数理论的扩展 一维&#xff1a;线&#xff0c;实数 二维&#xff1a;平面 三维&#xff1a;立体 四维&#xff1a;相对论时空 复数&#xff0c;以一个数对形式表示&#xff0c;实现了复平面的…...

tsconfig.json中的一些配置

compilerOptions 编译选项是配置文件中非常重要也比较复杂的配置选项 target&#xff1a;设置ts代码编译的目标版本 可选值&#xff1a; ES3&#xff08;默认&#xff09;、ES5、ES6/ES2015、ES7/ES2016、ES2017、ES2018、ES2019、ES2020、 ESNext 示例&#xff1a; &quo…...

Spark调优总结

下面是基于官方优化建议&#xff0c;加上自己的一些理解整理。官方地址&#xff1a;https://spark.apache.org/docs/2.4.8/tuning.html 任务并行度 Spark会根据每个文件的大小自动设置运行“map”任务的数量&#xff0c;而对于分布式的“reduce”操作&#xff0c;例如groupBy…...

4.创建和加入通道相关(network.sh脚本createChannel函数分析)[fabric2.2]

fabric的test-network例子有一个orderer组织、两个peer组织、每个组织一个节点&#xff0c;只有系统通道&#xff08;system-channel&#xff09;&#xff0c;没有其他应用通道。我们可以使用./network.sh createChannel命令来创建一个名为mychannel的应用通道。 一、主要概念 …...

若依学习(前后端分离版)——自定义注解@Log(如何自定义注解,实现aop)

如何自定义注解 aop的基本知识与应用 若依对用户的一些更新删除等敏感操作操作进行了日志记录 注解定义和切面处理的项目位置 第一步&#xff1a;自定义注解log 定义了注解的相关信息。这里定义的属性可以在使用时加以定义 注解Target和Retention的作用 第二步切面逻辑…...

防止暴力破解ssh的四种方法

一. 方法介绍 防止暴力破解的四种方法&#xff1a; 1 密码要写的足够的复杂&#xff0c;通常建议将密码写16位&#xff0c;并且无连贯的数字或者字母&#xff1b;当然也可以固定一个时间修改一次密码&#xff0c;推荐是一个月修改一次会稳妥一些2 修改ssh的端口号&#xff0c;…...

jsp试卷分析管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP试卷分析管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…...

可选链运算符(?.)与空值合并运算符(??)

1. 可选链运算符Optional chaining(?.) MDN定义 可选链运算符&#xff08;?.&#xff09;允许读取位于连接对象链深处的属性的值&#xff0c;而不必明确验证链中的每个引用是否有效。?. 运算符的功能类似于 . 链式运算符&#xff0c;不同之处在于&#xff0c;在引用为空 (n…...

JavaScript 闭包

JavaScript 变量可以是局部变量或全局变量。私有变量可以用到闭包。全局变量函数可以访问函数内部定义的变量&#xff0c;如&#xff1a;实例function myFunction() {var a 4;return a * a;}尝试一下 函数也可以访问函数外部定义的变量&#xff0c;如&#xff1a;实例var a 4…...

每日记录自己的Android项目(二)—Viewbinding,WebView,Navigation

今日想法今天是想把做一个跳转页面的时候调到H5页面去&#xff0c;但是这个页面我用app来承载&#xff0c;不要调到浏览器去。所以用到了下方三个东西。Viewbindingbuild.gradle配置首先在app模块的build.gradle里添加一下代码默认情况下&#xff0c;每一个布局xml文件都会生成…...

20230305英语学习

Climate Change Is Suffocating Large Parts of the Ocean 研究&#xff1a;气候变化正在使海洋“缺氧” One day more than a decade ago, Eric Prince was studying the tracks of tagged fish when he noticed something odd.Blue marlin off the southeastern United State…...

【Linux】手把手教你在CentOS上使用docker 安装MySQL8.0

文章目录前言一. docker的安装1.1 从阿里下载repo镜像1.2 安装docker1.3 启动docker并查看版本二. 使用docker安装MySQL8.02.1 拉取MySQL镜像2.2 创建容器2.3 操作MySQL容器2.4 远程登录测试总结前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文主要…...