【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,一经查实,立即删除!

相关文章

无人机行业市场发展现状及前景

无人机行业市场发展现状及前景分析如下&#xff1a; 一、无人机行业市场发展现状 企业数量与规模&#xff1a; 截至2024年03月&#xff0c;全国无人机相关企业数量达到8628家&#xff0c;显示出无人机行业的蓬勃发展态势。全国实名注册的民用无人机已达104.9万架&#xff0c;…

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

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

Redis--注册中心集群 Cluster 集群-单服务器

与“多服务器集群”一致需要创建redis配置模板 参照以下链接 CSDN 创建redis容器 node01服务器上创建容器 docker run -d --name redis-6381 --net host --privilegedtrue \ -v /soft/redis-cluster/6381/conf/redis.conf:/etc/redis/redis.conf \ -v /soft/redis-cluster/6…

將IP地址改成自動獲取的詳細步驟

IP地址是設備在網路中的唯一標識&#xff0c;就像你家的門牌號一樣。每個連接到互聯網的設備都需要一個IP地址&#xff0c;以便進行數據通信。自動獲取IP地址&#xff0c;通常是指通過DHCP伺服器自動分配IP地址。這樣做的好處是&#xff0c;用戶無需手動配置IP地址&#xff0c;…

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

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

蜘蛛池规矩采集优化与运用技巧 什么是蜘蛛池/SEO蜘蛛池怎么养?(蜘蛛池新手入门虚良SEO)

作为一名网络内容修改&#xff0c;我常常需求从各种网站上收集文章并转载到咱们的网站上。而在这个过程中&#xff0c;我深深感受到了蜘蛛池对我的帮助。今日&#xff0c;我就来共享一下我对蜘蛛池收集规矩的亲自感受。 归纳 本文将分9个方面具体介绍蜘蛛池收集规矩的长处和运…

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

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

Linux内核 -- ARMv7 与 ARMv8 中的 asmlinkage 作用及使用

ARMv7 与 ARMv8 中的 asmlinkage 作用及使用 asmlinkage 是一个宏&#xff0c;通常在内核代码中使用&#xff0c;用于定义调用约定&#xff0c;特别是指定函数的参数是通过栈传递而不是通过寄存器。它主要用于内核与汇编之间的接口函数&#xff0c;使得参数传递更加一致和明确…

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

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

Python项目-微信消息自动回复【附源码】

微信消息自动回复 本项目旨在使用Python与Windows GUI自动化工具来自动化微信的操作&#xff0c;作用为读取未读消息、根据关键词回复消息。以下是对代码的详细解释&#xff08;文章后面会附有本项目的完整源码&#xff09;&#xff1a; 导入库: pandas 和 numpy&#xff1a;…

《每天5分钟用Flask搭建一个管理系统》第4章:模板渲染

第4章&#xff1a;模板渲染 4.1 模板的概念和使用 模板是一种用于生成输出的方法&#xff0c;它允许您将Python代码和HTML标记混合在一起&#xff0c;从而创建动态网页。 示例代码&#xff1a;基本模板 <!-- templates/home.html --> <!DOCTYPE html> <html…

康养实训室:在康养人才培养中的作用

随着社会经济的发展和人口老龄化的加剧&#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工程源…

CST电磁仿真计算平台服务器配置

在计算过程中&#xff0c;通常使用全波精确算法和高频近似方法。全波精确算法采用差分或有限元等方法进行求解&#xff0c;而高频近似方法则采用多层快速多极子&#xff08;MLFMA&#xff09;和快速多极子&#xff08;FMM&#xff09;等方法进行求解。此外&#xff0c;还可以使…

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

大家好&#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…

关于前端form提交后端返回文件流触发浏览器下载

这种浏览器自行下载文件的方式&#xff0c;虽然不能在js中了解下载进度&#xff0c;但没有文件大小限制&#xff0c;让浏览器自行保存在默认下载位置&#xff0c;全程省心。 不过有个小坑要提醒注意下&#xff0c;form标记中如果没有带有target“_blank”&#xff0c;那么会在当…