C++感受11-Hello Object 成员版

当一个C++程序员在设计类型时,他在想什么?

  1. 这一类型的对象,需要拥有哪些属性数据?
  2. 这一类型的对象,它将拥有哪些功能?
  3. 这一类型的对象,它的各个属性和功能之间,有哪些关联关系?

(课堂视频在第3点,建议先阅读文字内容)

1. 为自定义类型添加成员

是时候来关心对象自身的属性与功能了!在C++中,对象的属性,通常称为“成员数据”,对象的功能,通常称为“成员函数”。

前两节课中,我们还创造过“恐猪”和“恐蛇”物种啊,这两种类型,按说就应该很厉害才是。但可惜,它们只是在类型的名字上,听起来很厉害的样子,其实,我们也只是为它们定制了生和死的功能。

假设我们要写一个游戏程序,里面就有像“恐猪”和“恐蛇”这样的怪兽。游戏的玩家可能需要杀死它们。那么,怪兽是不是要有像血气值、攻击力、防护力这样的数据?同时,除了生和死,怪兽对外要有攻击和被攻击的能力。

攻击的意思就是,玩家进入某一只怪兽的某个范围时,怪兽可能会主动攻击玩家,对玩家造成一定的伤害。被攻击则相反,如果玩家给它一拳,也就是怪兽被攻击了,这时怪兽是直接挂掉?还是说只是血气值减少一丢丢说?或者说给它一拳以后,它反倒更加兴奋了?

血气值,攻击力,防护值 ,它们就是一个类型或者一个对象的属性,通常它们以一种特殊的数据形式出现,称为成员数据。而:怪兽会攻击人也会被攻击,这些就是一个类型或一个对象的能力,通常以特殊的函数形式的出现,称为成员函数,在更多对面向对象的语言,也称为“方法”。

2. 理解方法和属性之间的关系

结合怪兽这个案例,来看看,在定义一个组合类型时,我们需要表达什么?

1、这一类型的对象,需要拥有哪些属性数据?
2、这一类型的对象,它将拥有哪些功能?
3、这一类型的对象,它的各个属性和功能之间,有哪些关联关系?

其中理解第三点,非常重要:属性和功能之间,通常存在紧密的关系。一个功能的实施,可能会引发一些属性值的变化。比如,怪兽被攻击,通常是不是它的血气值 ,也就是游戏中常见的,顶在怪兽头上的“生命条”,会变短;当然,也可以“防护值”这个属性也考虑上,一只怪兽当前的“防护值”越大,比如说它正好穿着铠甲,那么,它被攻击时,血气值一下子减少的数量,通常就慢一些。

再来看“攻击力”这个属性,和“攻击”这个能力的关系——也很好理解 :这只怪兽当前攻击力越强,那么对玩家造成的伤害就越大。

再来看真实一些的例子:赛车。成员数据可以有 油量、速度、方向等等,其成员方法则可以有跑(行驶)、转向、踩油门(也就是加速),踩刹车(也就是减速等等)。大家肯定能够想象得出,汽车的这些成员数据和成员函数之间的合理关系。

如果把汽车的例子进一步简化到只有速度和油量两个数据,以及踩油门和踩刹车两个方法。那么这个赛车类型,用结构/struct的来表达的伪代码,大概就长这样子:

// 伪代码
struct 赛车
{int 速度 = 0;int 油量 = 100;赛车 () {cout << “赛车启动啦!油量100,速度为零,请踩油门!” << endl;};void 踩油门() { 加大速度, 消耗油量 };void 踩刹车() { 降低速度  };
};

基本关系就是,调用一个赛车对象踩油门的方法,车就会加大速度,同时消耗更多的油;而调用踩刹车方法,则会降低速度。

实际定义一个完善的汽车的类型,还是有很多逻辑关系要想清楚的。比如踩油门并不一定会提速,因为汽车可能没油了。

 

3. 课堂视频

ff13-HelloObject-成员版

4. 完整代码

#include <iostream>// 定义人类结构
struct Person
{Person() { std::cout << "哇哇~" << std::endl; };~Person() { std::cout << "呜呜~" << std::endl; }// 自我介绍void Introduce() // 成员函数,方法{std::cout << "大家好,我叫 " << name << std::endl;}std::string name; // 成员数据,属性
};int main()
{Person xiaoA;xiaoA.name = "小A";xiaoA.Introduce();std::cout << "------------------\n";auto* xiaoB = new Person;// 写法一,取值后再访问成员(*xiaoB).name = "小B";(*xiaoB).Introduce();delete xiaoB;std::cout << "------------------\n";// 写法二:简易写法“箭头访问符”auto* xiaoC = new Person;xiaoC->name = "小C";xiaoC->Introduce();delete xiaoC;
}

运行效果:

哇哇~
大家好,我叫 小A
------------------
哇哇~
大家好,我叫 小B
呜呜~
------------------
哇哇~
大家好,我叫 小C
呜呜~
呜呜~

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

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

相关文章

OceanBase的存储架构与传统LSM-Tree架构的异同|OceanBase数据转储合并技术解读(二)

前篇博文将OceanBase的存储架构巧妙地与自然界中的“水生态”进行了类比&#xff0c;今日我们转变视角&#xff0c;聚焦在与拥有相同LSM-Tree架构的其他产品的比较&#xff0c;深入探讨OceanBase相较于它们所展现出的独特性能。 众所周知&#xff0c;OceanBase数据库的存储引擎…

element-ui 前端ui框架用法开发指南(2024-05-22)

Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 1、npm安装 // npm安装&#xff1a;npm install element-ui --save 能更好地和 webpack 打包工具配合使用 2、cdn在线引入 访问最新版本的资源地址 - element-uiThe CDN for element-u…

RedHat9 | DNS剖析-配置主DNS服务器实例

一、实验环境 1、BIND软件包介绍 BIND软件是一款开放源码的DNS服务器软件&#xff0c;由美国加州大学Berkeley分校开发和维护&#xff0c;全称为Berkeley Internet Name Domain。该软件在DNS&#xff08;域名系统&#xff09;领域具有重要地位&#xff0c;是目前世界上使用最…

使用OpenCV dnn c++加载YOLOv8生成的onnx文件进行目标检测

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集&#xff0c;使用 LabelMe 工具进行标注&#xff0c;然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件&#xff0c;并自动生成YOLOv8支持的目录结构&#xff0c;包括melon.yaml文件&#xff0c;其内容…

信息系统管理工程师问答题

信息系统管理工程师问答题 系统管理安全两方面 安全测试 入侵检测系统的功能 用户标识与验证常用的3种方法 (1) 要求用户输入一些保密信息&#xff0c;例如用户名称和密码&#xff1b; (2) 采用物理识别设备&#xff0c;例如访问卡、钥匙或令牌&#xff1b; (3) 采用生物统计学…

Python怎样定位并删除Sql语句中不确定的查询条件

1.问题场景描述: 在sql语句中经常会有查询条件是:查找多个订单签订日期范围的数据,但具体的日期范围是不确定,我们如何来查找定位 例如:查询条件语句的部分如下图: 目标是: 1)定位字符串:t_contract_order.sign_date 2)最终得到结果: 解决问题思路: 1)定位要找的字符串起始位置…

【学习心得】PyTorch的知识要点复习(持续更新)

PyTorch知识要点复习&#xff0c;目的是为了巩固PyTorch基础、快速回顾、深化理解PyTorch框架。这篇文章会持续更新。 一、本文的一些说明 知识点梳理&#xff1a;我将PyTorch的核心概念和高级技巧进行了系统化的整理&#xff0c;从基础的张量操作到复杂的模型构建与训练。这样…

【Linux】进程终止与进程等待

目录 进程终止 errno exit和_exit 进程等待 wait和waitpid 宏&#xff1a;WIFEXITED 非阻塞等待 进程终止 下面要谈的一个话题就是进程终止&#xff0c;就是说一个进程退出了&#xff0c;可能有三种情况 1.进程代码执行完&#xff0c;结果是正确的 2.进程代码执行完&…

【九十二】【算法分析与设计】875. 爱吃香蕉的珂珂,410. 分割数组的最大值,机器人跳跃问题,二分答案法

875. 爱吃香蕉的珂珂 - 力扣&#xff08;LeetCode&#xff09; 珂珂喜欢吃香蕉。这里有 n 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉。警卫已经离开了&#xff0c;将在 h 小时后回来。 珂珂可以决定她吃香蕉的速度 k &#xff08;单位&#xff1a;根/小时&#xff09;。每…

【活动】开源与闭源大模型:探索未来趋势的双轨道路

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 开源与闭源大模型&#xff1a;探索未来趋势的双轨道路引言一、开源大模型&#…

翻译《The Old New Thing》- The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag

The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071128-00/?p24353 Raymond Chen 2007年11月28日 FORMAT_MESSAGE_IGNORE_INSERTS 标志的重要性 简要 文章讨论了使用FormatMes…

评估企业的业务是否存在高风险的六个步骤

风险的幽灵使得组织别无选择&#xff0c;只能改善各种网络风险的总体管理。以下是一个基于信息安全论坛的IRAM2方法论的分步过程&#xff0c;网络安全和风险从业者可以利用它来评估和管理信息风险。 第1步&#xff1a;范围界定练习 范围界定练习的目标是提供一个以业务为中心…

基于springboot+vue的招聘信息管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

K8s的常用命令以及yaml文件的创建

目录 一、声明式管理方法&#xff1a;YAML文件 1、yaml文件简介 2、yaml和json的主要区别&#xff1a; 3、YAML的语法格式 4、yaml文件组成部分 ①控制器定义 5、查看api资源版本标签 6、编写nginx-deployment.yaml资源配置清单 6.1创建资源对象 6.2查看创建的pod资源…

使用python将一段文本写入一个txt文件中且先格式化文件名

有一段文本内容&#xff0c;有“标题”和“内容”组成。 任务&#xff1a;要将这段文本&#xff0c;存放到一个txt文件中&#xff0c;文件名为当天的日期加上“标题”内容。因为“标题”内可能有/<>之类的&#xff0c;还需要格式化一下。 已经将上述功能都写成了函数&a…

安卓手机APP开发__近距离无线通信(NFC)概述

安卓手机&#xff21;&#xff30;&#xff30;开发&#xff3f;&#xff3f;近距离无线通信(NFC)概述 概述 近距离无线通信 (NFC) 是一组近距离无线技术&#xff0c;距离通常不超过 4 厘米才能 发起连接。通过 NFC&#xff0c;您可以在 NFC 标签和 Android 设备之间&#xf…

【Redis】 String类型的内部编码与使用环境

文章目录 &#x1f343;前言&#x1f334;内部编码&#x1f384;典型使用场景&#x1f6a9;缓存功能&#x1f6a9;计数&#xff08;Counter&#xff09;功能&#x1f6a9;共享会话&#xff08;Session&#xff09;&#x1f6a9;验证码功能 ⭕总结 &#x1f343;前言 本篇文章重…

Unity-Sprite Atlas+UGUI系统的运行原理

每日一句&#xff1a;别听世俗耳语&#xff0c;看自己的风景就好 目录 SA的原理&#xff1a; SA的优点&#xff1a; SA的缺点&#xff1a; DrawCall是什么&#xff1f; 批处理是什么&#xff1f; 我们先了解一下UGUI系统的运行原理吧&#xff01; 提到图集优化&#xff0…

cocosCreator动态生成二维码

cocosCreator 版本&#xff1a;3.7.2 开发语言&#xff1a;typeScript 我们在游戏开发中&#xff0c;经常会生成一个专属于玩家个人的二维码&#xff0c;比如说推广、充值等功能。 接到这个任务&#xff0c;在网上找了下&#xff0c;还是有很多教程的。但是这些教程大部分都是用…

Ollydbg动态分析MessageBoxA输出hellow world

一、目的 找到main函数找到调用的MessageBoxA函数 测试源码 #include <iostream> #include <windows.h>int main() {MessageBoxA(NULL, "Hellow World", "Title", MB_OK);return 1; }二、快捷键 指令快捷键说明RestartCtrlF2重新开始调试S…