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

重生之我要学C++第四天

这篇文章的主要内容是类的默认成员函数。如果对大家有用的话,希望大家三连支持,博主会继续努力!

目录

一.类的默认成员函数

二.构造函数

三.析构函数

四.拷贝构造函数

五.运算符重载


一.类的默认成员函数

如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6 个默认成员函数。
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

二.构造函数

定义:构造函数 是一个 特殊的成员函数,名字与类名相同 , 创建类类型对象时由编译器自动调用 ,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。
特性:
1. 函数名与类名相同。
2. 无返回值。
3. 对象实例化时编译器 自动调用 对应的构造函数。
4. 构造函数可以重载。
5. 如果类中没有显式定义构造函数,则 C++ 编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
6. 编译器生成的默认构造函数对内置类型不会处理,但会调用自定义类型的默认构造函数。
7. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。
注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。

延伸总结: 

三.析构函数

定义:对象在销毁时会自动调用析构函数,完成对象中资源的清理工作

特征
1. 析构函数名是在类名前加上字符 ~。
2. 无参数无返回值类型。
3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载。
4. 对象生命周期结束时, C++ 编译系统系统自动调用析构函数。
5. 编译器生成的默认析构函数,对自定义类型成员调用它的析构函数。对内置类型不做处理。内置类型出栈帧自动销毁。
6. 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如 Stack 类。
延伸总结:析构函数的作用就是在对象生命周期结束时 释放对象内手动申请的资源空间,只不过自动调用,比C语言方便。析构函数的调用顺序类似栈这种数据结构,后创建先析构。

四.拷贝构造函数

拷贝构造函数只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。(传值拷贝自动调用)

特性:

1. 拷贝构造函数是构造函数的一个重载形式

2. 拷贝构造函数的 参数只有一个 必须是类类型对象的引用 ,使用 传值方式编译器直接报错, 因为会引发无穷递归调用。
3. 若未显式定义,编译器会生成默认的拷贝构造函数。默认拷贝构造:内置类型是按照字节方式直接浅拷贝。对自定义类型会调用自定义类型的拷贝构造函数。
4. 类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请 时,则拷贝构造函数是一定要写的,否则就是浅拷贝。
5. 拷贝构造函数典型调用场景:使用已存在对象创建新对象,函数参数类型为类类型对象,函数返回值类型为类类型对象。
延伸总结:自定义类型传值传参必须调用拷贝构造。默认拷贝构造对内置类型浅拷贝(有malloc的空间需要手动写拷贝构造!没有就不用写),自定义类型调用自定义类型的拷贝构造。
在如下场景:
#include<iostream>
using namespace std;
class Stack
{
public:Stack(int N=0)//构造函数{arr = (int*)malloc(sizeof(int) * N);top = capcity = 0;}~Stack()//析构函数{free(arr);arr = nullptr;top = capcity = 0;}
private:int* arr;int top;int capcity;
};
int main()
{Stack s1(4);Stack s2 = s1;//传值拷贝return 0;
}

使用传值拷贝,但栈类有资源申请(malloc),但没写拷贝构造,系统默认拷贝构造只会对内置类型浅拷贝,s1和s2的arr值就相同,指向同一块堆空间。这就是默认拷贝构造的浅拷贝。

当程序结束时,先自动调用s2的析构函数,将arr指向的堆空间释放,再调用s1的析构函数,arr指向的堆空间再次释放,访问了野指针,程序就会崩溃。所以有资源申请的类一定要写拷贝构造函数,否则在程序结束时会调用两次析构函数,free两次同一块堆空间,程序崩溃。

要解决上述问题,需要手写拷贝构造函数完成深拷贝:

Stack(Stack& s)
{s.arr = (int*)malloc(sizeof(int) * capcity);s.capcity = capcity;s.top = top;
}

五.运算符重载

C++ 为了增强代码的可读性引入了运算符重载 运算符重载是具有特殊函数名的函数 ,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
运算符重载函数: 返回类型+ operator +要重载的操作符(参数列表)
注意:
1.不能通过连接其他符号来创建新的操作符:比如operator@
2.重载操作符必须有一个类类型参数。
3.用于内置类型的运算符,其含义不能改变,例如:内置的整型+ ,不 能改变其含义。
4.作为类成员函数重载时,其形参看起来比操作数数目少1 ,因为成员函数的第一个参数为隐藏的this指针。
5.  .*   ::   sizeof   ?:  .  注意以上5 个运算符不能重载。

接下来举例示范一下比较运算符重载赋值运算符重载。 

如下代码

#include<iostream>
using namespace std;
class Date
{
private:int _year;int _month;int _day;
public:Date(int year = 1, int month = 1, int day = 1)//构造函数{_year = year;_month = month;_day = day;}};
int main()
{Date d1(2022, 9, 24);Date d2(2022, 3, 27);if (d1 > d2){cout << "d1这个日期更大" << endl;}return 0;
}

这里会编译错误,因为d1,d2两个对象无法用>号比较大小,肉眼可见d1更大。那么如何比较大小呢?

我们可以在类中定义函数

bool compare(Date& d){if (_year > d._year){return true;}else if (_year == d._year && _month > d._month){return true;}else if (_year == d._year && _month == d._month && _day > d._day){return true;}elsereturn false;}

通过

d1.compare(d2)==true;//判断出d1大

但是这中方法代码的可读性差,不能直观感受出d1,d2的大小。

C++的运算符重载就应运而生了。在类中定义函数

bool operator>(Date& d){if (_year > d._year){return true;}else if (_year == d._year && _month > d._month){return true;}else if (_year == d._year && _month == d._month && _day > d._day){return true;}elsereturn false;}

通过运算符重载,以下表达式就能表达出d1大于d2

d1>d2;//等价于d1.operator(d2)

 这种方式大大增强了代码的可读性。

相关文章:

重生之我要学C++第四天

这篇文章的主要内容是类的默认成员函数。如果对大家有用的话&#xff0c;希望大家三连支持&#xff0c;博主会继续努力&#xff01; 目录 一.类的默认成员函数 二.构造函数 三.析构函数 四.拷贝构造函数 五.运算符重载 一.类的默认成员函数 如果一个类中什么成员都没有&…...

创建一个简单的 Servlet 项目

目录 1.首先创建一个 Maven 项目 2.配置 maven 仓库地址 3.添加引用 4.配置路由文件 web.xml 5.编写简单的代码 6.配置 Tomcat 7.写入名称,点击确定即可 8.访问 1.首先创建一个 Maven 项目 2.配置 maven 仓库地址 3.添加引用 https://mvnrepository.com/ 中央仓库地址…...

godot引擎c++源码深度解析系列一

许久没有使用c开发过项目了&#xff0c;如果按照此时单位的入职要求&#xff0c;必须拥有项目经验的话&#xff0c;那我就得回到十多年前&#xff0c;大学的时代&#xff0c;哪个时候真好&#xff0c;电脑没有这么普及&#xff0c;手机没有这么智能&#xff0c;网络没有这么发达…...

【VB6|第21期】检查SqlServer数据库置疑损坏的小工具(含源码)

日期&#xff1a;2023年7月25日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…...

React的hooks---useCallback useMemo

useCallback 和 useMemo 结合 React.Memo 方法的使用是常见的性能优化方式&#xff0c;可以避免由于父组件状态变更导致不必要的子组件进行重新渲染 useCallback useCallback 用于创建返回一个回调函数&#xff0c;该回调函数只会在某个依赖项发生改变时才会更新&#xff0c;…...

05. 容器资源管理

目录 1、前言 2、CGroup 2.1、是否开启CGroup 2.2、Linux CGroup限制资源能使用 2.2.1、创建一个demo 2.2.2、CGroup限制CPU使用 2.3、Linux CGroup限制内存使用 2.4、Linux CGroup限制IO 3、Docker对资源的管理 3.1、Docker对CPU的限制 3.1.1、构建一个镜像 3.1.2…...

通过ETL自动化同步飞书数据到本地数仓

一、飞书数据同步到数据库需求 使用飞书的企业都有将飞书的数据自动同步到本地数据库、数仓以及其他业务系统表的需求&#xff0c;主要是为了实现飞书的数据与业务系统进行流程拉通或数据分析时使用&#xff0c;以下是一些具体的同步场景示例&#xff1a; 组织架构同步&#…...

MySQL基础扎实——MySQL中各种数据类型之间的区别

在MySQL中&#xff0c;有各种不同的数据类型可供选择来存储不同类型的数据。下面是一些常见的数据类型以及它们之间的区别&#xff1a; 整数类型&#xff1a; TINYINT&#xff1a;1字节&#xff0c;范围为-128到127或0到255&#xff08;无符号&#xff09;。SMALLINT&#xff1…...

每天五分钟机器学习:多项式非线性回归模型

本文重点 在前面的课程中,我们学习了线性回归模型和非线性回归模型的区别和联系。多项式非线性回归模型是一种用于拟合非线性数据的回归模型。与线性回归模型不同,多项式非线性回归模型可以通过增加多项式的次数来适应更复杂的数据模式。在本文中,我们将介绍多项式非线性回…...

ETH网络学习

概要 ETH网络是一个P2P网络&#xff0c;整个网络又区分为“执行层”与“共识层”。“执行层”节点负责交易交换&#xff0c;“共识层”节点负责区块打包、区块验证、区块同步和链同步。 执行层 执行层分为“服务发现”与“DevP2P”&#xff0c;两者共同并行执行。 服务发现…...

01-将函数参数化进行传递

项目源码&#xff1a;https://github.com/java8/ 1 应对不断变化的需求 在我们进行开发中&#xff0c;经常需要面临需求的不断变更&#xff0c;我们可以将行为参数化以适应不断变更的需求。 行为参数化就是可以帮助我们处理频繁变更的需求的一种软件开发模式 我们可以将代码…...

数据结构【栈和队列】

第三章 栈与队列 一、栈 1.定义&#xff1a;只允许一端进行插入和删除的线性表&#xff0c;结构与手枪的弹夹差不多&#xff0c;可以作为实现递归函数&#xff08;调用和返回都是后进先出&#xff09;调用的一种数据结构&#xff1b; 栈顶&#xff1a;允许插入删除的那端&…...

MATLAB | 产生阿尔法稳定分布噪声并作出概率密度函数

一、问题描述 想产生不同特征参数的α稳定随机变量&#xff0c;并且作出其概率密度函数进行对比。 二、解决思路 运行了MATLAB的官方实例代码&#xff1a; openExample(‘stats/ComparePDFsOfStableDistributionsExample’) &#xff08;1&#xff09;使用makedist()函数生成…...

深入浅出Pytorch函数——torch.softmax/torch.nn.functional.softmax

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 机器学习中的数学——激活函数&#xff1a;Softmax函数 深入浅出Pytorch函数——torch.softmax/torch.nn.functional.softmax 深入浅出Pytorch函数——torch.nn.Softmax 将Softmax函数应用于沿dim的…...

Vue2学习笔记

vue是根据数据来构建用户界面的一套框架 创建一个vue实例 <!-- 1.创建一个容器 2.引入vue.js开发版本&#xff08;全局的&#xff09; 3.创建实例对象 4.配置选项 > 完成渲染 --> <div id"app">{{ msg }} </div> <script srcvue.js><…...

Java 悲观锁 乐观锁

锁可以从不同的角都分类。其中乐观锁和悲观锁是一种分类方式 一、悲观锁、乐观锁定义 悲观锁就是我们常说到的锁。对于悲观锁来说&#xff0c;他总是认为每次访问共享资源时会发生冲突&#xff0c;所以必须每次数据操作加上锁&#xff0c;以保证临界区的程序同一时间只能有一个…...

优惠券秒杀(二)

库存超卖问题分析 库存超卖问题其本质就是多个线程操作共享数据产生的线程安全问题&#xff0c;即当一个线程在执行操作共享数据的多条代码的过程中&#xff0c;其他线程也参与了进来&#xff0c;导致了线程安全问题的产生。例如&#xff1a;线程1发送请求&#xff0c;查询库存…...

selenium的java方式打开IE浏览器

1.下载软件Selenium Driver 官方下载地址&#xff1a; ​ https://www.selenium.dev/downloads/解压selenium-java-3.141.59.zip文件到java项目 seleniumDemo&#xff0c;并降解压的文件放入依赖中&#xff08;1&#xff09;双击项目的src打开项目结构&#xff0c;或右键-打开…...

分类评估指标

文章目录 1. 混淆矩阵2. Precision(精准率)3. Recall(召回率)4. F1-score5. ROC曲线和AUC指标5.1 ROC 曲线5.2 绘制 ROC 曲线5.3 AUC 值6. API介绍6.1 **分类评估报告api**6.2 **AUC计算API**练习-电信客户流失预测1. 数据集介绍2. 处理流程3. 案例实现4. 小结1. 混淆矩阵 …...

OpenCV:图像直方图计算

图像直方图为图像中像素强度的分布提供了有价值的见解。通过了解直方图&#xff0c;你可以获得有关图像对比度、亮度和整体色调分布的信息。这些知识对于图像增强、图像分割和特征提取等任务非常有用。 本文旨在为学习如何使用 OpenCV 执行图像直方图计算提供清晰且全面的指南。…...

告别虚频困扰:用VASP+DynaPhoPy搞定高温材料声子谱的保姆级教程

高温材料声子谱计算实战&#xff1a;从虚频困境到非谐解决方案 引言&#xff1a;虚频问题的根源与突破路径 在计算材料学领域&#xff0c;声子谱分析是理解材料动力学稳定性和热力学性质的核心手段。然而许多研究者都遭遇过这样的困境&#xff1a;对实验合成的材料进行简谐近似…...

自制BLE112串口编程器:基于Bootloader的免调试器烧录方案

1. 项目概述&#xff1a;为BLE112模块打造一款免调试器的RS232编程器在嵌入式开发&#xff0c;特别是早期的蓝牙低功耗&#xff08;BLE&#xff09;模块应用中&#xff0c;我们常常会遇到一个棘手的问题&#xff1a;官方开发工具链的依赖和限制。以Silicon Labs&#xff08;当时…...

终极免费方案:WandEnhancer完整解锁WeMod Pro功能快速指南

终极免费方案&#xff1a;WandEnhancer完整解锁WeMod Pro功能快速指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 你是否渴望享受WeMod Pro会员的所…...

AI算力要上天?别笑,太空数据中心真能干翻地球电费!

前言你有没有算过&#xff0c;训练一个大模型&#xff0c;相当于烧掉多少吨煤&#xff1f;如今AI狂飙突进&#xff0c;算力需求指数级增长&#xff0c;可地球上的电——不够用了&#xff01;更别说建个数据中心还得跟地方政府“斗智斗勇”&#xff0c;抢地皮、配储能、扛审批&a…...

Airtest Poco实战:5分钟搞定微信小程序自动化测试环境搭建与元素抓取

Airtest Poco实战&#xff1a;5分钟搞定微信小程序自动化测试环境搭建与元素抓取微信小程序作为轻量级应用的代表&#xff0c;已经渗透到电商、社交、工具等各个领域。随着小程序功能的日益复杂&#xff0c;自动化测试成为保障产品质量的重要手段。本文将带你快速搭建微信小程序…...

告别手动复制!用这个自定义编辑器脚本一键备份/克隆Unity Terrain Data

告别手动复制&#xff01;用这个自定义编辑器脚本一键备份/克隆Unity Terrain Data在Unity关卡设计和技术美术的工作流中&#xff0c;地形数据的灵活复用往往意味着反复的手动操作——导出高度图、备份材质参数、复制植被分布&#xff0c;每个环节都可能成为效率瓶颈。想象这样…...

基于LSTM自编码器的家用电器功耗异常检测系统构建指南

1. 项目概述&#xff1a;从能耗洞察到智能干预我们每天都在和各种家用电器打交道&#xff0c;从清晨唤醒你的咖啡机&#xff0c;到深夜还在默默工作的路由器。你有没有想过&#xff0c;这些看似微不足道的设备&#xff0c;其背后隐藏的能耗模式&#xff0c;其实大有文章&#x…...

嵌入式Linux驱动开发 —— 从DTS到代码的桥梁与简单OF系列API(3)

接前一篇文章&#xff1a;嵌入式Linux驱动开发 —— 从DTS到代码的桥梁与简单OF系列API&#xff08;2&#xff09; 节点查找 API&#xff1a;如何在设备树中定位目标节点 有了数据结构基础&#xff0c;现在我们可以开始讲具体的API了。第一步是找到你要操作的节点。就像你想操…...

深度解析zenodo_get路径处理机制:如何优雅处理科研数据下载的目录结构

深度解析zenodo_get路径处理机制&#xff1a;如何优雅处理科研数据下载的目录结构 【免费下载链接】zenodo_get Zenodo_get: Downloader for Zenodo records 项目地址: https://gitcode.com/gh_mirrors/ze/zenodo_get 在科研数据管理领域&#xff0c;高效的数据下载工具…...

麒麟桌面CVE-2024-1086漏洞深度修复指南

1. 这个漏洞不是“修个补丁就完事”&#xff1a;麒麟桌面系统CVE-2024-1086的真实威胁图谱你可能刚在安全通告里看到“麒麟桌面系统修复CVE-2024-1086”&#xff0c;顺手点了个更新&#xff0c;心里想着“又一个内核提权漏洞&#xff0c;打上补丁不就完了&#xff1f;”——我去…...