当前位置: 首页 > 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…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...

ZYNQ学习记录FPGA(二)Verilog语言

一、Verilog简介 1.1 HDL&#xff08;Hardware Description language&#xff09; 在解释HDL之前&#xff0c;先来了解一下数字系统设计的流程&#xff1a;逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端&#xff0c;在这个过程中就需要用到HDL&#xff0c;正文…...

持续交付的进化:从DevOps到AI驱动的IT新动能

文章目录 一、持续交付的本质&#xff1a;从手动到自动的交付飞跃关键特性案例&#xff1a;电商平台的高效部署 二、持续交付的演进&#xff1a;从CI到AI驱动的未来发展历程 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/101f72defaf3493ba0ba376bf09367a2.png)中国…...

前端异步编程全场景解读

前端异步编程是现代Web开发的核心&#xff0c;它解决了浏览器单线程执行带来的UI阻塞问题。以下从多个维度进行深度解析&#xff1a; 一、异步编程的核心概念 JavaScript的执行环境是单线程的&#xff0c;这意味着在同一时间只能执行一个任务。为了不阻塞主线程&#xff0c;J…...