网站切片怎么做/投放广告的网站

网站切片怎么做,投放广告的网站,网站建设好处,做网站推广选哪家C初阶——类和对象(三) 上期内容,我们围绕类对象模型的大小计算,成员存储方式,this指针,以及C实现栈和C语言的比较,进一步认识了C的封装特性。本期内容,我们开始介绍类的默认成员函…

C++初阶——类和对象(三)

上期内容,我们围绕类对象模型的大小计算成员存储方式this指针,以及C++实现栈和C语言的比较,进一步认识了C++的封装特性。本期内容,我们开始介绍类的默认成员函数,这是类和对象板块中最为重要,也是相对复杂的内容,让我们一起探索!

引言

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

  • 初始化和清理:构造函数析构函数
  • 拷贝复制:拷贝构造函数赋值重载函数
  • 取地址重载:普通对象取地址重载const对象取地址重载函数

一、构造函数

1.背景引入

示例1
示例2

我们再来回顾一下,_year_month_day是三个私有的成员变量,InitPrint是外界可以直接访问的成员函数,在main函数中,我们先要通过类来示例化出一个对象,比如这里的Date d1; Date d2; Date d3;等等,然后调用类里面的成员函数。这里基于同一个类创建了很多对象,然而在成员函数中似乎并没有传递代表各个对象的形参,那么编译器是怎么区分的呢?很简单,由于this指针的存在。我们以d1.Init(2025,3,10);为例,this指针指向当前的对象——d1,然后在调用函数Init时,隐式传递了这个指针,然后通过这个指针访问d1中的成员变量_year、_month、_day,将它们分别赋值为2025、3、10,如图所示:
示例3
当运行到下一个对象d2时,this指针指向的就是d2了。

进一步探究

如果我们仔细观察,不难发现这里分为了两步走:第一步,先通过类实例化一个对象,也就是Date d1;,然后再用具体的数值将其初始化d1.Init(2025,3,10);,其实是有些麻烦的,我们能不能在实例化对象的同时,就将信息设置进去呢?——答案是肯定的,C++本身就是对C语言的优化,构造函数应运而生!

2.什么是构造函数?

构造函数是一个特殊的成员函数,名字与类名相同。创建类对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次
示例4
示例5
在这里,我们已经将原来的初始化函数改造成了一个构造函数,构造函数的函数名与类名相同,没有返回值(这里的没有返回值不是说返回一个void,写成void Date(int year, int month, int day),而是什么都不要写,直接就是Date(int year, int month, int day)),至于为什么,这是语法规定,这是一个特殊的函数,有特殊的待遇,只有这样写,编译器才知道这是构造函数。对于构造函数的调用,也是很有趣的,我们在实例化对象的同时,后面跟上了一个括号,里面就是想要在对象中填入的信息Date d1(2025, 3, 10);,这样一来,我们不仅实例化了一个对象,还填入了我们想要的信息,一步解决,非常方便。之前的那种两步走,是先根据图纸建房子,然后里面的家具还要自己来置办;现在是把装修也一并让别人做好了,自己直接拎包入住,确实方便的多。

3.构造函数的特性

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。也很好理解,之前是两步走,现在是一步走,至于减少的那一步——填入想要的信息,就是构造函数的功劳。

(1)构造函数的重载

构造函数是可以重载的,根据传参的不同,调用对应的构造函数,如图所示:
示例7
这里就写了两个构造函数,其中一个是无参数的,这些都可以理解,但是,我们注意到,为什么在调用的时候写的是Date d1;而不是Date d1();呢?我们先来看一下结果:
示例8
这里什么都没有输出,也就是没有调用那个构造函数,这是为什么呢?仔细观察我们发现,Date d1();像是函数的声明,Date返回值的类型d1函数名,()表示这个函数不需要传参。基于这种情况,编译器不知道这里到底是在类实例化对象还是在声明一个名为d1的函数。因此,我们对于无参的构造函数,在实例化对象时就不需要加()
当然,还有一点,一开始的构造函数示例中,是提供了缺省参数的,而且是全缺省,这里做出了改变。如果依然是全缺省会发生什么呢?如图所示:
示例9
示例10
还是一个调用不明确的问题:不传参,不仅无参的函数可以调用,全缺省的也可以调用,因为它可以自动帮你把数据补上。在C++入门中已经讲过这一点,这里就当是复习一下吧。

(2)默认构造函数
默认构造函数的分类

默认构造函数是无需参数即可调用的构造函数,我们既可以显式声明,也可以让编译器隐式生成。无参构造函数全缺省构造函数我们没写编译器默认生成的构造函数,都可以认为是默认构造函数,再简单一点,不需要传参就可以调用的构造函数都是默认构造函数:

  • 无参构造函数
    示例11
  • 全缺省构造函数
    示例12
  • 编译器默认生成的构造函数
    示例13
编译器自动生成的构造函数

如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。注意,这里是无参的,也就是说调用的时候直接写Date d1;即可,如图所示:
示例14
示例15
这里的默认构造函数似乎没什么用,对于这些变量的值,好像也没有进行处理,依旧是随机值,那么默认构造函数还有它存在的价值吗?
其实是这样的:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型,如:int、char、double……,自定义类型就是需要自己定义的,如struct、class……
编译器生成的默认构造函数对内置类型不作处理对自定义类型则是调用它的默认构造。因此,一般情况下,有内置类型成员,就需要自己写构造函数,不能用编译器自己生成的;全部都是自定义类型成员,可以考虑让编译器自己生成。
我们来举个自定义类型的例子:
示例16
在Date类的成员变量中,不仅有内置类型,还有自定义类型变量Time _t;那么在实例化对象时,内置类型不作处理自定义类型调用它的默认构造,而Time类的默认构造我们已经自己定义了,因此会打印出对应的结果,我们也可以调试看一看:
示例17
由于Date类中没有自己写构造函数,内置类型都是随机值,而自定义类型Time _t就调用了它的默认构造,而Time的默认构造是我们自己实现的,对内置类型进行了初始化。

  • C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值:
    示例18
    这里没有自己写构造函数,默认值给在成员变量的声明里。

二、析构函数

析构函数是特殊的成员函数,其特征如下:

  • 析构函数名是在类名前加上字符 ~。
  • 无参数无返回值类型。
  • 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载
  • 对象生命周期结束时,C++编译系统系统自动调用析构函数。

1.自己定义的析构函数

我们以一个为例,因为栈中涉及到动态内存开辟,不使用了需要及时销毁开辟的内存空间,否则会造成内存泄漏,有了析构函数,我们只需要在类中定义一下,在类外它就会自动调用了,代码如下:

typedef int DataType;
class Stack
{
public:Stack(size_t capacity = 3){_array = (DataType*)malloc(sizeof(DataType) * capacity);if (NULL == _array){perror("malloc fail");return;}_capacity = capacity;_size = 0;}void Push(DataType data){// CheckCapacity();_array[_size] = data;_size++;}// 其他方法...~Stack(){if (_array){free(_array);_array = NULL;_capacity = 0;_size = 0;}cout << "~Stack" << endl;}
private:DataType* _array;int _capacity;int _size;
};int main()
{Stack st1;return 0;
}

运行结果如图:
示例19

2.编译器自动生成的析构函数

关于编译器自动生成的析构函数,是否会完成一些事情呢?下面的程序我们会看到,编译器生成的默认析构函数,对自定类型成员调用它的析构函数。
示例20
如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。

本期总结+下期预告

本期内容非常重要,详细介绍了类的构造函数和析构函数,下期将继续讲解拷贝构造函数等相关内容!

感谢大家的关注,我们下期再见!
在这里插入图片描述

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

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

相关文章

矩阵幂(矩阵k次幂)

矩阵幂 #include<stdio.h> //矩阵乘法 void cf(int a[20][20],int b[20][20],int result[20][20],int n){for(int i0;i<n;i){for(int j0;j<n;j){result[i][j]0;for(int k0;k<n;k){result[i][j]a[i][k]*b[k][j];}}} }void print(int a[20][20],int n){for(int…

自己动手打造AI Agent:基于DeepSeek-R1+websearch从零构建自己的Manus深度探索智能体AI-Research

第一章&#xff1a;AI Agent基础与DeepSeek-R1架构解析&#xff08;1/10&#xff09; 1.1 AI Agent技术演进与核心价值 人工智能代理&#xff08;AI Agent&#xff09;经历了从规则驱动到数据驱动的范式转移。早期基于专家系统的符号主义方法&#xff08;如MYCIN医疗诊断系统…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_13可展开行的固定表头表格

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_13可展开行的固…

Gemini Robotics:将人工智能带入物理世界

25年3月来自谷歌的技术报告“Gemini Robotics: Bringing AI into the Physical World”。 大型多模态模型的最新进展&#xff0c;已使数字领域出现卓越的通才能力&#xff0c;但将其转化为机器人等物理智体仍然是一项重大挑战。一般有用的机器人需要能够理解周围的物理世界&am…

生活中的可靠性小案例11:窗户把手断裂

窗户把手又断了&#xff0c;之前也断过一次&#xff0c;使用次数并没有特别多。上方的图是正常的把手状态&#xff0c;断的形状如下方图所示。 这种悬臂梁结构&#xff0c;没有一个良好的圆角过渡&#xff0c;导致应力集中。窗户的开关&#xff0c;对应的是把手的推拉&#xff…

多元时间序列预测的范式革命:从数据异质性到基准重构

本推文介绍了一篇来自中国科学院计算技术研究所等机构的论文《Exploring Progress in Multivariate Time Series Forecasting: Comprehensive Benchmarking and Heterogeneity Analysis》&#xff0c;发表在《IEEE Transactions on Intelligent Transportation Systems》。论文…

印章/公章识别:PaddleX下的“Seal-Recognition”模型

最近做项目需要对印章进行识别&#xff0c;并提取其中的印章文字&#xff0c;又不希望这个模型太大&#xff0c;还要方便部署&#xff0c;于是乎这个模型是个不错的选择。 一、模型简介 “Seal-Recognition”模型是PaddleX旗下的一款模型&#xff08;PaddleX 是基于飞桨框架构…

算法专题一:双指针

1.移动零 题目链接&#xff1a;283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 我们可以定义一个dest&#xff0c;一个cur&#xff0c;dest表示数组中不为零的数的最后一位&#xff0c;cur用来遍历数组 class Solution {public void moveZeroes(int[] nums) {for(int cur…

Linux驱动开发-①pinctrl 和 gpio 子系统②并发和竞争③内核定时器

Linux驱动开发-①pinctrl 和 gpio 子系统②并发和竞争③内核定时器 一&#xff0c;pinctrl 和 gpio 子系统1.pinctrl子系统2.GPIO子系统 二&#xff0c;并发和竞争1.原子操作2.自旋锁3.信号量4.互斥体 三&#xff0c;按键实验四&#xff0c;内核定时器1.关于定时器的有关概念1.…

数据库的高阶知识

目录 一、case when二、几种常见的嵌套查询2.1 比较运算符2.2 ANY/ALL 关键词2.3 in 关键词2.4 EXISTS关键词2.5 in和exists的异同点 三、开窗函数 数据库的基本知识 数据库的高阶知识 一、case when 在实际工作中&#xff0c;经常会涉及以下两类问题&#xff1a; 数据的映射…

MapReduce处理数据流程

&#xff08;一&#xff09;Shuffle MapReduce中的Shuffle过程指的是在Map方法执行后、Reduce方法执行前对数据进行分区排序的阶段 &#xff08;二&#xff09;处理流程 1. 首先MapReduce会将处理的数据集划分成多个split&#xff0c;split划分是逻辑上进行划分&#xff0c;…

OrioleDB: 新一代PostgreSQL存储引擎

PostgreSQL 12 引入了可插拔式的表存储方法接口&#xff0c;允许为不同的表选择不同的存储机制&#xff0c;例如用于 OLTP 操作的堆表&#xff08;HEAP、默认&#xff09;、用于 OLAP 操作的列式表&#xff08;Citus&#xff09;&#xff0c;以及用于超快速搜索处理的内存表。 …

电脑自动关机故障维修案例分享

电脑基本配置&#xff1a; C P U: AMD A10 9700 内存&#xff1a;8G 硬盘&#xff1a;金邦512G固态硬盘 主板&#xff1a;华硕 A320M-F 显卡&#xff1a;集成&#xff08;核心显卡&#xff09; 操作系统&#xff1a;Win10专业版 故障描述&#xff1a; 使用一段时间会黑屏…

栈(LIFO)算法题

1.删除字符串中所有相邻的重复字符 注意&#xff0c;我们需要重复处理&#xff0c;而不是处理一次相邻的相同元素就结束了。对示例来说&#xff0c;如果只进行一次处理&#xff0c;结果为aaca&#xff0c;但是处理之后又出现了相邻的重复元素&#xff0c;我们还得继续处理&…

conda的基本使用及pycharm里设置conda环境

创建conda环境 conda create --name your_env_name python3.8 把your_env_name换成实际的conda环境名称&#xff0c;python后边的根据自己的需要&#xff0c;选择python的版本。 激活conda环境 conda activate your_env_name 安装相关的包、库 conda install package_name …

synchronized与 Java内置锁(未写完)

文章目录 一、 synchronized 关键字二、Java对象结构1. 对象头2. 对象体3. 对齐字节4. 对象头中的字段长度5. Mark Word 的结构信息6. 使用 JOL 工具查看对象的布局 三、Java 内置锁机制3.1 内置锁的演进过程1. 无锁状态2. 偏向锁状态3. 轻量级锁状态4. 重量级锁状态 一、 sync…

LLM(3): Transformer 架构

Transformer 架构是当前大语言模型的主力架构和基础技术&#xff0c;本文以通俗易懂的方式&#xff0c;对此作简要介绍。 1.4 介绍 Transformer 架构 大多数现代的大规模语言模型&#xff08;LLMs&#xff09;依赖于 Transformer 架构&#xff0c;这是一种在 2017 年的论文《…

88.HarmonyOS NEXT 性能监控与调试指南:构建高性能应用

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT 性能监控与调试指南&#xff1a;构建高性能应用 文章目录 HarmonyOS NEXT 性能监控与调试指南&#xff1a;构建高性能应用1. 性能监…

012---状态机的基本知识

1. 摘要 文章为学习记录。主要介绍状态机概述、状态转移图、状态编码、状态机写法、状态机代码示例。 2. 状态机概述 状态机 &#xff08;Finite State Machine&#xff09;&#xff0c;也称为同步有限状态机&#xff0c;用于描述有先后顺序或时序规律的事情。 “同步”&…

deepseek+kimi做ppt教程记录

1.首先注册deepseek和kimi deepseek官网&#xff1a;https://chat.deepseek.com/ kimi官网&#xff1a;https://kimi.moonshot.cn/ 以下以一篇工作总结报告为例 2.使用deepseek生成ppt大纲 让deepseek生成kimi生成ppt所需要的内容时&#xff0c;需要注意提示词内容&#xff0c;…