IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++类和对象(上) -> 正文阅读

[C++知识库]C++类和对象(上)

1、面向过程和面向对象初步认识

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

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

例如我们写一个五子棋的游戏,面向过程的编程思想是这样的:

1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。

而面向对象的编程思想是这样的:

(1)黑白双方,这两方的行为是一样的。

(2)棋盘系统,负责绘制画面

(3)规则系统,负责判定犯规、输赢等。

然后赋予每个对象一些属性和行为:

(4)第一类对象(黑白双方)负责接受用户输入,并告知第二类对象(棋盘系统)棋子布局的变化,棋盘系统接收到了棋子的变化,并负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

面向对象和面向过程各有优缺点,对于一些大型工程,需要后期不停完善的项目,面向对象的编程思想更加适用。

2、类的引入

在C语言中,结构体中只能定义变量,而在C++中,结构体内不仅可以定义变量,还可以定义函数

上面代码就是在C++中定义的结构体,可以看到结构体中不仅有变量name,gender等,还有函数Init,Print。

3、类的定义

虽然C++继承了C语言的功能,但是在C++中,定义类更多的是使用关键字class。

?这里class是定义类的关键字,classname为类的名字,和结构体一样,{}中为类的主体,类的结尾用;来结尾。类中的元素称为类的成员,类中的数据称为类的属性或者成员变量;类中的函数称为类的方法或者成员函数。

我们用C++的方式再来写一遍上面的代码:

?我们发现用class定义类的时候会这样报错,这个错误我们先搁置一下,接下来会讲到,如果给代码中加上public就会正常运行:

?这时候就是用class来定义的类型,Student就叫做类型,s在结构体中叫做变量,但是在C++的类中,我们将s叫做对象。

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

4.1访问限定符

C++实现封装的方式:用类将对象的属性和方法结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

?这里就出现了我们刚才遗留的问题,用class定义的类必须要加public,因为class的默认访问权限是private。

通俗的解释上面三个内容是:

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

private和protected(在这里我们看作是一个意思,后面再区分)修饰的成员在类外是不可直接被访问的。

访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。

4.2封装

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

在类和对象中,我们只研究封装,那么什么是封装?封装是将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

在C++的类中,把数据和方法封装到一起,当想让你自由访问的设计成共有public状态,不想让你访问的设计成private状态。一般在设计时,成员数据都是私有或者保护的,想让访问的函数是共有的,不想让访问的是私有或者保护。

封装本质上是一种管理:我们如何管理兵马俑呢?比如如果什么都不管,兵马俑就被随意破坏了。那么我们首先建了一座房子把兵马俑给封装起来。但是我们目的全封装起来,不让别人看。所以我们开放了售票通道,可以买票突破封装在合理的监管机制下进去参观。类也是一样,我们使用类数据和方法都封装到一下。不想给别人看到的,我们使用protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质是一种管理。

5、类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。

?在这里,这两个Push是可以同时存在的,因为他们所属的作用域不同,一个是在Stack的作用域,一个是在Queue作用域,并且这两个Push也不是函数重载的概念,因为他们的参数都是一个类型。

当我们写一些大型文件的时候,我们会将函数的声明和定义剥离开,将函数的声明放在头文件中,可以在头文件中看到函数的使用方法等,但是要想知道函数的具体实现过程就需要到.c或者.cpp文件中查看。

?

可以看到即使我们引用了头文件“classes.h”仍然会报错,这是因为我们没有指明作用域

?当我们使用::作用域解析符指明成员所属作用域就可以正常运行。

?6、类的实例化

我们在定义类时,写在类里的成员变量是声明还是定义?这里要注意声明和定义的区分方法,区别在于是否在内存中开辟了空间,如果没有开辟空间就是声明,开辟了空间就是定义。所以在类中的成员变量是声明,建立对象后才是定义。

用类创建对象的过程,叫做类的实例化。

1、类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。

2、一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。

3、做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。

7、类对象模型

如何计算类对象的大小?C语言计算结构体的大小遵循内存对齐原则,但是C++的类中,除了变量还可以定义成员函数,成员函数的大小如何计算?

事实上,每个类的实例对象使用的成员函数都是相同的,所以C++将类的成员函数放在了公共的代码段,每个实例对象使用的是同一个成员函数。这样的话计算类的大小的时候就不需要考虑成员函数就只用考虑成员变量。

示例如下:

?如果类中有函数有变量,只需要计算变量的大小即可,类中只有变量和有函数和变量遵循结构体内存对齐原则。如果是空类或者是仅有函数,那么占用一个字节。

复习一下结构体内存对齐规则

1、第一个成员在与结构体偏移量为0的地址处。

2、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的对齐数为8

3、结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。

4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

结构体对齐原则详情看文章:https://blog.csdn.net/weixin_55800047/article/details/124877907
?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-26 15:13:27  更:2022-05-26 15:14:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 1:43:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码