C++练级之初级:第六篇

news2024/12/23 22:15:00

类和对象入门级:第六篇

    • 1.类的引入
    • 2.类的定义
      • 2.1类的访问限定符
      • 2.2类的封装
      • 2.3类的实例化
    • 3.如何计算类或者对象的大小
    • 4.this指针
  • 总结

我们知道,C++在C语言的基础上引入了对象的概念,那么从本篇开始进入类和对象

1.类的引入

🤔首先,什么是类呢?

类(Class)具有共同属性和行为的事物所构成的集合,是面向对象程序设计实现信息封装的基础。类与C语言中的结构相似,是既能表示属性又能表示行为的复合数据类型。
在这里插入图片描述


小哈士奇类
在这里插入图片描述
它们都有狗狗的属性,眼睛都很蓝的属性,很可爱的属性等等;
总而言之,类是对某一类具有共同特征的事物的抽象描述;


👉我们接触的第一个类👈

概念:
C语言结构体中只能定义变量,然而在C++中,我们把结构体升级成了类结构体内不仅可以定义变量,也可以定义函数,这个变量叫做成员变量,这个函数叫做成员函数,结构体名可以做类型名(可以省略struct了)

在这里插入图片描述

  1. 结构体名可以做类型名

在这里插入图片描述

  1. struct内可以写函数

在这里插入图片描述
3. 调用成员函数和成员变量

在这里插入图片描述


2.类的定义

我们在C++中我们通常喜欢用class(类的意思),来定义类

类的写法:

class className
{
 // 类体:由成员函数和成员变量组成

}; // 一定要注意后面的分号

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略


在这里插入图片描述

🤔为什么换成class就报错了?

在这里插入图片描述
这就涉及到了类的访问限定符了;

2.1类的访问限定符

在这里插入图片描述

注解:

  • public:类外面可以访问;
  • protected和private(暂时认为是一样的):类外的不能直接访问类里的;
  • 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域就到 } 即类结束;
  • . class的默认访问权限为private,struct为public(因为struct要兼容C);

🤔🤔那我们如何才能访问class中的函数呢?

在这里插入图片描述

🤔🤔🤔如果我们写的一个函数很长,我们一般声明和定义分开写,在类中同样如此!

在这里插入图片描述

正确定义:

在这里插入图片描述

所以一般短的函数我们直接定义在类中,类会将这个函数默认为内联函数(因为声明和定义不能分离),一般长的函数我们声明和定义分离;


🤔🤔🤔我们注重一下成员变量的写法,否则可读性就会变差,比如这里的year到底是成员变量,还是函数形参?

class Date
{
public:
 void Init(int year)
 {
 	// 这里的year到底是成员变量,还是函数形参?
 	year = year;
 }
private:
 int year;
};

在这里插入图片描述

处理方法(按自己的来就行):
在这里插入图片描述

2.2类的封装

面都对象的三大特征:封装,继承,多态;

🤔那么什么是封装呢?

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互


就像电脑一样:
在这里插入图片描述
在这里插入图片描述

🤔🤔为什么要封装?

  • 可以保护对象的实现细节,防止外界对其进行不当操作;
  • 可以方便地检查和保证对象被正确地使用,避免出现访问越界等错误;
  • 可以提高程序的可读性和可维护性;

总而言之,封装的本质是为了更好的管理,更安全的使用类;

2.3类的实例化

🤔🤔🤔什么是类的实例化?

用类类型创建对象的过程,称为类的实例化
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
有同学可能会有这样的疑问:我们能不能从类域中访问成员变量?
在这里插入图片描述
注意这里的类只是声明,并没有实例化对象,只有实例化对象了我们才能通过对象进行访问


3.如何计算类或者对象的大小

🤔🤔🤔问题来了,一个类实例化的对象的大小是多少字节

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
结论: 类的大小的计算遵循内存对齐的规则只计算成员变量的大小;

👇如果大家忘了内存对齐规则可以看看这篇博客
内存对齐


内存对齐规则

  1. 第一个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    注意: 对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值,VS中默认的对齐数为8;
  3. 结构体总大小为:最大对齐数的整数倍
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

🤔🤔🤔为什么要内存对齐?

我们从一个简单的代码分析内存对齐与不进行内存对齐:

struct tap
{
	char a;
	int b;
};

在这里插入图片描述

注意:
A.从内存中一次读取多少字节是由(数据总线)硬件控制的,那么这个大小是固定的,不同的的平台读取多少字节是不一样的,我们以每次从内存中读取4Byte为例;

B.我们以一次从内存中读取多少字节(这是由硬件控制我们以4byte为例) 来划分若干个内存边界,我们只能从内存边界开始读取数据,不能随意的读取(因为硬件不支持);
在这里插入图片描述

  1. 对于不内存对齐:
    在这里插入图片描述
  2. 对于内存对齐:

在这里插入图片描述

总结:
1.平台原因:
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能 在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2. 性能原因 :
数据结构( 尤其是栈 ) 应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。总的来说就是以空间换时间 。
注意: 修改默认对齐数只是改变了数据的存储方式,不会改变一次从内存中读取多少字节的数据(因为硬件是固定的);


🤔🤔🤔为什么不计算成员函数的大小?

在这里插入图片描述

因为,每个对象的成员变量是不同的,但是所调用的函数是一致的,所以没必要每个对象都存储成员函数;
所以,对象中只存储成员变量,不存储成员函数;


🤔🤔🤔那为什么在C++的类中没有成员变量却还要占一个字节呢?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
语法规定: 没有成员变量的类对象,需要占用 1 Byte,是为了占位,表示对象存在,不存储有效数据;

🤔🤔🤔🤔那这些成员函数都存在哪?

在这里插入图片描述

既然成员函数是类实例化的对象所共有的,那我们肯定不能存放在对象中 (太浪费空间没必要),所以我们将这些成员函数存放在公共代码区

公共代码区:

  • 存放函数体的二进制代码,由操作系统进行管理。
  • 代码区是共享的,对于被频繁执行的程序,只需要在内存中有一份代码即可。
  • 代码区是只读的,防止意外修改代码。

这样存储更能节省空间,这些成员函数会在编译阶段直接调用(call 函数地址),建立函数栈帧;

4.this指针

👉由问题引入this指针👈

在这里插入图片描述

🤔🤔🤔为什么d1,d2调用的是同一个函数但是打印的结果不同?

这个就涉及到了隐含的this指针,这个是由编译器来完成的;

在这里插入图片描述

本质上调用的是同一个函数,只是编译器处理的参数不一样,这是编译器自动完成的,不需要我们操作;

我们发现一个报错

在这里插入图片描述

语法规定:

  • this指针不能在实参和形参之间显示传递,但是可以在函数内部使用this指针
  • this指针是不可修改的;

🤔🤔🤔this指针是存在内存的哪个区?

栈区 ,堆区 ,静态区 ,常量区 ,公共代码区,中的哪个区域呢?
在这里插入图片描述

先说答案this是存在内存的栈区的,vs对this指针进行了优化,存放在ecx(寄存器)中,这样传参更快
分析:首先this指针是一个形参,所以this指针和普通形参一样是存放在栈里面的,作为栈帧的一部分;


😁好了我们学完了this指针,就拿两道题试试手(dog

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分析:
在这里插入图片描述

总结

以上就是本篇的所有内容了,今天主要学了类和对象的入门篇,什么是类,类的定义,类的实例化,如何计算类的大小,以及this指针及一些注意点,如果喜欢本篇,不妨点个赞❤️,下篇见;

请添加图片描述

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

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

相关文章

【JavaEE】_1.多线程(1)

目录 1.操作系统 2. 进程 3. CPU分配——进程调度 3.1 操作系统对进程的管理 3.2 PCB的属性 3.2.1 基础属性 3.2.2 实现进程调度的属性 4. 内存分配——内存管理 4.1 虚拟地址空间 4.2 进程间通信 5. 线程 5.1 线程的概念 5.2 创建与使用多线程 5.2.1 方式1&a…

【数据结构】八大排序(一)

😛作者:日出等日落 📘 专栏:数据结构 珍惜自己的时间,利用好每一份每一秒。做事不放过没一个细节,小心谨慎,细致,能够做到这些,还有什么是不可能的呢? 目录 ​编辑 ✔…

【刷题之路Ⅱ】LeetCode 61. 旋转链表

【刷题之路Ⅱ】LeetCode 61. 旋转链表 一、题目描述二、解题1、方法1——移动部分链表1.1、思路分析1.2、代码实现 2、方法1——闭合为环2.1、思路分析2.2、代码实现 一、题目描述 原题连接: 61. 旋转链表 题目描述: 给你一个链表的头节点 head &#x…

【Python | matplotlib】matplotlib.cm的理解以及举例说明

文章目录 一、模块介绍二、颜色举例 一、模块介绍 matplotlib.cm是Matplotlib中的一个模块,它提供了一组用于处理颜色映射(colormap)的函数和类。颜色映射是一种将数值映射到颜色的方法,常用于制作热力图、等值线图、散点图等。 …

软件工程实验:原型设计

目录 前言实验目的实验要求实验过程系统原型绘制生成html代码 总结 前言 本次实验的主题是原型设计,即根据用户需求和系统功能,设计一个简单的软件原型,展示系统的界面和交互方式。原型设计是软件工程中的一种重要技术,它可以帮助…

深入探索PyTorch中的自动微分原理及梯度计算方法

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

如何完全卸载linux下通过rpm安装的mysql

卸载linux下通过rpm安装的mysql 1.关闭MySQL服务2.使用 rpm 命令的方式查看已安装的mysql3. 使用rpm -ev 命令移除安装4. 查询是否还存在遗漏文件5. 删除MySQL数据库内容 1.关闭MySQL服务 如果之前安装过并已经启动,则需要卸载前请先关闭MySQL服务 systemctl stop…

Tomcat整体架构解析

一、Tomcat整体架构介绍 Tomcat是一个开源的轻量级web应用服务器。整体架构如下: Tomcat中最顶层的容器是Server,即代表一个Tomcat服务器,一个Server中可以有多个Service,对外提供不同的web服务。Service是对Connector和Contain…

电话号码的字母组合

题目:17. 电话号码的字母组合 - 力扣(Leetcode) 思路: 给定一个电话号码字符串 digits,须输出它所能表示的所有字母组合。我们可以先定义一个数字字符到字母表的映射表 numToStr,然后再用 Combine 函数递归…

【Linux专区】 环境搭建 | 带你白嫖七个月阿里云服务器

💞💞欢迎来到 Claffic 的博客💞💞 👉 专栏:《Linux专区》👈 前言: 工欲善其事必先利其器,没个Linux环境怎么愉快地学Linux?这期就先带大家把环境搞好&#xf…

物联网系统中常见的通信协议分析

物联网(Internet of Things, 简称IoT)是指将各种传感器、设备等通过互联网连接起来,形成一个庞大的网络,实现物与物之间的互联互通。在实现这个过程中,各种不同的通信协议被广泛应用。本文将为大家介绍物联网中常见的通…

[架构之路-185]-《软考-系统分析师》-3-操作系统基本原理 - 文件索引表

目录 一、文件的索引块。 二、索引分配表 三、索引表的链接方案 四、多层索引 五、混合索引分配 一、文件的索引块。 存放在目录中的文件,并非是文件的真实内容。 目录中记录了文件的索引块是几号磁盘块。 文件对应的索引表是存放在指定的磁盘块中的&#x…

CSI指纹预处理(中值、均值、Hampel、小波滤波)

目录 1、前言 2、中值滤波器 3、均值滤波器 4、Hampel滤波器 5、小波变换滤波器 1、前言 因为设备、温度和实验室物品摆设等因素的影响,未经处理的CSI数据不能直接使用,需要对数据进行异常值处理以保证数据的稳定性,同时减少环境中人的…

云原生Istio架构和组件介绍

目录 1 Istio 架构2 Istio组件介绍2.1 Pilot2.2 Mixer2.3 Citadel2.4 Galley2.5 Sidecar-injector2.6 Proxy(Envoy)2.7 Ingressgateway2.8 其他组件 1 Istio 架构 Istio的架构,分为控制平面和数据面平两部分。 - 数据平面:由一组智能代理([En…

Eclipse改SSH项目,修改java代码无效

遇到了一个大坑,记录一下… 坑1:修改后台代码总是没用… 1.背景: Eclipse运行SSH项目(StrutsSpringHibernate),修改SQL语句,但是前端查询的结果没变化…(例如,在sql里加上 where …

LeetCode279之完全平方数(相关话题:动态规划,四平方和定理)

题目描述 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。 示例 1: 输入:n = 12 输出:3 解释:12 = 4 + 4 +…

【Android构建篇】MakeFile语法

前言 对于一个看不懂Makefile构建文件规则的人来说,这个Makefile语法和shell语法是真不一样,但是又引用了部分shell语法,可以说是shell语法的子类,Makefile语法继承了它。 和shell语法不一样,这个更难一点&#xff0…

Vue3基本知识点

为什么要学vue3 1、Vue是国内 最火的前端框架 2、Vue3是2020年09月18日正式发布的 目前以支持Vue3的UI组件库 库名称简介ant-design-vuePC 端组件库:Ant Design 的 Vue 实现,开发和服务于企业级后台产品arco-design-vuePC 端组件库:字节跳…

DataX3同步Mysql数据库数据到Mysql数据库和DataX3同步mysql数据库数据到Starrocks数据库

DataX3同步Mysql数据库数据到Mysql数据库和DataX3同步mysql数据库数据到Starrocks 一、认识DataX二、DataX3概览三、DataX3框架设计四、DataX3插件体系五、DataX3核心架构六、DataX 3六大核心优势1.可靠的数据质量监控2.丰富的数据转换功能3.精准的速度控制4.强劲的同步性能5.健…

【AI面试】目标检测中one-stage、two-stage算法的内容和优缺点对比汇总

在深度学习领域中,图像分类,目标检测和目标分割是三个相对来说较为基础的任务了。再加上图像生成(GAN,VAE,扩散模型),keypoints关键点检测等等,基本上涵盖了图像领域大部分场景了。 …