014 - C++ 类

news2024/12/24 20:34:06

本期我们要讲的是 C++ 中的类。

我们终于讲到了面向对象编程,这是一种非常流行的编程方式,面向对象编程实际上只是一种你可以采用的编写代码的方式,其他语言例如 C#、Java 这些主要是面向对象的语言,事实上,用这些语言你真的不能写任何其他类型的代码,尽管你也可以尝试这样做,因为最终这些语言都是面向对象的语言,C++ 有点不同,因为它并没有强加给你一种特定的风格。

C 语言实际上并不支持面向对象编程,因为为了面向对象编程,你需要有一些概念,比如类和对象,这些东西 C 语言没有,如果你想使用面向对象的话 C++ 会添加所有这些功能。

在某种程度上使用面向对象总是一个好主意,我们将在本期讨论什么是类。

类是什么

简单地说,类只是对数据和功能组合在一起的一种方法

例如,在一个游戏中,我们可能想要一些代表角色的东西,那么我们需要什么样的东西来代表一个角色呢?我们当然需要一些数据,例如,角色在游戏中的位置,角色可能拥有的某些属性,角色移动的速度,我们可能还需要一些 3D 模型,代表角色的屏幕形象。所有这些数据都需要存储在某个地方,实际操作中,我们可以为所有这些创建变量,让我们来看看它会是什么样子。

ix8jSC.png

我们想要创建一个角色,然后想要一个角色位置以及它的速度,这些都是整数。你可能发现这有点乱了,因为这些名字太普通了,你可能想写成 PlayerX、 PlayerY,speed 改成 PlayerSpeed,哪怕是这样,还是有点乱。

尤其是当我们的游戏有 2 个角色时,你就不得不先复制,然后改成 PlayerX0、PlayerX1 等。

ix8IiP.png

你当然可以使用数组,但其实问题重点还是一样的,它们只是一堆没有组合在一起的变量,他们是无组织的,只是被放在我们的代码中,这不是一个好方式。

另一个很好的例子可以说明为什么这很烦人,我想写一个函数来 move 角色,例如下面这样。

ix8NbX.png

看起来更乱了,是吧。

所有这一切都变成了如此多的代码,难以维护,非常混乱,所以我们要做的就是通过使用类来简化它。

我们可以创建一个叫做 Player 类,它包含了所有的数据,我们想要把所有的变量变成一种类型。

ix8r6t.png

在上面的代码中,我们创建一个名为 Player 的类,通过使用关键字 class,然后给它一个名字来实现。这个名字必须是唯一的,因为 class 是类型,这里是创建一个新的变量类型,然后是左右花括号,就像定义函数那样,注意末尾需要一个分号;在花括号里面,我们指定了我们需要的所有变量。

ok,我们创建了一个全新的类叫 Player,本质上它是一种类型,如果我们开始使用 Player 类,可以把它当作其他变量来创建。

ix831J.png

我们给一个新变量命名为 player,类型是 Player。

由类类型构成的变量称为对象,新的对象变量称为实例,我们在这里所做的是实例化了一个 Player 对象,因为我们已经为那个 Player 类型创建了一个新实例。

如果我们想设置这些变量,如果你有一点概念基础的话可能会这样使用。

ix8cCc.png

然而如果我们现在尝试编译,会得到一个错误。告诉我们 player 不能访问在类 Player 中声明的私有成员

这是因为 “可见性” 的原因,当你创建一个新类时,您可以选择指定类中的内容的可见性,默认情况下,类中所有东西都是私有的,这意味着只有类中的函数才能访问这些变量。然而,我们希望能够从 main 函数中访问这些变量时,我们需要做的是把它设为 public(公有的)。

ix8mgA.png

public 意味着我们可以在类之外的任何地方访问这些变量。我们会在以后的内容中更多地讨论可见性,现在先不讲这个。

现在编译,程序就没有问题了。

现在我们实现了第一个目标,已经彻底清理了代码,把所有的变量都放在了一个地方,这些变量集合可以代表一个 player,我们把它们恰当地分组了。

方法

现在我们有了这些数据,我们想让 Player 做一些事情,例如移动,所以要写一个函数来改变 X 和 Y 变量的值,我们怎么做呢?我们可以把它写成单独的函数。

ix8pKo.png

这个函数的参数我们通过引用传递给它一个想要被移动的 Player,因为我们要修改 Player 对象。所以还要取 xa 和 ya,也就是我们在 X 轴和 Y 轴上 player 移动的距离。

我们现在试着调用这个函数。

ix8XUN.png

没有问题。

我们可以做得更好一点,之前我说过,类实际上可以包含函数,这意味着我们可以将 Move 函数移动到类中,类内的函数被称为 方法 (method)

ix8gRV.png

我们还做了一些修改,因为这个函数已经在类中了,所以不需要传入 player 对象了,因为它已经在 Player 对象中了,所以我删除了里面相关的内容,这样我们已经简化了我们的代码。

调用 Move 的过程如下。

ix8xSd.png

好了,每个 Player 对象都有了自己的Move 函数,当我们为指定的 Player 对象调用 Move 时,这个 Player 对象将会移动,这与 Player 类之外的 Move 函数没有什么不同,它的作用就是让我们代码更干净,看起来更好看,当你处理很多代码时,这是一个巨大的优势,因为你有越多的代码,情况就越复杂,就越需要有这样的代码来保持代码整洁。

后话

这就是类的基本概念了,它允许我们将变量分组到一个类型中并为这些变量添加功能,因为如果你再回看一下这些代码,我们真正做的是在一个类型中定义了三个变量,我们还有一个处理这些变量的函数。当然这个函数可以做其他任何事情,但它的要点是,我们有数据和处理这些数据的函数,这就是所谓的类了。

类有很多用途,我们以后会讲到它们,今天讲的是类的基本概念,我们可以用类做更多的事情,接下来的几期会更详细地介绍这些内容。

另外,我希望你们记住,虽然类非常有用,可以让你的代码更简洁,但是如果不使用类搞不定的的事情,用类也一样搞不定,类不会给你提供任何新功能。同样你可以用类搞定的事情,不用类一样搞得定,这就是为什么像 C 这样的语言存在并且是完全可用的原因,他们没有所谓的类。然而我们仍然可以编写类,可以使我们编码更容易,因为类本质上只是语法糖,我们可以使用它来组织我们的代码,使它更容易维护。

为什么像 C 这样的语言存在并且是完全可用的原因,他们没有所谓的类。然而我们仍然可以编写类,可以使我们编码更容易,因为类本质上只是语法糖,我们可以使用它来组织我们的代码,使它更容易维护。

好了,本期就是这些内容了,下期再见。

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

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

相关文章

JUC并发工具

JUC并发工具 一、CountDownLatch应用&源码分析 1.1 CountDownLatch介绍 CountDownLatch就是JUC包下的一个工具,整个工具最核心的功能就是计数器。 如果有三个业务需要并行处理,并且需要知道三个业务全部都处理完毕了。 需要一个并发安全的计数器来操作。 CountDown…

Android Linux,Windows 安装,卸载 android studio

Linux安装过程 sudo apt-get install libc6:i386 libncurses5:i386 libstdc6:i386 lib32z1 libbz2-1.0:i386sudo cp -r ./android-studio /usr/local/cd android-studio/cd bin./studio.sh Windows 安装过程 下载安装文件,解压 将解压得到 android-studio 文件夹…

pdf转jpg怎么解决?这五个转换方法快速搞定!

pdf转jpg怎么转?pdf是在我们工作中经常使用的一种办公文件格式类型,但是在某些特殊情况下,我们应该把pdf转jpg图片格式文件,很多人在这种情况下不知道如何把pdf转jpg图片格式文件,接下来我们一起来了解下pdf转jpg转换方…

java设计模式(1) 适配器模式、装饰器模式

适配器模式 适配器就是一种适配中间件,它存在于不匹配的了两者之间,用于连接两者,使不匹配变得匹配。 手机充电需要将220V的交流电转化为手机锂电池需要的5V直流电 知识补充:手机充电器输入的电流是交流,通过变压整流…

MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点1:sys.statement_analysis视图

文章目录MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点1:sys.statement_analysis视图视图sys.statement_analysis各列定义视图sys.statement_analysis视图的定义视图sys.statement_analysis各列解释例题例题解析参考MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点…

5G边缘计算网关用于智能消防安全

随着人们对智能消防安全的需求不断增长,5G边缘计算网关作为一种新型技术,已经被广泛应用于消防设备的智能监控和管理中。本文将介绍5G边缘计算网关在智能消防安全中的应用,并给出一个Python代码示例。 一、5G边缘计算网关在智能消防安全中的应…

OKR系统改变您的团队

使用Zoho Projects易于使用的OKR系统将雄心转化为行动。简化您计划、跟踪和报告团队目标的方式。 一、使用这个强大的OKR工具提升结果 1、自动组织团队的目标 在公司、部门、团队和个人层面创建和跟踪OKR,以实现真正的整体OKR管理。 2、实时跟踪进度 使团队能够使…

阻塞队列 BlockingQueue

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除的方法: 支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满;支持阻塞的移除…

HTML5 <header> 标签、HTML5 <html> 标签

HTML5 <header> 标签 实例 HTML5 &#xff0c;<header>标签用来表示介绍性的内容&#xff0c;即&#xff0c;定义了文档中的页眉&#xff0c;请参考下述示例&#xff1a; <article> 的页眉&#xff1a; <article><header><h1>Internet …

SpringSecurity之入门案例

前言 前面一篇文章讲了一些关于SpringSecurity的基本内容、两大核心模块以及学习他所需要的基本技能点。接下来&#xff0c;带大家进入到一个基本的入门案例&#xff01;&#xff01;&#xff01; 操作步骤 1、创建Springboot工程 首先通过idea开发工具&#xff0c;创建一个…

代码随想录_二叉树_leetcode669 108 538

leetcode 669. 修剪二叉搜索树 669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没…

翻译国外文章-整篇文章的翻译

chatgpt翻译是专业的吗 ChatGPT是一种AI语言模型&#xff0c;它可以用来执行各种自然语言处理任务&#xff0c;包括翻译。然而&#xff0c;ChatGPT的翻译结果并不是专业的翻译&#xff0c;因为该模型并不是专为翻译任务训练的。 虽然ChatGPT的翻译质量相对较高&#xff0c;但…

你了解C语言中的数组指针和函数指针吗?

如题&#xff0c;本篇文章重点讲解C语言中的数组指针和函数指针。这2种指针其实都不是很常用&#xff0c;个人感觉使用起来代码的可读性不是很高&#xff0c;但是还是需要了解一下。 数组指针 数组指针&#xff0c;即指向数组的指针&#xff0c;是用来存放数组的地址的。那如…

JavaScript对象类型之Array及Object

目录 一、Array &#xff08;1&#xff09;语法 &#xff08;2&#xff09;API 二、Object &#xff08;1&#xff09;语法 &#xff08;2&#xff09;特色&#xff1a;属性增删 &#xff08;3&#xff09;特色&#xff1a;this &#xff08;4&#xff09;特色&#xf…

公司测试员用例写得乱七八糟,测试总监制定了这份《测试用例编写规范》

统一测试用例编写的规范&#xff0c;为测试设计人员提供测试用例编写的指导&#xff0c;提高编写的测试用例的可读性&#xff0c;可执行性、合理性。为测试执行人员更好执行测试&#xff0c;提高测试效率&#xff0c;最终提高公司整个产品的质量。 一、范围 适用于集成测试用…

SAP MDG —— 使用DIF导入物料主数据 Part3 进阶篇

文章目录关于使用DIF处理物料主数据的相关信息IDOC 缩减IDOC 扩展物料编码的主键映射 Key Mapping主键映射和内部给号其他主键的主键映射值映射 Value Mapping将物料主数据导出为IDoc文件 - MATMAS / CLFMAS错误处理本章小结关于使用DIF处理物料主数据的相关信息 IDOC 缩减 场…

机器学习:基于KNN对葡萄酒质量进行分类

机器学习&#xff1a;基于KNN对葡萄酒质量进行分类 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏…

网盘工具助力律师团队文件管理

律师的日常工作离不开文件管理。文档管理对于律师而言是一门必修课&#xff0c;这也是日积月累的工作。良好的文件管理习惯可以帮助我们让工作流程化、标准化&#xff0c;助力知识管理&#xff0c;避免职业风险&#xff0c;提升团队工作效率。 好用的文件管理工具也可以帮助律师…

Python 实验三 控制语句

1.从键盘接收整数的一百分制成绩&#xff08;0到100)&#xff0c;要求输出其对应的成绩等级A-E。其中&#xff0c;90分&#xff08;包含&#xff09;以上为A&#xff0c;80-89&#xff08;均包含&#xff09;分为B&#xff0c;70-79(均包含&#xff09;分为C&#xff0c;60-69&…

[网络安全] Windows Server 设置文件屏蔽防止黑客利用漏洞上传特定类型的非法文件

我在负责网站运维期间&#xff0c;遇到过一次黑客利用网站内使用的开源文件上传工具漏洞上传非法文件&#xff08;可执行脚本&#xff09; 我是通过设置文件屏蔽来防止此类事件的再次发生。特在此做下记录。 文章目录前言一、黑客是怎么攻击我的二、我是怎么防范的2.1 Windows …