类和对象:

news2025/3/9 6:59:47

1. 类的定义:

1. 类定义格式:

对于我们的类的话,我们是把类看成一个整体,我们的函数里面没有找到我们的成员变量,我们就在我们的类里面找。 

我们看我们的第二点:

我们的类里面,我们通常会对我们的成员变量加上特殊的标识符,就比如我们的图里面的成员变量我们就在前面加上_。(但是这个并不是强制的)。

我们来看我们的第三点:

我们的第三点说的是我们的struct,我们的C++兼容我们的C语言的,所以我们的C语言的代码在C++里面也可以编译通过;

然后在我们的C++里面,我们使用class来定义类,但是我们的struct进入到了我们的C++里面,他也被升级成了类,这时候,我们的C语言的struct结构体和我们的C++struct定义的类就可以同时存在了。

我们看我们上面的图片,我们的第一个是struct结构体,我们对他进行typedef的函数里面,我们的next指针还是struct ListNodeC*next;但是到了我们的C++的时候,我们的struct已经被升级成类了,我们的struct定义的类的名字就可以代表我们的类,我们可以直接使用我们的类的名字来代表类,不需要typedef。

我们看下面的:

这个是我们之前做过的题目:我们的C++,我们在上面没有typedef,我们的下面的函数就直接使用ListNode了,因为这个是C++,这个struct已经被升级成了类,我们的类的名字可以直接代表我们的类。

我们再来看我们的第四点:

我们的第四点说,我们定义在类里面的函数会被自动的定义为内联inline函数,就比如我们图中的struct类里面定义的Init函数,但是他到底能不能成为真正的内联函数,还是要看编译器;

2. 访问限定符:

我们还是先看第一点:

我们的第一点说:C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限 选择性的将其接⼝提供给外部的⽤⼾使⽤。

我们再看第二点:

我们的第二点说:我们的访问限定符有三个:1. public。2. private。3. protected。

三个含义分别是:公共,私有,保护。

public修饰的成员在类外可以直接被访问;

protected和private修饰的成员在类外不能直接被访问,protected和private是⼀样的,以后继承章节才能体现出他们的区别。

我们再来看我们的第三点:

访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有 访问限定符,作⽤域就到}即类结束。

我们看着两张大的图片:在我们的类里面,我们的开始使用public来修饰,然后一直走,知道我们的下一个访问限定符出现为止。我们看我们的图片,这个也就是说明,我们的public到我们的private之间,都是公有的,就是我们在类外面可以直接进行调用的。 

然后我们继续看:

我们的这个private,后面没有访问限定符了,所以就一直到花括号类的结束。

也就是说:我们的public到private里面定义的是公有的,private到结束的类域的成员变量是私有的。

这时候你来看,我们从类的外部来访问我们的公有的Top函数,这就可以,但是我们访问我们的私有的top变量的时候,这就错了。

我们来看我们的第四点:

class定义成员没有被访问限定符修饰时默认为private,struct默认为public。

我们来看我们的这个class类,我们一开始没有设置访问限定符,这时候我们的开始到我们的第一个访问限定符public之间的话,都是私有的,因为我们的class类没有访问限定符的修饰的时候,他就是私有的。所以我们看我们的上面的代码:我们的Init就是私有的函数,然后我们的public到再下一个访问限定符这部分就是公有的。

class类是这样的,但是struct类的话,我们不写访问限定符的话,它默认就是公有的。

3. 类域:

我们的类域和namespace域是不会影响我们的生命周期;

我们先看我们的上面的图片:当我们的函数含有缺省值的时候,我们的缺省值只能在函数声明的时候给,不能在定义的时候给,

我们继续来看:当我们定义我们的函数的时候,我们使用我们的函数就必须加上Stack::,因为这个是我们类里面的成员函数,如果我们不加域作用限定符的时候,我们的编译器就会认为这是一个全局函数,我们的编译器就会去局部域,全局域里面去寻找,但是我们的编译器是不会主动的去namespace,或者类里面去寻找,这时候他在局部和全局域里面没找到,他就会报错。

我们这里有一个点:其实我们在上面已经说了,我们的类里面定义的函数,是内联函数,一些比较长的函数,我们就在类里面声明,比较短的函数,我们就在类里面直接定义,这些直接被定义的函数就是内联函数。

2. 实例化:

1. 类的实例化的概念:

我们的类和对象,之间是什么关系呢?

我们的类实例化出了对象;

我们的类就像是造房子的图纸,我们的对象就是建造的房子;

2. 对象大小:

那我们的对象的大小是多少呢?

这个就是我们的一个类,我们使用它实例化出一个对象,我们求一下这个对象的大小。

首先我们看我们的三个成员变量,三个数据合起来是12个字节(内存对其规则)

然后还有我们的成员函数,我们先来看一下最终的结果是多少?

我们这里就发现,我们这个对象最终的大小就是12,这是啥意思,我们就没有算成员函数的大小,我们只计算成员变量的大小。

那我们来看一下这个是咋回事:

我们看一下我们的对象的存储方式:我们这里有两种存储的方式:

第一种:我们把对象的成员变量和成员函数都存起来,(我们存储成员函数的话,一定存储的是成员函数的指针,因为我们的成员函数的代码很多,我们不可能把他全存进去。)

我们的另外的一种方法是不存;

因为我们的每个对象的成员变量是不一样的,但是每个对象的成员函数调用的都是一样的。

我们的对象是不会存储我们的成员函数的,我们只会存储成员变量,然后我们的成员函数存储到公共的代码区域。

我们在这里找几个题目练习一下:

我们看我们的这个对象的大小:我们不管成员函数的大小,我们就看一下成员变量的大小,判断一下内存对齐,最终的结果就是8个字节;

我们再来判断一下这个B和C对象的大小:

这时候里面的成员变量一个都没有,成员函数的话,这就不算,所以这时候他的大小是多少呢?

我们可以看见,虽然它里面的话,什么东西都没有,但是他的大小为1,这里的这个1纯粹就是为了占位置用的。

我们的这个1就是为了表示这个对象存在过。

3. this指针:

我们先来看一下我们的这个:

我们看我们的这两个对象调用的是同一个函数,然后我们看我们的函数,但是为什么他打印出来的数据是一样的呢?

其实,在我们的成员函数里面,我们的函数其实都会加上一个参数,this指针。

我们看我们的成员函数,我们的Init函数看着有三个参数,其实有4个参数,我们的形参的开头实际上有一个this指针,我们的Print函数,看起来没有参数,实际上是有一个参数的。

我们的函数,其实是会把d1,和d2的地址传过去的,然后this指针来接收,然后this指针进行解引用得到我们的对象d1里面的year,month,day。

但是我们的这里,编译器是不允许你显示的把地址传过去,也不能显示的展出this指针,这是不允许的。

补充:

我们补充一下知识点:

我们看我们的下面的图片:

我们的第一个const修饰的是我们的p1指针指向的数据,这个数据是不能改变的。

然后我们的第二个,这个const修饰的我们的指针本身,也就是说我们的指针的指向不能改变。

我们的指针的指向不能改变,那我们的这个指针一开始就必须要进行初始化。

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

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

相关文章

【十三】Golang 通道

💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 通道通道声明初始化缓冲机制无缓冲通道代码示例 带…

软考中级_【软件设计师】知识点之【面向对象】

简介: 软件设计师考试中,面向对象模块为核心考点,涵盖类与对象、继承、封装、多态等基础概念,重点考查UML建模(类图/时序图/用例图)、设计模式(如工厂、单例模式)及SOLID设计原则。要…

分布式锁—7.Curator的分布式锁一

大纲 1.Curator的可重入锁的源码 2.Curator的非可重入锁的源码 3.Curator的可重入读写锁的源码 4.Curator的MultiLock源码 5.Curator的Semaphore源码 1.Curator的可重入锁的源码 (1)InterProcessMutex获取分布式锁 (2)InterProcessMutex的初始化 (3)InterProcessMutex.…

《UE5_C++多人TPS完整教程》学习笔记35 ——《P36 武器类(Weapon Class)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P36 武器类(Weapon Class)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer, Author) Stephen …

[密码学实战]Java实现国密TLSv1.3单向认证

一、代码运行结果 1.1 运行环境 1.2 运行结果 1.3 项目架构 二、TLS 协议基础与国密背景 2.1 TLS 协议的核心作用 TLS(Transport Layer Security) 是保障网络通信安全的加密协议,位于 TCP/IP 协议栈的应用层和传输层之间,提供: • 数据机密性:通过对称加密算法(如 AE…

最小栈 _ _

一:题目 二:思路 解释:一个栈名为st,其用来正常的出入栈,一个栈名为minst,其的栈顶元素一定是最小的元素 入栈:第一个元素,两个栈一起入,后面再入栈,只有入栈…

HTTPS加密原理详解

目录 HTTPS是什么 加密是什么 HTTPS的工作流程 1.使用对称加密 2.引入非对称加密 3.引入证书机制 客户端验证证书真伪的过程 签名的加密流程 整体工作流程 总结 HTTPS是什么 HTTPS协议也是一个应用程协议,是在HTTP的基础上加入了一个加密层,由…

黑金风格人像静物户外旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 针对人像、静物以及户外旅拍照片,运用 Lightroom 软件进行风格化调色工作。旨在通过软件中的多种工具,如基本参数调整、HSL(色相、饱和度、明亮度)调整、曲线工具等改变照片原本的色彩、明度、对比度等属性,将…

安装pyqt6出现的问题

安装PyQt6报错: PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: C:\\Users\\xyj19\\AppData\\Local\\Temp\\tmp3xfmekh7 [end of output] note: This error originates from a subprocess, and is likely not a pr…

java调用c++

VScode 配置java 并且使用JNA调用c 动态库 安装 Java 开发环境 ​ 安装 JDK官网直接下载就好,推荐镜像下载 通过网盘分享的文件:jdk-8u144-windows-x64.exe​ 链接: https://pan.baidu.com/s/1Ov9bJkPNnOgcliBL-PSTFQ?pwdpg43 提取码: pg43 ​ 直接安…

gitlab+jenkins+harbor+k8s安装操作流程之Jenkins

准备环境 一台centos7系统 4C/8G/100G 如果是jenkins2.5以上版本需要centos8以上版本 JDK1.8编译安装(最新版本jdk需要18以上) MAVEN编译安装 GIT编译安装 JDK1.8步骤 tar -zxvf 解压 vim /etc/profile export JAVA_HOME/data/jdk1.8.0_111 export JRE_HOME$JAVA…

【机械视觉】C#+VisionPro联合编程———【三、加载CogToolBlock工具详解,以及实例】

【机械视觉】C#VisionPro联合编程———【三、加载CogToolBlock工具详解,以及实例】 在VisionPro中,CogToolBlock 是一种容器工具,可以将多个视觉工具(如CogBlob、CogPMAlign等)组合成一个可复用的流程。通过C#与Visi…

启动wsl里的Ubuntu24报错:当前计算机配置不支持 WSL2,HCS_E_HYPERV_NOT_INSTALLED

问题:启动wsl里的Ubuntu24报错 报错信息: 当前计算机配置不支持 WSL2。 请启用“虚拟机平台”可选组件,并确保在 BIOS 中启用虚拟化。 通过运行以下命令启用“虚拟机平台”: wsl.exe --install --no-distribution 有关信息,请访…

信息安全与网络安全的区别_信息安全与网络安全之差异探析

在当今数字化时代,信息安全与网络安全成为了人们关注的热点话题。尽管这两个概念经常被提及,但它们之间存在着明显的区别。本文旨在探讨信息安全与网络安全的定义、范畴及应对策略,以帮助读者更好地理解和应对相关挑战。 一、定义与范畴的差…

充电桩快速搭建springcloud(微服务)+前后端分离(vue),客户端实现微信小程序+ios+app使用uniapp(一处编写,处处编译)

充电桩管理系统是专为中小型充电桩运营商、企业和个人开发者设计的一套高效、灵活的管理平台。系统基于Spring Cloud微服务架构开发,采用模块化设计,支持单机部署与集群部署,能够根据业务需求动态扩展。系统前端使用uniapp框架,可…

设计AI芯片架构的入门 研究生入行数字芯片设计、验证的项目 opentitan

前言 这几年芯片设计行业在国内像坐过山车。时而高亢,时而低潮。最近又因为AI的热潮开始high起来。到底芯片行业的规律是如何? 我谈谈自己观点:芯片设计是“劳动密集型”行业。 “EDA和工具高度标准化和代工厂的工艺标准化之后,芯…

串口助手的C#编写以及有人串口服务器USR-DR301的使用

本文介绍C#编写串口程序的要点,串口服务器USR-DR301(RS232转TCP)的使用、以及调试过程中碰到的两个问题: 1). 调用串口报“连到系统上的设备没有发挥作用”. 2). “所有文本框都变成了透明”的异常处理 代码见:https://download.csdn.net/download/qq_34047402/9046713…

Android中AIDL和HIDL的区别

在Android中,AIDL(Android Interface Definition Language) 和 HIDL(HAL Interface Definition Language) 是两种用于定义跨进程通信接口的语言。AIDL 是 Android 系统最早支持的 IPC(进程间通信&#xff0…

sqlserver删除表记录语句,及删除表时清零ID的SQL语句

sqlserver中,删除表中所有记录的语句如下 Delete from tableName 例,删除表logs的所有记录 sqlserver,删除表中所有数据,标识列ID归零,保留表结构的语句 truncate table tableName 例,删除表logs的所…

【瞎折腾/ragflow】构建docker镜像并部署使用ragflow

说在前面 操作系统:win11docker desktop版本:4.29.0docker engin版本:v26.0.0ragflow版本:nightly 安装docker 官网 如果是win11,backend建议使用wsl2 安装好后打开docker desktop,不然docker命令用不了 …