【C++打怪之路Lv3】-- 类和对象(上)

news/2024/5/20 13:57:14

🌈 个人主页:白子寰
🔥 分类专栏:C++打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~) 

 

目录

面向对象和面向过程的认识

类的引入(以下以Stack为例)

 类的介绍

类的第一种定义方法

类的第二种定义方法:类的作用域

 成员变量命名规则

建议①

建议②

类的访问限定符

访问限定符的介绍

 封装

类的实例化

概念

 理解类的实例化(含图片和代码)

 类对象模型

计算类对象大小

结构体内存对齐

 this指针

this指针的引入

 this指针的特性

C语言和C++实现Stack的对比

C语言

C++ 


 

面向对象和面向过程的认识

C语言面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

那什么是过程?什么是对象呢?

我们在生活中举例子:比如我要去烧一壶开水

对象:我,热水壶,水,排插/插座,热水壶托盘

过程:把水接到水壶里 --> 关闭水壶盖 --> 把热水壶放到托盘中 --> 连接好插排/插座 --> 按下热水壶开关 --> 静等几分钟 -->一壶水烧开了



 

类的引入(以下以Stack为例)

在C语言中,我们学过结构体,但在C语言的结构体当中,只能由成员变量组成,回顾一下怎么用C语言实现(Stack)栈的呢?


然而在C++当中,结构体里不仅可以定义成员变量,还可以定义成员函数,那就是“类” 


 类的介绍

在C++当中,喜欢把struct写成class(类),什么是类?

class ClassName
{//由 成员变量 和 成员函数 来组成
};

注:1、class和struct相似,   2、ClassName是类的名称,

       3、名称后需跟中括号{},4、右中括号后还有分号 ( ; )


 那么在C++当中关于栈的类是怎么定义的呢?

类的第一种定义方法

在class(类)中声明和定义成员变量和成员函数(可以在class中具体实现成员函数)

注:(成员函数如果放在类体中,编译器可能会当成内联函数处理)

(关于访问权限我们在后续中会讲到,这里先做铺垫)


 

类的第二种定义方法:类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。

在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。

在class(类)中定义成员变量和定义成员函数,

在.cpp文件中声明成员函数  (也就是通过类和作用域限定符指定实现Stack类中的某个函数)


 成员变量命名规则

建议①

成员变量用 _year 表示

建议②

成员变量用 前缀(m_year) 或者 后缀(例如:year_m)来表示


类的访问限定符

访问限定符的介绍

C++实现封装(文章下面会讲到)的方式:

用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

访问限定符包括:public(公有),protected(保护),private(私有)

注: 1、public修饰的成员在类外是直接可以访问的

        2、private修饰的成员在类外不能直接被访问(protect和private是类似的)

        3、访问权限作用域从访问权限开始到下一个访问权限出现结束

        4、 如访问没有限定符,那就到 } 结束

        5、class默认访问权限是private,struct默认访问权限是public(struct兼容C语言)



 

 封装

面向对象的三大特性:封装、继承、多态

在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?

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

封装本质上是一种管理,让用户更方便使用类

就像上面说的 面向对象和面向过程的认识 一样

烧一壶开水,我们只需关心把水装进水壶,再按下按钮就可以了

                              并不关心开水是怎么烧开的,它的内部用什么装置和线路组成的(封装)

用户只需要与厂家提供的按钮,热水壶等显而易见直接实现的外部装置之间进行交互

在C++语言中实现封装,

可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。



 

类的实例化

概念

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

类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,

定义出一个类并没有分配实际的内存空间来存储它

打个比方:

类实例化出对象就像现实中使用建筑设计图建造出房子,

类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在

同样类也只是一个设计实例化出的对象才能实际存储数据,占用物理空间

类  和  对象 是 一对多的关系

一个类可以有多个对象,比方类是设计图,对象是通过设计建出来的房子,

一个设计图可以设计建造出多个类似的房子


 

 理解类的实例化(含图片和代码)

 举例:Data日期类

class Data
{
public:void Init(int yaer, int month, int day){m_year = yaer;m_month = month;m_day = day;}private:int m_year; //年int m_month;//月int m_day;  //日
};int main()
{Data s1;		//定义(实例化)对象Data s2;		//定义(实例化)对象s1.Init(2024, 4, 25);s1.Init(2024, 4, 25);Data s3;		//定义(实例化)对象Data s4;		//定义(实例化)对象s1._yaer++;		//成员变量的权限为privates2._yaer++;return 0;
}



 

 类对象模型

计算类对象大小

(看下面Data类,类A、B、C)

class Data
{
public:void Init(int yaer, int month, int day){_year = yaer;_month = month;_day = day;}private:int _year;int _month;int _day;
};class A
{};class B
{
private:int a;char b;
};class C
{
public:void D(){}
};int main()
{Data d1;cout << sizeof(d1) << endl;cout << sizeof(A) << endl;cout << sizeof(B) << endl;cout << sizeof(C) << endl;
}

 怎么计算类对象的大小呢?(Data类,类A、B、C)它们的大小分别为多少?

一个类的大小,实际就是该类中”成员变量”之和

当然要注意内存对齐注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

控制台输出显示 

 


 

结构体内存对齐

详细讲解请看该篇文章:结构体超详细总结(含结构体内存对齐)icon-default.png?t=N7T8http://t.csdnimg.cn/YIAAr 


 


 this指针

this指针的引入

看一下前面提到的Data(日期类)

class Data
{
public:void Init(int yaer, int month, int day){_year = yaer;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{Data d1;Data d2;d1.Init(2024, 4, 27);d2.Init(2023, 4, 27);d1.Print();d2.Print();return 0;
}

 现有这样一个问题,

当d1调用Init成员函数时,该函数如何知道应该设置d1对象而不是设置d2对象呢?

C++中通过引入this指针解决该问题,

即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象)

函数体中所有“成员变量”的操作,都是通过该指针去访问

只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成

 this指针的特性

1、this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。

2、 只能在“成员函数”的内部使用

3、this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针

4、this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传

递,不需要用户传递


 

 d1和d2都调用该成员函数,但结果却不同的原因是

void Print() 函数再编译器编译是 void Print(Data* const this),有一个隐藏参数this指针

d1调用函数时,是这样子来访问的:

&d1->_year、&d1->_month、&d1->_day,

此时this指针就是d1的指针,&d1是实参,Data* this是形参(局部变量),访问的是d1的对象_year,_monh,_day

 



 

C语言和C++实现Stack的对比

C语言

共性

1、每个函数的第一个参数都是Stack*

2、函数中必须要对第一个参数检测,因为该参数可能会为NULL函数中都是通过Stack*参数操作栈的

3、调用时必须传递Stack结构体变量的地址

结构体中只能定义存放数据的结构,操作数据的方法不能放在结构体中,即数据和操作数据的方式是分离开的,而且实现上相当复杂一点,涉及到大量指针操作,稍不注意可能就会出错。


C++ 

C++中通过类可以将数据 以及 操作数据的方法进行完美结合

通过访问权限可以控制那些方法在类外可以被调用,即封装,在使用时就像使用自己的成员一样,更符合人类对一件事物的认知。

而且每个方法不需要传递Stack*的参数了,编译器编译之后该参数会自动还原,

即C++中 Stack * 参数是编译器维护的,C语言中需用用户自己维护。



 

 

 ***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“欲买桂花同载酒,终不似,少年游”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。


http://www.mrgr.cn/p/48234171

相关文章

Fastbin attackDouble free和Unsortbin leak的综合使用

Fastbin attack&&Double free和Unsortbin leak的综合使用✅ 今天做一个综合题目,包括利用Fastbin attack实现多指针指向一个地址,以及利用Unsortbin leak泄露libc基地址和修改__malloc_hook地址为one_gadget 题目是buuctf上面的一道题目,题目链接 https://buuoj.cn/…

C语言Linux vim shell命令

无论是在插入模式或者是其他模式下对于文件的修改都是对于内存缓冲区进行修改&#xff0c;只有当点击w进行保存以后才会将数据写入到一个新的文件中的&#xff0c;将源文件删除&#xff0c;并且新文件改为文件的名字 1. actionmotion dG删到文件尾 ggdG先到开头再删除到末尾…

Java中的接口

package day38; ​ public interface Test1 {void say();int add(int a,int b); ​ } ​ package day38; ​ public interface Test2 {void printhelllo();double add(double a,double b); } ​ package day38; ​ public class Implementall implements Test1,Test2 {Overri…

AJAX——案例

1.商品分类 需求&#xff1a;尽可能同时展示所有商品分类到页面上 步骤&#xff1a; 获取所有的一级分类数据遍历id&#xff0c;创建获取二级分类请求合并所有二级分类Promise对象等待同时成功后&#xff0c;渲染页面 index.html代码 <!DOCTYPE html> <html lang&qu…

Java web应用性能分析之【sysbench基准测试】

Java web应用性能分析之【CPU飙高分析之MySQL】-CSDN博客 Java web应用性能分析之【Linux服务器性能监控分析概叙】-CSDN博客 Java web应用性能分析概叙-CSDN博客 Java web应用性能分析之【基准测试】-CSDN博客 上面基本科普了一下基准测试&#xff0c;这里我们将从sysbench…

gpu机器没有开启ipv6

参考: https://blog.csdn.net/asdfaa/article/details/137884414检查系统是否支持 IPv6,查看被禁用了 在启用 IPv6 之前,首先要确保您的系统支持 IPv6。要检查内核是否启用了 IPv6,可以运行以下命令: cat /proc/sys/net/ipv6/conf/all/disable_ipv6 如果返回的结果为 0,…

TCP相关问题总结

文章目录 TCP连接建立过程1. TCP三次握手2. TCP四次挥手3. TCP为什么是三次握手4. TCP为什么是四次挥手 TCP流量控制TCP拥塞控制1. 为什么需要拥塞控制2. 控制手段 TCP连接建立过程中出现丢包 TCP连接建立过程 1. TCP三次握手 首先client端发出连接请求&#xff0c;并且请求同…

Git和Github绑定

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

11 c++版本的贪吃蛇

前言 呵呵 这大概是 大学里面的 c 贪吃蛇了吧 有一些 面向对象的理解, 但是不多 最近 因为想要 在单片机上面移植一下 贪吃蛇, 所以 重新拿出了一下 这份代码 然后 将它更新为 c 版本, 还是 用了一些时间 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用…

python库使用总结

python库的使用 1:print(补充)2:math 2.1:math库包括的4个数学常数2.2math库中的函数幂对数函数三角曲线函数3:字符串处理函数补充:sorted(str) 对字符串中的元素进行排序,返回排序后的列表,而不是字符串 ​ reversed(str) 对字符串中的元素反向输出 3.1 字符串…

python学习思维导图分享

python 本文包含了我的一些python学习的笔记和思维导图 第一部分:python基础导图下载链接 第二部分:函数及其他文件操作导图下载链接 第三部分:类及网络编程导图下载链接 第四部分:mysql导图下载链接

linux中如何挂载yum云仓库进行软件的安装

1.首先在根目录下建立文件&#xff0c;用来挂载镜像文件 [rootclient ~]# mkdir /rhel9 2.挂载镜像文件&#xff1a; [rootclient ~]# mount /dev/cdrom /rhel9 3.切换到 /etc/yum.repos.d 下的目录并查看 &#xff0c;创建 rhel9.repo文件&#xff0c;并编辑云仓库域名&am…

反爬虫方法

1.拒绝请求 a.根据 IP 判断 优点: 即时效果:一旦IP地址被封禁,来自该地址的流量将立即停止,从而防止了爬虫在封禁发生后进一步访问网站。 简单易行:IP封禁通常很容易实施,大多数服务器和CDN服务都提供了相应的工具来帮助封锁一系列的IP地址。 降低负载:通过封禁恶意或不…

计算机网络—— book

文章目录 一、概述1.1互联网的核心部分1&#xff0e;电路交换的主要特点2&#xff0e;分组交换的主要特点 1.2.计算机网络的性能1&#xff0e;速率2&#xff0e;带宽3&#xff0e;吞吐量4&#xff0e;时延5&#xff0e;利用率 1.3.计算机网络体系结构协议与划分层次具有五层协议…

简单理解盒子模型

1. 什么叫盒子模型 在html中大部分元素,特别是块元素display:block;都可以被看做一个盒子。网页布局就是一个一个盒子的平铺,堆叠,嵌套摆放。这么多的盒子放在一起,最重要的就是去关注他们的各种尺寸,边界等等,主要怕意料外的重叠一类导致的显示不正常。 2. W3C和IE盒子模…

物联网的基本功能及五大核心技术——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网基本功能 物联网的最基本功能特征是提供“无处不在的连接和在线服务”&#xff0c;其具备十大基本功能。 &#xff08;1&#xff09;在线监测&#xff1a;这是物联网最基本的功能&#xff0c;物联网业务一般以集中监测为主、控制为…

类和对象【三】析构函数和拷贝构造函数

文章目录 析构函数析构函数的定义析构函数的作用主要作用次要作用 析构函数的特点 拷贝构造函数拷贝构造函数的定义拷贝构造函数的作用主要作用次要作用 拷贝构造函数的特点浅拷贝和深拷贝浅拷贝深拷贝 拷贝构造函数的调用场景 析构函数 析构函数的定义 析构函数(destructor) …

js逆向实战之中国男子篮球职业联赛官方网站返回数据解密

url:https://www.cbaleague.com/data/#/teamMain?teamId=29124 分析过程看流量包,返回数据全是加密的字符串,要做的就是解密回显数据。由于这里的网址都比较特殊,里面都带有id号,所以通过url关键字去搜索不是一个很好的办法。看initiators,里面有很多异步传输。异步传输…

Linux应急响应小结

通过系统运行状态、安全设备告警,主机异常现象来发现可疑现象通常的可疑现象有:资源占用、异常登录、异常文件、异常连接、异常进程等。目录用户排查历史命令网络排查进程排查文件排查持久化排查日志分析 通过系统运行状态、安全设备告警,主机异常现象来发现可疑现象通常的可…