【c++初阶】类与对象(上)

请添加图片描述

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

🍑面向过程与面向对象

🍍面向过程

以前我们学过C语言,C语言就是一门面向过程的语言关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

面向过程的语言,也称为结构化程序设计语言。在面向过程程序设计中,问题被看作一系列需要完成的任务,函数则用于完成这些任务,解决问题的焦点集中于函数。

面向过程语言的优点:
(1)语法结构简单,代码结构非常清晰,易于理解。
(2)由于没有额外的封装和继承开销,执行效率高。
(3)适合功能相对简单规模小的项目。

面向过程最大的缺点:相信大家都清楚,就是需要我们自己去写函数来实现我们所需要的功能,而C语言库中只提供少量的接口来实现这些函数的。比如我们以前所写的程序如:猜数字、多子琪、扫雷、通讯录等等,都需要我们写大量的函数接口,来实现我们所要的功能。

🍍面向对象

如今我们所学习的C++就是面向对象的语言,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完
成。

面向对象的语言是一类以对象作为基本程序结构单位的程序设计语言。每个对象都有自己的有其它对象所构成的存储,并且有其类型。

面向对象语言的优点:
(1)库中提供了大量的库函数,简洁了代码。

(2)易于维护和扩展:数据和操作都封装在对象中,每个对象只负责自己的状态和行为。当需要添加新功能时,只需要在某个对象里修改就行了

(3)支持模块化开发:面向对象中支持通过类和接口等机制,模块化开发。C++的几个库为我们提供了大量的函数接口。
面向对象语言的缺点:
(1)知识点多且杂:面向对象涉及的概念和原则相对较多,包括对象、类、继承、封装、多态等等。

(2)代码复杂性:随着面向对象系统的规模和复杂性的增加,代码可能会变得难以理解和维护。过度使用继承、接口和复杂的类结构可能导致代码冗余和混乱。此外,设计模式的使用也可能增加代码的复杂性。

🍍两者的区别

面向过程和面向对象的缺点和优点,我主要列举了大家易于理解的一部分,如果对这方面还想深入了解的可以去查阅相关资料。现实生活中每种语言都有适合它的场景。

我给大家举一个通俗易懂的列子:大家平常都会用洗衣机洗衣服吧,洗衣机洗衣服大致分为:人将衣服放进洗衣机,倒入洗衣粉,启动洗衣机,拿出衣服进行晒干。
面向过程就是只关注过程,就是用了哪几步完成的。
这里面有四个对象:人,洗衣机,洗衣粉,衣服,面向对象就是关注这几个对象是怎么进行交互的,也就是怎么联系的。生活中面向对象我们就是人和电脑进行交互,成为人机交互。

🍑类的引入

上面我已经提到了C++中有类的概念。

类其实就是我们在C语言中提到过的结构体,只是在C++中是称为类,功能也有所区别。

C语言中的类:

在这里插入图片描述
相信大家都认识这两个结构体,第一个结构体就是普通的结构体,在定义时只能用它本身的名字定义,也就是Date,而在有时间结构体名字过长时就很不方便,这样就延伸了第二种结构体写法。如图中在第二种写法中,Da就可以代替Date来定义,这样就很方便。

在这里插入图片描述

C++中的类:

在这里插入图片描述

大家从图中应该可以看出在C++中更喜欢用class来代替struct来定义类。

C++中可以直接在类的后面写变量的名字,这就是已经定义好了的类。功能和普通定义的没有太大的区别,只不过不常用。

从图中就可以明显的看出两者的区别,C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。类中private和public大家暂时不用管,待会会有解释。

🍑类的定义

在这里插入图片描述
刚才在上面也讲了类的定义

类在面向对象编程中起到了描述一类对象的共同特征和行为的模板作用,是实现代码重用、提高软件可维护性和可扩展性的重要工具。

class为定义类的关键字,Date为类的名字,{}中为类的主体。类体中内容称为类的成员:类中的变量称为类的属性或成员变量,类中的函数称为类的方法或者成员函数。

当然前面说了,在类中可以定义变量和函数,有部分人就会问可不可以定义与声明分离,在这里当然是可以的。只不过写法有些特殊,可以看下图:

在这里插入图片描述

在这里插入图片描述

C++中在类中声明和定义分离时,写函数定义时必须标注是哪个类的,不然系统会分不清,导致报错。

🍑类的访问限定符和封装

🍍访问限定符

先前在类的定义时就用到了访问限定符就是private和public。总的访问限定符其实还有一个就是protected,
大家可以根据这三个单词的中文意思去理解它的作用。

private就是私有的意思,我们一般把类里面的变量放在private里面,这样在类外面就访问不到了。而public就是公有的意思,我们一般把函数放在公有里面,这样外面有时间需要访问就可以直接访问。protected大家可以先不用管,目前不常用,大家可以先去了解。

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

class的默认访问权限为private,struct为public(因为struct要兼容C)。

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

🍍封装

封装是C++的一个特性。

面向对象总共有三个特性:封装、继承、多态。

在类和对象阶段,主要是研究类的封装特性。

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来
和对象进行交互。封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

🍑类的作用域

类的作用域和上面我们所讲的在类中函数声明和定义分离时,需要强调是在哪个类中,是同样的意思。

在这里插入图片描述

🍑类对象模型

🍍类对象的大小

在这里插入图片描述
大家可以先猜猜图中类实际大小是多少?

在这里插入图片描述
结果是12。

多看几个举例:

在这里插入图片描述

在这里插入图片描述
大家应该可以看出是怎么计算类的大小的了吧,这和C语言中结构体内存对齐算法是一样的,在类中同样只计算变量的大小,不管函数。

结构体内存对齐规则

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

大家可以在2仔细看看这个规则。

还有一个特殊的形式,就是空类的形式,根据对齐规则,空类大小应该是0,然而不是:

在这里插入图片描述

即使是空类,也会在内存中占空间

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

🍍类对象存储规则

类对象的存储规则其实是一个相当深入的主题,它涉及到计算机内存管理、编程语言的具体实现等多个方面。在大多数面向对象的编程语言中,类对象的存储通常遵循一些基本的规则。

首先,类本身通常不直接占用内存空间,而是作为一种模板或蓝图存在。它定义了对象的属性和方法,但并不直接存储具体的数据。

当创建类的一个对象时,这个对象会在内存中分配一定的空间来存储其属性。这些属性可以是基本数据类型(如整数、浮点数、字符等),也可以是其他对象或类的实例。这些属性在内存中的布局通常遵循一定的对齐原则,以确保数据的正确访问和效率。

除了属性之外,对象还可能包含指向其所属类的引用的指针。这个指针用于在运行时动态地确定对象的行为,例如调用哪个方法。

值得注意的是,类的静态成员(包括静态属性和静态方法)在内存中的存储方式与普通的对象属性不同。静态成员属于类本身,而不是类的任何特定实例。因此,它们通常存储在类的元数据区域,而不是与每个对象分开存储。这意味着所有的对象实例都可以共享和访问这些静态成员。

此外,不同的编程语言或平台可能会有自己的特定规则和优化策略来管理对象的存储。例如,一些语言可能会使用垃圾回收机制来自动管理不再使用的对象的内存,以防止内存泄漏。

🍑this指针

🍍this指针的由来

我用一个函数来举例:

在这里插入图片描述

在这里插入图片描述

在实现过程中函数Print()我是没有传任何参数过去的,但是它是怎么打印输出的呢?

这就要提到我们的this 指针了,这就C++中特有的一个隐藏指针。

C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏
的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”
的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编
译器自动完成。

实际上:

在这里插入图片描述

🍍this指针特性

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

请添加图片描述
请添加图片描述

  • 102
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 47
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悦心无谓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值