【C++】————类和对象(上)

 9efbcbc3d25747719da38c01b3fa9b4f.gif

                                                      作者主页:     作者主页

                                                      本篇博客专栏:C++

                                                      创作时间 :2024年6月21日

9efbcbc3d25747719da38c01b3fa9b4f.gif

一、类与对象的初步认识

1、类其实就是对对象的抽象,而对象就是对类的具体实例

类不占用内存,而对象占用内存。

2、面向对象与面向过程

C语言是面向过程的,关注的是过程中的数据与方法。

C++是面向对象的,关注的是对象’的属性与功能。

在C语言中不能再结构体中包含函数,但是在C++中却可以。

struct student
{char _name[20];int _age;void SetStudentInfo(const char *name, int age){strcpy(_name, name);_age = age;}
};

其实这里的结构体就是类,C++中兼容C语言中结构体用法,同时增加了类的用法

其实和C语言最大的区别就在于: C语言中struct只可以定义变量,C++中的struct既可以定义变量,也可以定义函数(实现方法)。

二、类的定义

其实在我们实际的开发中呢,我们不会去使用struct去定义类,而是使用class,下面我们来看一下它的用法。

class className
{//类体:由成员函数和成员变量组成
}; //一定要注意后面的分号

这里的class就是定义类的关键字,classname就是这个类的名字。

注意:类的成员函数默认是内联(即是内联函数)的。

类的两种定义方式:

1、类和声明都放在类体中:

class Person
{
public://显示基本信息void showInfo(){cout << _name << "-" << _age << endl;}
public:char* _name;int _age;
};

2、类的声明放在.h文件中,类放在.cpp中

声明放在类的头文件person.h中
class Person
{
public://显示基本信息void showInfo();
public:char* _name;int _age;
};

三、类的访问限定符及封装

C++的三大特性就是:封装、继承、多态,我们在这里先只说一下这个封装。

要想了解封装,首先我们要知道它的概念:将数据和操作数据进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。我相信大家看到这里也是一脸懵,我给大家举个例子:博物馆是如何管理的呢?如果不采取措施,文物将被损坏。所以我们就建立了一个博物馆,把文物都封装起来,不让人们看。但是我们开放了购票机制,可以买票突破封装进去参观。这就和类一样,我们使用类数据和方法都封装到一下。不想给别人看到的,我们使用protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质是一种管理。
 

这里我们就要提到三个访问限定符:

访问限定符说明:

  1. public:public是公有操作符,听他的名字就知道,都可以去访问,所以public修饰的成员可以在类外直接访问。
  2. protected和private修饰的不可以在类外直接被访问(此处的两者作用相同)
  3. 访问权限是从改访问限定符出现到下一个访问限定符出现为止
  4. 在class中,默认的访问权限是private,struct中是public,这也是这两者的区别

注意访问限定符只在编译时有用,当数据映射到内存后,没有任何限定符之间的区别。

四、类的实例化

用类类型创建对象的过程,称为类的实例化

  1. 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
  2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
  3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。

四、类的大小

一个类中既包含了成员函数,又包含了成员变量,那么一个类的实例化对象中包含了什么?怎么计算一个类的大小?

只保存成员变量,成员函数存放在公共的代码段,通过指针的方式来找到成员函数。当然这里也遵循内存对齐原则。

class A1 {//占四个字节
public:void f1() {}
private:int _a;
};// 类中仅有成员函数
class A2 {//占一个字节
public:void f2() {}
};class A3
{};

空类的大小:空类占1个字节,占位用,告诉系统我这里定义了一个类,虽然它是空的。

结论:一个类的大小,实际就是该类中”成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。

不清楚内存对齐原则的,可以去看一下这篇文章:内存对齐原则

五、this指针

首先我们看一下这串代码:

class Date
{
public:void Display(){cout << _year << "-" << _month << "-" << _day << endl;}void SetDate(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year; // 年int _month; // 月int _day; // 日
};
int main()
{Date d1, d2;d1.SetDate(2022, 5, 11);d2.SetDate(2022, 5, 12);d1.Display();d2.Display();return 0;
}

运行之后结果是这样的:

我们可以通过汇编来看一下:

我们可以发现,最终打印的时候调用的Display()是同一个函数, 那么既然d1,d2调用的都是同一个函数,编译器如何知道d1是2022-5-11,d2是2022-5-12呢?Display()都访问的_year,_month,_day。而且去公共代码区访问的Display(),这是为什么呢?

这是因为C++在这段代码中做出手脚,C++在这里增加了一个this指针,这里是因为Display会增加一个this形参。C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成

在调用的时候也传的是各自的地址。这样就十分清晰明了了。这就是隐含的this指针

在实际中,this指针是被const修饰的,指针本身不能被修改,但是内容可以被修改

 this指针的特性总结:

1. this指针的类型:类类型* const。
2. 只能在“成员函数”的内部使用。
3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。

最后:

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.一个冷知识:
屏蔽力是一个人最顶级的能力,任何消耗你的人和事,多看一眼都是你的不对。

2.你不用变得很外向,内向挺好的,但需要你发言的时候,一定要勇敢。
正所谓:君子可内敛不可懦弱,面不公可起而论之。

3.成年人的世界,只筛选,不教育。

4.自律不是6点起床,7点准时学习,而是不管别人怎么说怎么看,你也会坚持去做,绝不打乱自己的节奏,是一种自我的恒心。

5.你开始炫耀自己,往往都是灾难的开始,就像老子在《道德经》里写到:光而不耀,静水流深。

最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!

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

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

相关文章

【03】从0到1构建AI生成思维导图应用 -- Agent 搭建

【03】从0到1构建AI生成思维导图应用 – Agent 搭建 大家好&#xff01;最近自己做了一个完全免费的AI生成思维导图的网站&#xff0c;支持下载&#xff0c;编辑和对接微信公众号&#xff0c;可以在这里体验&#xff1a;https://lt2mind.zeabur.app/ 上一章&#xff1a;https…

备忘录标签怎么弄 备忘录标签设置方法

在繁忙的生活中&#xff0c;我们常常需要记录各种琐事、工作任务和灵感闪现。备忘录成了我们不可或缺的助手&#xff0c;但随着时间的推移&#xff0c;备忘录里的内容越来越多&#xff0c;如何高效地管理和查找这些信息成了一个大问题。这时&#xff0c;备忘录的标签功能就显得…

vxe-vxeTable使用vxe-colgroup分组合并表头,基础上合并

1.例 vxe-colgroup分组完成&#xff0c;需要实现两个合并合并成一行 基础合并完成 2.实现思路 由于表头字段固定&#xff0c;在进行vxe-colgroup分组合并&#xff0c;实现基础的表头合并&#xff1b;组件库官网对于表头合并并没有方法&#xff1b; 1.官网API知可以给对应的表…

新能源电燃灶:变革与优势

在当今社会&#xff0c;能源问题日益凸显&#xff0c;能源危机成为了全球关注的焦点。而在厨房领域&#xff0c;一种名为新能源电燃灶的产品正逐渐走进人们的视野&#xff0c;以华火电燃灶为例&#xff0c;它展现出了令人瞩目的特点和潜力。 随着传统能源的逐渐枯竭和环境压力的…

智芯开发板----环境配置

一、软件准备 Keil IDE/ IAR IdeSupport_Install_Package已经上传到资源中自行下载即可。 二、IAR环境配置 1.首先将IdeSupport_Install_Package内的IAR文件复制到你的IAR安装路径中如图所示&#xff1a; 2.按如图所示的路径进行复制即可 3.以记事本的方式打开这个xml文件…

零基础STM32单片机编程入门(四)ADC详解及实战含源码视频

文章目录 一.概要二.STM32F103C8T6单片机ADC外设特点三.STM32单片机ADC内部结构图1.ADC相关引脚说明2.ADC通道分类3.触发源4.转换周期5.电压转换计算6.更精确电压转换计算 四.规则通道ADC采集信号流向1.单次转换模式2.连续转换模式 五.CubeMX配置一个ADC采集例程六.CubeMX工程源…

大厂程序员上班猝死成常态?

大家好&#xff0c;我是瑶琴呀&#xff0c;拥有一头黑长直秀发的女程序员。 近日&#xff0c;连续看到大厂程序员猝死、低血糖晕倒的新闻&#xff0c;同为程序员感到很难受。互联网加班成常态这是既定事实&#xff0c;尤其在这个内卷严重、经济不景气的环境中&#xff0c;加班…

【漏洞复现】电信网关配置管理系统——命令执行

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 电信网关配置管理系统是一个用于管理和配置电信网关设备的软件系…

高性能Web服务器-Nginx的常用模块

文章目录 Nginx安装Nginx平滑升级与回滚平滑升级流程第1步&#xff0c;下载新版本第2步&#xff0c;编译第3步&#xff0c;执行make第4步&#xff0c;对比新旧版本第5步&#xff0c;备份旧nginx二进制文件第6步&#xff0c;模拟用户正在访问nginx第7步&#xff0c;替换旧的ngin…

【资源】太绝了!整整16本Python必看书籍详细讲解,适合零基础小白,高清电子版PDF开放下载,带你从入门到入土~

小编为初学Python的朋友们汇总了16本零基础入门书籍&#xff0c;包括Python三剑客等&#xff0c;都是在编程届多年畅销的书籍&#xff0c;也是众多从业者的选择&#xff0c;全文详细介绍了书籍主要内容&#xff0c;有需要的宝子根据自身情况自取 【教程领取方式在文末&#xff…

基于weixin小程序农场驿站系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;农场资讯管理&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;用户分享管理&#xff0c;分享类型管理&#xff0c;商品信息管理&#xff0c;商品类型管理 开发系统&#xff1a;Windows 架构模式…

「性能指标」CPU飙高排查实战

上篇提到了什么是 CPU 以及如何计算的。接下来主要说说实际工作中遇到 CPU 飙高如何去排查呢&#xff1f; 往期回顾&#xff1a; 聊聊性能指标 CPU 利用率如何计算的&#xff1f; 问题发现 前段时间我们新上线了一个应用&#xff0c;由于流量一直不大&#xff0c;集群的每秒…

力扣 单链表元素删除解析及高频面试题

目录 删除元素的万能方法 构造虚拟头结点来应对删除链表头结点的情况 一、203.移除链表元素 题目 题解 二、19.删除链表中倒数第K个节点 题目 题解 三、 83.删除某个升序链表中的重复元素&#xff0c;使重复的元素都只出现一次 题目 题解 82.删除某个升序链表中的…

2023年第十四届蓝桥杯JavaB组省赛真题及全部解析(下)

承接上文&#xff1a;2023年第十四届蓝桥杯JavaB组省赛真题及全部解析&#xff08;下&#xff09;。 目录 七、试题 G&#xff1a;买二赠一 八、试题 H&#xff1a;合并石子 九、试题 I&#xff1a;最大开支 十、试题 J&#xff1a;魔法阵 题目来自&#xff1a;蓝桥杯官网…

【星海随笔】vue+vite

开头问一个问题&#xff0c;我发现有的人粉丝是点赞数的好几倍&#xff0c;可能和必须关注他才能阅读他的文章有关。 所以问一下怎么设置为关注才能查看该文章。 screen -ls #查看 id 列表 screen -S <session_name> # 创建一个会话 screen -R <session_id> # 根据…

iconfont-阿里巴巴矢量图标库 在vue项目使用记录

官网地址&#xff1a;https://www.iconfont.cn/manage/index?manage_typemyprojects&projectId4539761 第一步&#xff1a; 下载资源 ->解压到项目文件夹 第二步 在项目中main.ts 或者main.js 引入资源 import //assets/iconfont/font/iconfont.js; import //assets…

IBM Spectrum LSF RTM,针对 IBM Spectrum LSF 环境的高级报告、跟踪和监控工具

亮点 为 IBM Spectrum LSF 环境提供性能监控和报告 监控 FlexNet Publisher 和 Reprisebased 许可证的使用&#xff0c;提供详细和总结性报告 通过多个级别&#xff08;包括应用程序和组织&#xff09;的报告来监控共享存储的利用率 提供强大的生产力工具&#xff0c;包括操…

JVM专题五:类加载器与双亲委派机制

通过上一篇Java的类加载机制相信大家已经搞明白了整个类加载从触发时机&#xff0c;接着我们就来看下类加载器&#xff0c;因为类加载机制是有加载器实现的。 类加载器的分类 启动类加载器 Bootstrap ClassLoader 是 Java 虚拟机&#xff08;JVM&#xff09;的一部分&#x…

斜光测距的原理及python实现

1.前言 最近做了一个基于opencv的斜光测距的小项目&#xff0c;东西不多&#xff0c;但是很有意思&#xff0c;值得拿出来学一学。项目里面需要比较精确的定位功能&#xff0c;将前人matlab代码移植到python上&#xff0c;并且做了一些优化&#xff0c;简化逻辑(毕竟我是专业的…

我教会了我妈搭建自己的 AI 聊天机器人...

在这个人工智能爆发的年代,ChatGPT、Claude、Kimi、文心一言等 AI 大模型产品火遍全网,仿佛一夜之间,人人都在谈论 AI。 作为普通人的我们,难道就只能看着程序员们尽情玩耍,自己却无法参与其中吗?NO! 鉴于最近自己社群学员和粉丝的要求&#xff0c;一进来大家无论是不是小白…