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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jdk1.8安装教程及环境变量配置(含jdk8,11,13安装文件)

目录 友情提醒第一章、JVM、JRE、JDK介绍第二章、下载和安装JDK2.1)百度网盘直接下载免安装2.2)官网下载安装JDK(需要收费) 第三章、环境变量配置3.1)windows环境变量配置3.2)验证环境变量是否配置成功 友情…

类和对象——【运算符重载】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件iostream的声明,使用时请自行添加。 博主主页:Yan. yan.                        …

PDA:Prompt-based Distribution Alignment for Unsupervised Domain Adaptation

文章汇总 式中, y s y^s ys表示源域数据的one-hot ground-truth, K K K为类数, w i w_i wi​和 z ~ s \tilde{z}_s z~s​分别表示源域经过提示调优的最终文本表示和最终图像表示的第 i i i类。 同理,为了进一步利用目标领域的数据…

ARMV8安全特性:Pointer Authentication

文章目录 前言一、Introduction二、Problem Definition三、Pointer Authentication3.1 Instructions3.2 Cryptography3.3 Key Management 四、Sample Use Cases4.1 Software Stack Protection4.2 Control Flow Integrity (CFI)4.3 Binding Pointers to Addresses 五、Security …

B2B领域的客户裂变策略:打造行业内的共赢生态

在日益竞争激烈的B2B市场中,客户裂变作为一种高效的增长策略,不仅能够帮助企业快速扩大客户基础,还能促进行业内资源共享与合作,共同构建一个健康、可持续的共赢生态。本文将探讨B2B领域实施客户裂变策略的关键要素,以…

【数据结构】排序——快速排序

前言 本篇博客我们继续介绍一种排序——快速排序,让我们看看快速排序是怎么实现的 💓 个人主页:小张同学zkf ⏩ 文章专栏:数据结构 若有问题 评论区见📝 🎉欢迎大家点赞👍收藏⭐文章 ​ 目录 …

“学习Pandas中时间序列的基本操作“

目录 # 开篇 1. 创建和操作时间序列对象 2. 时间序列数据的读取和存储 3. 时间序列数据的索引和切片 4. 时间序列数据的操作和转换 5. 时间序列数据的可视化 6. 处理时间序列中的缺失值 7. 时间序列数据的聚合和分组 8. 时间序列的时间区间和偏移量操作 示例代码&…

重要文件放u盘还是硬盘?硬盘和u盘哪个适合长期存储

在数字时代,我们每天都会处理大量的文件。其中,不乏一些对我们而言至关重要的文件,如家庭照片、工作文档、财务记录等。面对这些重要文件的存储问题,我们通常会面临:“重要文件放U盘还是硬盘”、“硬盘和U盘哪个适合长…

qt creator中右边的的类和对象如何显示出来

qt creator中右边的的类和对象如何显示出来? 解决方法: 鼠标右键,重置为默认布局。

特征值究竟体现了矩阵的什么特征?

特征值究竟体现了矩阵的什么特征? 简单来说就是x经过矩阵A映射后和自己平行 希尔伯特第一次提出eigenvalue,这里的eigen就是自己的。所以eigenvalue也称作本征值 特征值和特征向量刻画了矩阵变换空间的特征 对平面上的任意向量可以如法炮制,把他在特征…

【Linux】任务管理

这个任务管理(job control)是用在bash环境下的,也就是说:【当我们登录系统获取bashshell之后,在单一终端下同时执行多个任务的操作管理】。 举例来说,我们在登录bash后,可以一边复制文件、一边查…

Linux--线程ID封装管理原生线程

目录 1.线程的tid(本质是线程属性集合的起始虚拟地址) 1.1pthread库中线程的tid是什么? 1.2理解库 1.3phtread库中做了什么? 1.4线程的tid,和内核中的lwp 1.5线程的局部存储 2.封装管理原生线程库 1.线程的tid…

8.9分王者“水刊”!1区IEEE-Trans,国人主编坐镇!发文量2倍增长,扩刊趋势明显!

关注GZH【欧亚科睿学术】,第一时间了解最新期刊动态! 本期,小编给大家推荐的是一本IEEE旗下王者“水刊”。该期刊目前处于扩刊状态,接收跨学科领域,领域认可度高,还可选择非OA模式无需版面费,是…

css看见彩虹,吃定彩虹

css彩虹 .f111 {width: 200px;height: 200px;border-radius: 50%;box-shadow: 0 0 0 5px inset red, 0 0 0 10px inset orange, 0 0 0 15px inset yellow, 0 0 0 20px inset lime, 0 0 0 25px inset aqua, 0 0 0 30px inset blue, 0 0 0 35px inset magenta;clip-path: polygo…

力扣爆刷第163天之TOP100五连刷81-85(回文链表、路径和、最长重复子数组)

力扣爆刷第163天之TOP100五连刷81-85(回文链表、路径和、最长重复子数组) 文章目录 力扣爆刷第163天之TOP100五连刷81-85(回文链表、路径和、最长重复子数组)一、234. 回文链表二、112. 路径总和三、169. 多数元素四、662. 二叉树…

盲人出行好帮手:蝙蝠避障让走路变简单

在一片无光的世界里,每一步都承载着探索与勇气。我是众多盲人中的一员,每天的出行不仅是从A点到B点的物理移动,更是一场心灵的征程。我的世界,虽然被剥夺了视觉的馈赠,却因科技的力量而变得宽广…

保护企业数据资产的策略与实践:数据安全治理技术之实战篇!

在上篇文章中,我们深入讨论了数据安全治理技术的前期准备工作,包括从建立数据安全运维体系、敏感数据识别、数据的分类与分级到身份认等方面的详细规划和设计。这些准备工作是实现数据安全治理的基础,它们为企业建立起一套系统化、标准化的数…

2.电容(常见元器件及电路基础知识)

一.电容种类 1.固态电容 这种一般价格贵一些,ESR,ESL比较低,之前项目400W电源用的就是这个,温升能够很好的控制 2.铝电解电容 这种一般很便宜,ESR,ESL相对大一些,一般发热量比较大,烫手。 这种一般比上一个贵一点&am…

[leetcode]maximum-binary-tree 最大二叉树

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return construct(nums, 0, nums.size() - 1);}TreeNode* construct(const vector<int>& nums, int left, int right) {if …

快速掌握 ==== js 正则表达式

git 地址 https://gitee.com/childe-jia/reg-test.git 背景 在日常开发中&#xff0c;我们经常会遇到使用正则表达式的场景&#xff0c;比如一些常见的表单校验&#xff0c;会让你匹配用户输入的手机号或者身份信息是否规范&#xff0c;这就可以用正则表达式去匹配。相信大多数…