粉丝143获赞577

每天五分钟学会 c 加加,今天我们来讲一个万能的头文件, 那个很多的同学说各种各样的这个库函数啊,一会要用 cmax 啊,一会要用 cctv 啊,这个记不住。然后我们今天啊为了给大家一个偷懒的办法, 给大家介绍隆重推出这个万能头文件,这个东西酷的壁纸, st 三的是一家家的 哎,头文件他这里面包含了很多,基本上所有的这个喜家家的 要用的酷的头文件都在里面了。那我们来看一下,我们先看一下程序吧, 原来是那个叫用的是真的,还有我,我的,还有我是菌子什么的啊,或者还有其他的,那我现在用这一个就可以了,那你看我就打印这个还是 word 吧,给你们形一下 就可以了,就这个图文件呢,很简单,他这个东西会在这个地方出现,比如说我们在这里面我们搜索一下, 打开来看一下, 打开来看一下,你会发现然后这个文件他实际上就是一个点 h 的文件,他里面你看他裤子很多 也有的,这是西园的,下面是有西家家的是吧,这个各式各样的都有,基本上呢,然后他会他的优点就是什么,就你记不住的时候, 你可以不用少打字,然后你参加竞赛的时候,你各种各样的这个口红这样写的时候,那你可以用用这个 一条鱼就就搞定了,不需要显老本裤的,那还还有些缺点就是他环境不同的,环境一致,是你需要去编辑确认一下是不是可以, 那也就是那我们学习的时候呢,最好呢还是搞搞清楚哪个函数对于哪个苦,或者你 感觉你学会了,实际上不是很清楚,对吧?那今天我们就是一个万能头文件,就介绍了这么一个东西,那 以后大家也可以用一下。好,今天就这样啊,谢谢大家。


这节课我们要在 vs 进行实作,练习 stack and heap 的 内容,这次我们换使用 struct 来练习。首先写入 struct character, struct 预设为 public 公开存取,所以我们不用特别写入 public 存取修饰符。 接下来写入区域变数 string, name 和 float, 并且定义键购子 character 键购子内容,我们直接在 struct 的 内部定义,写入 name 等于 t f health 等于一百点 f。 接着再写入一个名为 print health 的 函数, 内容为打印输出 health 值。 现在我们来到 main, 先使用 stack 的 方式来抽象 character, 写入 character 类别名为 charon stack, 打印输出 charon stack 点 name, 最后呼叫 print health。 函数 完成后运行这段代码相信同学已经很熟悉了,跟我们以往练习的定义和呼叫完全相同,而这段所储存的记忆体区域就是 stack, 所以 我们可以在前面备注,在 stack 上创建 character 物件。 接下来我们在 hip 上创建 character, 要在 hip 上创建我们就必须写上 new, 写入 new 后接的是 character 建构字, 所以这行就会呼叫键购子内的内容。而 note 的 写法规定一定要指向一个指标,这项指标就会是指向 character 的 指标,我们可以命名为 char run hit, 要注意一定要指向指标,如果没写入新号,系统就会报错。接下来输出打印 char run hit name, 而一项指标要呼叫记忆体地址内的变数,就需要使用箭头符号,所以写入箭头 name, 如果是一般物件呼叫就是使用点。 最后 charon heap 箭头 print help 呼叫这项函数现在运行 可以看到两段代码都显示相同结果,前者是存在 stack, 后者是存在 hip。 在 程序结束前,我们已经确定不会再呼叫 charon heap 这项指标内的内容,所以写入 delete charon heap 系统就会删除在 hip 内的 charon hip 记忆体,防止记忆体泄露。现在我们就可以备注这段位,在 hip 上创建 character 物件。 接下来我们来模拟记忆体泄露真实的情况是如何。先把 delete charon hip 删除,并把 main 中使用 do 创建的 character 物件备注起来。现在我们写入一个 for 回圈 d i 等于零,并且 i 小 于一百 e, 最后加加 i。 内容为写入 new character 建构字并指向 character 指标名为 temp temp 箭头 name, 呼叫 name 并等于复制 new。 打印 temp 中的 name 并呼叫 print health 函数。这段内容是模拟记忆体泄露事件。同学的电脑记忆体如果不大 可以不用运行,因为可能会造成卡顿问题。这里只是测试给同学看可以不写入 delete 的 状况会是如何。现在运行可以看到现在电脑稍微变慢,这是因为每次回圈都会创建一个 character 在 hip 内,继而积累堆积造成系统变慢。所以我们在使用怒时, 最后要记得使用 delete 来删除在 hip 内的记忆体,这是处理动态记忆体分配的标准做法。最 后容我提醒同学,因为在 unreal engine 开发中会分成 header file 和 c 加加两种文件来拷写代码,而 header file 通常是写入类别名或韩式名的地方。例如会在 header 内写入 void print help, 并在 c 加加文件中写入输出打印 help 值。所以在定义内容时都会使用外部定义的方式来拷写内容逻辑。而 header file 和 c 加加文件分开拷写的方法我们会在后面课程跟同学介绍。 以上就是本节关于 stack and heap 的 实作练习,下节课我们要讲讲关于 destructors 结构子的内容。有建构子也就会有结构子。谢谢收看,我们下节课见。

这节课我们要在 vs 时做练习关于存取修饰符的内容。首先我们创建一个名为 creature 的 class, 并且写入 public 公开存取修饰符内容写入 creature 建构字, 建构字内容我们写入输出一个生物的创建。 接下来回到 class 中,写入 private 私有区域,区域内写入两项变数,分别是 string name 和 float health, 这两项变数将只能在 creature class 内被使用。现在我们在 main 中出土化 creature 名为 born, 使用 born 来呼叫 name, 可以 看到 name 出现错误,它说谓曰行十一,无法存取,也就是我们写在 private 内的 string name 无法被存取,先将其删除。 之所以会把这两项变述写在 private 私有的原因是因为通常不希望外部城市码能直接修改它们, 所以这时候我们就会使用一个概念叫做封装 encapsulation。 封装的核心概念就是保护资料,让你只能透过特定的方式来存取或修改。这种特别的方式就是所谓的 geter 和 setter 函数来处理这些 private 的 变述。 首先我们在 public 中写入一个 set, 有 参,函数名为 set name, 设置姓名参数 string name, 再写入一个 get 函数,回传值为 string 的 get name。 首先我们定义 set name 内容的 name 变数等于参数 name, 也就是写入的参数将会直接赋值等于 name 变数。 接着在定义 get name, 可以 看到翻译器直接帮我们写好 return string, 但我们这里不是回传 string, 而是回传变数 name。 回传变数 name 就 会在呼叫 get name 还是时执行 name 这项变数的值。完成后,我们来到 main 中,先呼叫 set name, 并输入引数,自串 boyn, 再写入输出 boyn, 点 get name 终端的结果就会是我们在 set name 写入的引数字串括号,这就是 set 和 get 函数的写法,同学也可以看到写在 private 内的变数也可以在函数内容中被复制,是不是很酷呢? 同样的道理也可以用在 health 上,但这里我们稍微进阶一点,通常在游戏里生物的生命值不能随便改,也不会是负数的状况,还要考虑到攻击、防御、死亡这些逻辑,所以我们可以写一个 take damage 参数为 float damage 的 函数, 也就是接受伤害参数为伤害值,而逻辑就会是生命 health 减等于 damage, 也就是写入参数时,生命值将会减去 damage 伤害,得到新的 health 生命值。而我们也要检查生命值扣除后是否会变成负数。 所以写入 if health 小 于等于零,小于等于零表示已死亡。所以打印生物以死亡字喘 并复制变数 health 等于零,否则 else 打印生命值,剩下 health 变数。 现在我们把 health 变数写入数值一百,并在 man 中调用 burn 的 take damage 函数写入五十,也就是伤害五十,运行 可以看到显示生命剩下五十,也就是一百减五十的结果。那如果现在我们把引数修改为一百一十, 运行后可以看到显示生物已死亡,也就是 help 小 于等于零的结果。当然我们也可以使用 get help 来取得 help 的 值。写入 get help, 回传 float 值的函数 内容为 return help。 我们在 man 中 take damage 前先输出打印 health, 再接受伤害前的生命值,也就是使用波点 get health 来取得当前的 health 血量。接受伤害后再输出一次 health 生命值,看看会是多少。 可以看到,因为我们写入的引数是一一零,所以显示生物已死亡。那如果我们把引数修改为五十,就可以看到生命值显示为五十。 透过这整个流程,我们就建立了一个拥有封装机制的 creature 类别,里面保护了资料,也定义了使用方式。这就是物件导向设计中非常重要的一个观念,资料要能被保护,同时也要能被正确地使用。 在应用了 public 和 private 后,我们接下来写入 protected。 protected 的 区域可以在本类别内部以及继承此类别的子类别中被存取,但在类别外部,例如 main 则无法直接存取。 现在我们在 protected 中写入一个名为 number of likes 的 整数变数。通常我们会在 protected 中写入的内容目标会直接是定在给子类使用,并不希望外部任意操作。现在我们写入一个名为 goblin 的 子类继承 creature, 并在 public 内写入 goblin 的 鉴购字。鉴购字内容我们直接出示化 number oflex, 变数等于二。现在我们在 men 中出示化 goblin 名为 code, 并使用 code 点 number of likes 呼叫变数,可以看到出现错误。这是因为 number of likes 是 写在 creature 的 protected 内,不能被外部呼叫,包含 main。 所以 我们要在 goblin 内再写一个 get 函数,返回值为 int, 名称 get number of likes b return 变数 number of x。 现在我们回到面中就可说胳膊零有 cody。 get number of x 条腿 运行后,就可看到我们所写入的胳膊零有两条腿。内容 到这里就可看出风装的力量。我们可以控制变数如何被使用与暴露?所以如果我们在高布林建构子内呼叫 name 就 会报错,这是因为 name 在 creature 中是写在 private 内,但是我们可以使用 set name 还是来设定 name, 再使用 get name 来打印, 是不是很酷呢?以上就是本节关于存取修饰符在建构子与继承上的应用,下节课我们将进入战河堆 stack and hip 的 内容,解释动态记忆体是如何运作的。谢谢收看,我们下期见!

在上节课中,我们学到了如何在 class 外部来呼叫韩式,并且在外部定义韩式内容,同时使用 dog 键构字来定义 class 内容的变数属性, 并且能够在 men 中进行初识化。 class 之所以能够初识化并调用内部的属性,是因为我们在 class 中使用 public 存取修饰符这项重要的功能。现在我们来模拟如果没有写入 public 会是一个怎样的状况。首先一样定义 class doc 内容 string 和 barcode 函数,而这里我们直接写入内容,内容输出 one 字串。 现在我们直接在 man 中出示化 dog 类别名称 q b q b 点 bug 呼叫这项还是 可以看到出现错误, vs 说还是无法存取,这是因为在 c 加加中, class 类别会将内容预设为 private 隐私,也就是说在 private 的 状态下,我们无法在 class 外部呼叫里面的内容,所以我们才要特别写入 public, 公开才能顺利呼叫。 而要留意的是 struct 结构体不同, struct 预设的状态为 public, 所以 在创建 struct 内容后,我们可以直接在外部调用存取 struct 里面的内容,不需要额外的处理。 现在我们来使用鉴购子出场变数的内容写入到个括号,记得鉴购子需要跟 class 相同的名称,并且不需要写入 y。 在 鉴购子的函数体内定义变数, name 等于 q b h 等于三, health 等于九十九点九。 定义完成后,我们来到 main 中输出 q b 点 name、 q b 点 h 和 q b 点 health 三项变数属性, 可以看到确实显示我们在键购子中所定义的内容。同时我们也可以选择把键购子定义在 class 的 外部。现在我先将内部的这段备注起来,并在 dog 键购子后加上分号, 在 class 外部写入 dog 双冒号。作用域解析运算子 dog 键购子冒号 d 变数 name 括号 q b 逗号 h 括号三逗号 hells 括号九十九点点九 f 最后大括号后不写分号,这段将会在外部直接定义键购子 dog 的 三项变数属性。要留意的是,键购子前的 dog 双冒号指的是 dog 这个 class, 现在我们已经在 man 中写入输出变数的状态下进行输出, 可以看到显示的结果跟我们在内部定义键构字是相同的。当然,如果不习惯这样简写的形式,我们也可以使用一般写法来定义,呈现的结果会是一样的,看各位同学的喜好来选择即可。 我们先将这段备注起来,而要在外部定义函数内容也是相同的道理,我们直接将内容进行减下,写入 void dog 双冒号 bug, 再贴上内容输出万字串,同样也可完成定义并被呼叫。 那问题来了,我们明明可以把建构子写在 class 内部,那为何要在外部定义呢?在外部还要特别著名 dog 说冒号,这样不是多了复杂性, 我们会在外部来定义建构子的情境,大多是专案较大时会使用,而在实际虚幻引擎的开发中, 系统会把宣告和定义分开成两部分进行操作,这样可增加可读性外,也会让整体的阅读界面更加干净,在多人协助中也会增加效率,同时也可减少翻译器在翻译的时间。而如果我们的专案体积较小,直接把鉴构字写在 class 内部是没有问题的。 在了解了 class 建构子后,我们来说明关于 struct 结构体的应用。现在我们先将 doc 的 内容全部删除,方便我们观看接下来的内容。 struct 跟 class 一 样,也可以拥有自己的建构子。 首先我们写入 struct cat, 因为 struct 预设的存取修饰符是 public 公开,所以我们不用特别写入 public, 可以 直接定义键构字 cat, 并写入遍数 string, name 和 engage, 并再定义一个名为维奥的函数。 完成 struct 的 内容后,我们在外部出示化 cat 建构字一样需要写入双冒号,表示是属于 cat 结构体。在内容中首先写入输出生出小猫了, 并定义 name 等于 bob, h 等于一。完成定义后,我们进行密钥函数在外部的内容。函数的定义要记得写上 y, 也就是空回传值。在写上 cat 后,接双冒号和函数名内容,输出密钥字串 和变数 name 与 h, 这样我们就可以在呼叫密钥这项函数时就直接输出打印 name 和 h 的 数值。 完成后,我们在 cat 建构子内直接写入喵这项函数,也就是在建构子内运行这项函数的意思。现在来到 man 中定义 cat 名称 bob 并运行, 可以看到终端直接显示了 cat 建构子里面的所有内容,也包含了喵这项函数的内容。 我们也就不需要在面中一一调用 cat 内部的属性,因为我们已经在建构子中完成定义,并在韩式中完成输出,是不是很酷呢?而 class 同样也可做到这些功能。 class 与 struct 两者最大的区别就在于预设存取的权限不同, class 预设为 private 隐私, struct 预设为 public 公开。还有使用情境上的不同。 class 多用在封装一个物件上,例如 player 玩家 struct 多用在资料容器上,例如坐标 x, y, z 三维结构。 以上就是本节关于建构字的实作内容,同学务必要实际动手练习才会知道哪里不清楚。下节课我们将进入 inheritance 继承的内容,谢谢收看,不见不散。

这节课我们回到 vs 进行实作练习关于 class 和 object 的 内容,首先我们写入一个名为 dog 的 class, 在 写入内容属性前,我们先写入存取修饰字 public, 在 前面表示接下来的内容可以被外部存取呼叫,如果没有写入 public, 系统会预设为 private, 外部也就无法调用内部属性,而内容包含 string, name into h 和 float help。 接下来写入一项名为 bug 的 函数内容,输出 woof 字串, 最后在 class 的 末端要加上分号,这里 vs 帮我们自动补上了,但如果使用其他 ide 的 话,要记得看看最后有没有补上。 现在我们的 dog 类别拥有三个属性,分别是 name, h 和 have。 还有一个 bug 函数。定义好类别后,我们就要在 man 中创建实体,也就是物件, object 写入 dog, q b 和 dog, lulu。 完成物件建立后,接下来就是呼叫内部属性 写入 q b 点 name 等于 q b, q b 点 h 等于十八, q b 点 house 等于九百九十九点九, q b 点 bark。 完成 q b 的 内容后,我们写入 lulu 点 name 等于 lulu, lulu 点 h 等于三, lulu 点 house 等于八百八十八点八 撸撸点 bug。 这样一来我们就完成了两只狗的物件创建,分别是 q b 和撸撸,而两只都有自己的属性资料和韩式功能,这就是类别的威力。 每个物件都是独立的,但都来自同一个设计。蓝图输出后可以看到出现两个 wolf, 分 别是 q b 和撸撸的 bug 韩式内容。 以上就是本节关于 class 和 object 的 内容,接下来的课程我们将深入探讨如何使用 class 建构子 constructor 成员出场方式,以及如何用更进阶的方式封装资料与行为。相信同学已经发现了 class 和我们之前学过的 struct 结构体很相似,但其实 class 的 功能更加强大,使用频率也比 struct 更多, 我们会透过更多练习帮助你建立对物件导向的直觉。谢谢收看,我们下节课见。

这节课我们要在 vs 中练习关于继承的内容,继承的时作内容总共会有三节课,这节是第一节,我们还会把之前所学的内容部分应用进来,让同学能够融会贯通。实际的 call 定过程首先我们定一个名为 animal 的 class 存取权限 public, 并写入 animal 建构字和基本的变数属性, string name, int h 和 int numoflex, 年龄和角的数量。接着在外部定义建构字内容, 输出一个动物的创建字串,并定义 name 等于 golden, h 等于八, number of x 等于四。完成后,我想创建一个函数,把 animal 的 这些数值打印出来。所以我们在 animal class 中创建名为 report 的 函数,并在外部定义函数 内容为输出三项变数的数值。 完成后,我们在 man 中出示化 animal 类名称 animal, 并使用 animal 点 report 来呼叫 report 内的内容。运行后可以看到确实输出一个动物的创建,还有所有变数的属性。 接下来我们在 class 内添加一个有参见构字的函数,函数名一样为 animal, 参数为 string name, int h 和 int num nums, 并一样在外部定义这个有参见购字定义时的参数,同样也要代入, 而内容则写入变数 name 等于参数 name, 变数 h 等于参数 h, numoflex 等于 numlex。 如此一来,我们在填入引数时,引数会直接复制在变数上。 现在我们回到面中定义一个使用有参见购子的 animal 物件,匿名为 animal 二, 并在括号内写入 luna, 逗号,七,逗号和四。接着使用 animal 二点 report 来呼叫 report。 函数 完成后运行可以看到显示我们在有参见购子内所定义的数值。也就是说,当我们在初设购子内所定义的数值。也就是说,当我们在初设购子内时, 可以使用不同的键购字来设定属性内容。如果有定义多个键购字,例如预设键购字与有参键购字, 只要输入的引数与其中一个键购字的参数行别与数量相符,系统就会自动选择对应的键购字来执行。这种根据参数数量或行别来区分键购字的机制就称为键购字承载。 constructor overloading。 我们在外部定义建构子时,除了这样的基础复制语法外,我们还可以使用让效能最佳化的初始化列表来建立。现在我先把内容删除,并在参数后写入冒号,并直接定义变数 name 括号 name h 括号 h number of x 括号 number of x, 最后写上大括号。这样的写法是初识化列表这段有参鉴钩字会比基础写法更加高效,也可看到输出的结果完全相同, 但是表达式长度会变得更长。所以我们可以把冒号这段换行,对其缩排到下一行,增加可读性,看起来也更加整齐。 以上就是本节关于继承的第一堂内容,下节课我们将继续在 vs 中识做更多关于继承的内容,谢谢收看,我们下节课见!