C++类和对象学习笔记

1.类的定义

1.1类定义的格式

  • class是定义类的关键字,Date为类的名字,{ }中为类的主体,注意定义类结束时后面的分号不能省略。类中的内容称为类的成员;类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数:

我们可以通过类名来实例化一个d1,通过d1我们可以使用类中的公有数据,但是在类外我们不能访问类中的保护和私有数据。

  • C++中struct也可以定义类,C++兼容C中的struct用法,同时struct升级成为了类,并且strcut中可以定义成员函数。

1.2访问限定符

访问限定符分为三种: public、private、 protected。

  • C++用类将对象的属性和方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的使用者。
  • public修饰的成员变量在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问,protected和private在目前基础阶段可以看为是一样的,在后面的继承章节中才会有所区别。
  • 访问权限作用域作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域到 } 即类结束。(如上图Date类,public从函数开始到打印函数结束为public的访问权限作用域)
  • class定义成员没有被访问限定符修饰时默认为private,struct默认为public。
  • 一般成员变量都会被protected或private修饰,需要给别人使用的成员函数会被public修饰。

2.对象大小

例如下方Date类:

当我们使用sizeof来计算d1的大小时,和C语言中的struct一致,遵循内存对齐规则:

  • 第一个成员在与结构体偏移量为0的地址处。
  • 其他成员变量要对齐到相应对齐数的整数倍地址处。
  • 对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。
  • 结构体总大小为:最大对齐数的整数倍。
  • 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍。

3.this指针

Date类中有两个成员函数,函数体中没有关于不同对象的区分,所以当d1调用两个函数时,调用的函数是该访问d1的对象还是d2的对象呢?这里就需要C++的this指针来解决这个问题。

其实在我们定义函数时,C++编译器默认会加一个当前类型的指针,叫做this指针。例如上面的函数:

类的成员函数访问成员变量,本质都是通过this指针访问的,例如Init函数中给_year赋值: this->_year = year;

C++规定不能在实参和形参位置显示的写出this指针。

4.类的默认成员函数

默认成员函数就是用户没有显示实现,编译器会自动生成的成员函数成为默认成员函数。一个类,我们不写的情况下编译器会默认生成六个默认成员函数

4.1构造函数

构造函数是特殊的成员函数,构造函数虽然名称为构造,但是构造函数的主要任务并不是开空间创建对象,而是对象实例化时就初始化对象。构造函数本质是要替代之前写Stack时Init函数的功能。

构造函数的特点:

  1. 函数名与雷凌相同
  2. 无返回值(不需要给任何返回值,包括void,C++规定如此 )
  3. 对象实例化时系统会自动调用相对应的构造函数。
  4. 构造函数可以重载
  5. 如果类中没有显示定义构造函数,那么C++编译器会自动生成一个无参的默认构造函数,一旦用户显示定义构造函数,编译器将不再生成。
  6. 无参构造函数、全缺省构造函数、不写构造函数时编译器默认生成的构造函数,统称为默认构造函数。但是这三个构造函数有且只有一个存在,不能同时存在。例如当无参和全缺省构造函数同时存在,当我们都不传参的时候,就会引起调用歧义。
  7. 我们不写、编译器默认生成的构造函数,会对自定义类型成员变量,要求调用这个成员变量的默认构造函数舒适化。如果这个成员变量没有默认构造函数,那么就会报错。

4.1.1无参构造函数

在实例化d1时,d1中的成员变量已经初始化完毕,Date()函数就是无参构造函数

4.1.2带参构造函数

上文已经说到什么是默认构造函数,因此当我们定义无参构造函数时,Date中就不存在默认构造函数了,我们必须像实例化d1那样,才是正确的。

4.1.3全缺省构造函数

此时d1和d2都没有报错,并且程序正常运行,这就是全缺省构造函数和无参构造函数的却别。

4.2析构函数

析构函数与构造函数功能相反,析构函数不是完成对象本身的销毁,C++规定对象在销毁时会自动调用析构函数,完成对象中资源的清理释放工作。析构函数的功能类比Stack实现的Destroy功能。

析构函数的特点:

  1. 析构函数名是在类名前加上字符~。
  2. 无参数无返回值(与构造函数类似,也不需要void)。
  3. 一个类只能有一个析构函数。若未显示定义,系统会自动默认生成析构函数。
  4. 对象生命周期结束时,系统会自动调用析构函数。
  5. 与构造函数类似,我们不写,编译器自动生成的析构函数对内置成员不做处理,自定义成员会调用其的析构函数。
  6. 如果类中没有申请资源,析构函数可以不写,直接使用编译器生成的默认析构函数。但如Stack需要申请资源,一定要自己写析构函数,否则会造成内存泄漏。
  7. 一个局部域的多个对象,C++规定后定义的先析构。

例如:

像下面这种:

使用两个栈来实现一个队列,在析构时,会去调用Stack里面的析构函数,即使在MyQueue中显示定义了析构函数,也会调用Stack里面的析构函数。

那如果多次实例化类,每个类的构造和析构顺序又如何呢?我们来看看下面的一道例题:

C c;int main(){A a;B b;static D d;return 0;}

假设已经有了 A B C D四个类的定义,那么程序中的西沟调用顺序是:

A.  D B A C

B.  B A D C

C.  C D B A

D.  A B D C

我们只需要记住下面的顺序即可解决这道题目:

  1. 全局对象优先于局部对象进行构造。
  2. 局部对象按照出现的顺序进行构造。
  3. 无论是否为static析构的顺序按照构造相反的顺序析构。
  4. 但要注意static改变对象的生存作用域后,会在局部对象之后进行析构。

因此顺序应该为  :  B A D C

以上内容如有错误欢迎批评指正!!

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

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

相关文章

自定义枚举对象序列化规则: 在Json中以枚举的code值表示枚举;枚举序列化时,新增枚举描述字段;String到IEnum的转换

文章目录 引言I 案例分析1.1 接口签名计算1.2 请求对象1.3 枚举对象序列化1.4 创建JavaTimeModule以支持Java 8的时间日期类型序列化和反序列化1.5 请求对象默认值处理II 在JSON中以枚举的code值来表示枚举的实现方式2.1 自定义toString方法返回code2.2 使用@JsonValue注解,只…

adminPage-vue3依赖FormPage说明文档,表单页快速开发,使用思路及范例(Ⅱ)formConfig基础配置项

adminPage-vue3依赖FormPage说明文档,表单页快速开发,使用思路及范例(Ⅱ)formConfig配置项 属性: formConfig(表单项设置)keylabelnoLabeldefaultValuebindchildSlottypeString类型数据(除 time…

IntelliJ IDEA 2024.1.4最新教程!!直接2099!!爽到飞起!!

IntelliJ IDEA 2024.1.4最新破解教程!!直接2099!!爽到飞起!!【资源在末尾】安装馆长为各位看官准备了多个版本,看官可根据自己的需求进行下载和选择安装。https://mp.weixin.qq.com/s/Tic1iR_Xc…

【鸿蒙学习笔记】关系型数据库概述

目录标题 关系型数据库的运行机制样例代码共通方法 DBUtilsIndex 代码效果 关系型数据库的运行机制 1、 关系型数据库对应用提供通用的操作接口,底层使用SQLite作为持久化存储引擎,支持SQLite具有的数据库特性,包括但不限于事务、索引、视图…

自建邮件服务器有哪些方法步骤与注意事项?

自建邮件服务器如何设置解析?邮件服务器怎么使用? 自建邮件服务器可以为个人或企业提供更多的灵活性和控制权,然而,这也是一个复杂且需要谨慎处理的任务。AokSend将探讨自建邮件服务器的基本方法步骤和需要注意的事项。 自建邮件…

逻辑回归(纯理论)

1.什么是逻辑回归? 逻辑回归是一种常用的统计学习方法,主要用于解决分类问题。尽管名字中包含"回归",但它实际上是一种分类算法 2.为什么机器学习需要使用逻辑回归 1.二元分类 这是逻辑回归最基本和常见的用途。它可以预测某个事…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【HMAC(C/C++)】

HMAC(C/C) HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),是一种基于Hash函数和密钥进行消息认证的方法。 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 生…

计算机SCI期刊,闭眼投,保证检索,命中率100%

一、期刊名称 Pervasive and Mobile Computing 二、期刊简介 期刊类型:SCI 学科领域:计算机 影响因子:3 中科院分区:3区 三、期刊简介 Pervasive and Mobile Computing Journal (PMC) 是一本高影响力…

基于前馈神经网络 FNN 实现股票单变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

自定义View-渐变TextView(重点:绘制文本)

源码链接 夸克网盘分享 效果展示 分析 动态效果,使用Animator实现自定义View 继承TextView使用TextView的测量,不重写使用TextView的布局,不重写绘制-重写绘制 使用两种颜色绘制文本颜色占比不同,百分比从0~1 实现 自定义属性…

论文发表作图必备:训练结果对比,多结果绘在一个图片【Precision】【Recall】【mAP0.5】【mAP0.5-0.95】【loss】

前言:Hello大家好,我是小哥谈。YOLO(You Only Look Once)算法是一种目标检测算法,它可以在图像中实时地检测和定位目标物体。YOLO算法通过将图像划分为多个网格,并在每个网格中检测目标物体,从而实现快速的目标检测。本文所介绍的作图教程适用于所有YOLO系列版本算法,接…

Go泛型详解

引子 如果我们要写一个函数分别比较2个整数和浮点数的大小&#xff0c;我们就要写2个函数。如下&#xff1a; func Min(x, y float64) float64 {if x < y {return x}return y }func MinInt(x, y int) int {if x < y {return x}return y }2个函数&#xff0c;除了数据类…

Idea在线搜索Maven依赖-好用工具分享

maven_search 等价于网页搜索maven依赖&#xff0c;非常方便快捷 下载安装后&#xff0c;使用&#xff1a; 点击上方Tools Maven Search 或者快捷键 Ctrl Shift M 最后选择依赖&#xff0c;复制即可

Vue 3 与 TypeScript:最佳实践详解

大家好,我是CodeQi! 很多人问我为什么要用TypeScript? 因为 Vue3 喜欢它! 开个玩笑... 在我们开始探索 Vue 3 和 TypeScript 最佳实践之前,让我们先打个比方。 如果你曾经尝试过在没有 GPS 的情况下开车到一个陌生的地方,你可能会知道那种迷失方向的感觉。 而 Typ…

昇思学习打卡-17-热门LLM及其他AI应用/基于MobileNetv2的垃圾分类

文章目录 网络介绍读取数据集训练训练策略模型保存损失函数优化器模型训练 网络介绍 MobileNetv2专注于移动端、嵌入式或IoT设备的轻量级CNN网络。MobileNet网络使用深度可分离卷积&#xff08;Depthwise Separable Convolution&#xff09;的思想在准确率小幅度降低的前提下&…

分享一款嵌入式开源LED指示灯控制代码框架cotLed

一、工程简介 cotLed是一款轻量级的LED控制软件框架&#xff0c;可以十分方便地控制及自定义LED的各种状态&#xff0c;移植方便&#xff0c;无需修改&#xff0c;只需要在初始化时实现单片机硬件GPIO初始化&#xff0c;同时为框架接口提供GPIO写函数即可。 框架代码工程地址&a…

Apache Dubbo与Nacos整合过程

Dubbo服务发现 Dubbo 提供的是一种 Client-Based 的服务发现机制&#xff0c;依赖第三方注册中心组件来协调服务发现过程&#xff0c;支持常用的注册中心如 Nacos、Consul、Zookeeper 等。 以下是 Dubbo 服务发现机制的基本工作原理图&#xff1a; 服务发现包含提供者、消费者…

LabVIEW中使用 DAQmx Connect Terminals作用意义

该图展示了如何在LabVIEW中使用 DAQmx Connect Terminals.vi 将一个信号从一个源端口连接到一个目标端口。这种处理有以下几个主要目的和作用&#xff1a; 同步操作&#xff1a; 在多任务、多通道或多设备系统中&#xff0c;可能需要不同的组件在同一时刻执行某些操作。通过将触…

redis相关知识记录

redis基本数据类型 Redis⽀持五种主要数据结构&#xff1a;字符串&#xff08;Strings&#xff09;、列表&#xff08;Lists&#xff09;、哈希表&#xff08;Hashes&#xff09;、集合&#xff08;Sets&#xff09;和有序集合&#xff08;Sorted Sets&#xff09;。这些数据结…

winform4

json using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; //导入json第三方库 使用nuget搜索 …