C++_CH13_面向对象编程

C++_CH13_面向对象编程

1.1 类

类(class)是数据和操作的组合。
我们以游戏角色为例,创建一个类

#include<iostream>class player//player这个类是我们自定义的一个类型
{int x;int y;//二维坐标int speed;//速度int power;//力量};int main()
{player KIMI; //创建了叫KIMI的角色,player是KIMI的数据类型KIMI.x = 10;KIMI.y = 9;//KIMI在二维平面的(10,9)这个点KIMI.power = 10000;//KIMI的力量有10000}

KIMI叫player这个class的一个实例(instance)
对instance内部修改,用 instance.xxx的语法。

但是该段代码报错,是因为x,y这样的class内部的东西,没有被声明是全局的,他只在class player内部起作用。因此我们要加上public

#include<iostream>class player//player这个类是我们自定义的一个类型
{
public:int x;int y;//二维坐标int speed;//速度int power;//力量};int main()
{player KIMI; //创建了叫KIMI的角色,player是KIMI的数据类型KIMI.x = 10;KIMI.y = 9;//KIMI在二维平面的(10,9)这个点KIMI.power = 10000;//KIMI的力量有10000}

有了player,我们就可以写player的移动函数。

#include<iostream>class player//player这个类是我们自定义的一个类型
{
public:int x;int y;//二维坐标int speed;//速度int power;//力量};void move(player& player,int xa,int ya)
{player.x += xa * player.speed; //移动距离乘以速度player.y += ya * player.speed;}int main()
{player KIMI; //创建了叫KIMI的角色,player是KIMI的数据类型move(KIMI,-1,+1)
}

我们也可以把move函数放到class里面,这样在class内的函数称为方法:

#include<iostream>class player//player这个类是我们自定义的一个类型
{
public:int x;int y;//二维坐标int speed;//速度int power;//力量void move(player& player,int xa,int ya) {player.x += xa * player.speed; //移动距离乘以速度player.y += ya * player.speed;}
};int main()
{player KIMI; //创建了叫KIMI的角色,player是KIMI的数据类型move(KIMI,-1,+1)
}

此时已经在class内了,所以player都可以删掉

#include<iostream>class player//player这个类是我们自定义的一个类型
{
public:int x;int y;//二维坐标int speed;//速度int power;//力量void move(int xa,int ya) {x += xa * speed; //移动距离乘以速度y += ya * speed;}
};int main()
{player KIMI; //创建了叫KIMI的角色,player是KIMI的数据类型player.move(-1,+1)
}

1.2类与结构体对比

区别在于类里面的数据和方法默认是private的,需要加public才能全局使用,而struct确是public的。如果想要使得一些是私有的,就在前面加private

#include<iostream>struct player//player这个类是我们自定义的一个类型
{int x;int y;//二维坐标int speed;//速度int power;//力量void move(int xa,int ya) {x += xa * speed; //移动距离乘以速度y += ya * speed;}
};int main()
{player KIMI; //创建了叫KIMI的角色,player是KIMI的数据类型player.move(-1,+1)
}

struct能够被C++保留下来的唯一原因,就是因为想要向下兼容C。因为C是没有class的。
因此啥时候使用类,啥时候使用struct,完全取决于自己的代码风格。

1.3 一种代码风格

封装一些变量的时候用struct。struct只是关于数据的结构。当然struct里能写一些方法,但是推荐的这种风格一般都不会这样做。

对于一些有方法的结构,或者有继承的结构(继承之后会讲到),一般用类。

1.4 一种应用类的实例——log类管理日志

日志展示有三个level:

警告 warn 
追踪 trace
错误 error

我们写一个log类,来管理日志,在我们调用时只需要set一个我们希望展示的level级别就可以看到是什么级别的日志。如何实现呢?我们要以需求带动生产,所以我们现在main函数里写需求

#include<iostream>class Log
{};int main()
{Log log; //创建一个Log类型的instance名字叫log‘log.SetLevel(LogLevelWarning);//使用log里的SetLevel方法,让我们输入希望展示的level层级log.warn("<WARNING>");//warn层级log.trace("INFO"); //追踪层级log.error("ERROR"); //错误层级}

有了需求,我们要做的就是往 class Log里面填空。

#include<iostream>class Log	
{
private://定义私有的一个变量,保存我们想要的log的levelint m_LogLevel;public:void Setlevel(int level){m_Loglevel = level;//把外部我们给的level给m_LogLevel}void warn(const char* message){}void trace(const char* message){}void error(const char* message){}
};int main()
{Log log; //创建一个Log类型的instance名字叫log‘log.SetLevel(LogLevelWarning);//使用log里的SetLevel方法,让我们输入希望展示的level层级log.warn("<WARNING>");//warn层级log.trace("INFO"); //追踪层级log.error("ERROR"); //错误层级}

写到这里我们可以看到level前面跟的是int,也就是说我们传的实参需要是int类型。那我们就可以这样规定:

warn: 0
trace: 1
error: 2

但是计算机不知道我们这样的规定。因此我们需要专门写一个变量,来储存这些规定。

#include<iostream>class Log	
{
public:const int LogLevelWarn = 0;const int LogLevelTrace = 1;const int LogLevelError = 2;private://定义私有的一个变量,保存我们想要的log的levelint m_LogLevel = LogLevelError;//默认定义为2public:void SetLevel(int level){m_LogLevel = level;//把外部我们给的level给m_LogLevel,对本来的2进行了修改}void warn(const char* message){if(m_LogLevel >= LogLevelWarn){std::cout<<"<WARN>"<<std::endl;}}void trace(const char* message){if(m_LogLevel >= LogLevelTrace){std::cout<<"<TRACE>"<<message<<std::endl;}}void error(const char* message){if(m_LogLevel >= LogLevelError){std::cout<<"<ERROR>"<<message<<std::endl;}}
};int main()
{Log log; //创建一个Log类型的instance名字叫log‘log.SetLevel(log.LogLevelError);//使用log里的SetLevel方法,让我们输入希望展示的level层级,修改这里的参数,填入我们想要的层级。log.warn("Hello");//warn层级log.trace("Hello"); //追踪层级log.error("Hello"); //错误层级}

SetLevel(log.LogLevelWarn)
output:

<WARN>

SetLevel(log.LogLevelTrace)

<WARN>
<TRACE>Hello

SetLevel(log.LogLevelError)

<WARN>
<TRACE>Hello
ERRORHello

这样就成功得到了一个日志类。

当然这样的代码显然是非常不规范的。但是他非常有逻辑。之后会逐渐修改,知道达到工业界水平。

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

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

相关文章

重载与重写:Java中方法的多态性

重载与重写&#xff1a;Java中方法的多态性 引言 在Java编程语言中&#xff0c;多态性是一个核心概念&#xff0c;它允许我们以统一的方式处理不同类型的对象。Java提供了两种实现多态性的方法&#xff1a;重载&#xff08;Overloading&#xff09;和重写&#xff08;Overrid…

面试经典算法150题系列-反转字符串中的单词

反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能…

react 中的useState useEffect

下面的这些hook我们常用的一些 useState useEffect useCallback、useMemo、useRef 和 useContex 下一个文章中讲述&#xff08;useCallback、useMemo、useRef 和 useContex&#xff09; 下面我将讲解什么时候使用是最好的 首先我们需要明确的一点是&#xff0c;这些hook都…

转-600条最强linux命令

一、基本命令 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作系统信息 arch 显示机器的处理器架构 uname -…

关于告警,要想做好,从这些方面着手

各类监控系统都会产生告警事件&#xff0c;于是&#xff0c;就产生了 FlashDuty、PagerDuty、Opsgenie 这类产品&#xff0c;做告警事件的收敛降噪、排班认领升级等。如果你想增强自己公司的告警事件处理能力&#xff0c;参考&#xff08;chao xi&#xff09;这些产品的功能就可…

使用统计方法在AMD GPU上使用JAX Profiler可靠地比较大型生成AI模型中的算法性能

Using statistical methods to reliably compare algorithm performance in large generative AI models with JAX Profiler on AMD GPUs — ROCm Blogs 摘要 本文提供了一份详细的指南&#xff0c;介绍如何在JAX实现的生成AI模型中测量和比较各种算法的性能。利用JAX Profiler…

35岁程序员的4条出路!请提早布局!

小编准备入门了Python入门学习籽料80个Python爬虫实战入门实例 点击 领取&#xff08;无偿获得&#xff09; 20多岁&#xff0c;初入职场&#xff0c;满腔热血&#xff0c;对未来充满憧憬&#xff1b; 30多岁&#xff0c;家庭事业双重压力&#xff0c;开始迷茫&#xff0c;对…

阿里云发送短信功能(Java)

&#xff08;1&#xff09;注册用户&#xff0c;并且开通短信套餐 &#xff08;2&#xff09; 点击快速学习&#xff0c;然后绑定测试的手机号码。 选用专用测试签名&#xff08;自定义的话阿里可能会验证什么什么的比较麻烦&#xff09; 然后在选取调用API &#xff08;3&…

10、Flink 动态表之表到流的转换详解

表到流的转换 动态表可以像普通数据库表一样通过 INSERT、UPDATE 和 DELETE 来不断修改,它可能是一个只有一行、不断更新的表,也可能是一个 insert-only 的表,没有 UPDATE 和 DELETE 修改,或者介于两者之间的其他表。 在将动态表转换为流或将其写入外部系统时,需要对这些…

3秒AI写真出图,Stable Diffusion2024升级版+使用教程来了!(无需安装,解压即用)

要说今年摄影圈最大的新秀 那妥妥的就Stable Diffusion 比如下面的写真照片 你敢信这是SD绘画生成的&#xff1f; 就在刚刚它又全面升级了 新版无需安装&#xff0c;直接解压就能用 比之前推送的更加智能、快速和简单 另外还特意为大家准备了 Stable Diffusion 人工智能…

故障诊断 | 基于小波时频图与Swin Transformer的轴承故障诊断方法(PyTorch)

文章目录 文章概述程序设计参考资料文章概述 基于小波时频图与Swin Transformer的轴承故障诊断方法 针对用传统的故障诊断方法难以对非线性非平稳的柴油机故障信号进行准确高效诊断的问题, 提出基于小波时频图与Swin Transformer的故障诊断方法。该方法可以有效结合小波时频分…

Git实战精粹

一、快速入门 1. 什么是Git Git是一个分布式的版本控制软件。 软件&#xff0c;类似于QQ、office、dota等安装到电脑上才能使用的工具版本控制&#xff0c;类似于毕业论文、写文案、视频剪辑等&#xff0c;需要反复修改和保留原历史数据分布式 文件夹拷贝本地版本控制集中式…

03-Python的运行方式

《Python 教程》总结 持续更新中&#xff0c;学习交流请加作者微信: python-baby 脚本和模块 脚本&#xff08;Scripts&#xff09; 在计算机术语中&#xff0c;脚本是指一个包含逻辑顺序的文本文件&#xff0c;我们可以运行脚本来完成特定任务。这些逻辑顺序通常用脚本语言…

如何在Java中使用protobuf

写在前面 本文看下在Java中如何使用protofbuf。 1&#xff1a;介绍 1.1&#xff1a;什么是protobuf 是一种数据格式&#xff0c;同json&#xff0c;xml&#xff0c;等。但是一种二进制数据格式。 1.2&#xff1a;强在哪里&#xff1f;为啥要用&#xff1f; 小&#xff0c…

org.apache.commons.lang.math.NumberUtils#isNumber 解释

源码 /*** <p>Checks whether the String a valid Java number.</p>** <p>Valid numbers include hexadecimal marked with the <code>0x</code>* qualifier, scientific notation and numbers marked with a type* qualifier (e.g. 123L).</…

JS中this的指向问题、JS的执行机制、offset、client、scroll

JS中this的指向问题 1. 在全局环境下 在全局环境中&#xff08;在浏览器中是 window 对象&#xff0c;在Node.js中是 global 对象&#xff09;&#xff0c;this 指向全局对象。 console.log(this window); // 在浏览器中为 true console.log(this.document ! undefined); //…

如何练高音技巧

如何练高音技巧 高音的练习技巧有&#xff1a;练“a”(啊)音&#xff0c;让口腔打开&#xff0c;声带放松&#xff0c;反复几次&#xff1b;再练“u”(呜)音&#xff0c;这个音可以有按摩声带的功能&#xff0c;也使声带进一步放松&#xff1b;发“i”(衣)音&#xff0c;逐步加…

缓存失效问题-雪崩/击穿/穿透

1. 缓存雪崩 1.1. 定义 大量缓存同一时间失效&#xff0c;大量访问数据库。 1.2. 发生条件 大量key相同过期时间缓存服务器重启 1.3. 解决方案 设置随机的缓存过期时间缓存预热高可用缓存集群降级限流 2. 缓存击穿 2.1. 定义 一个热点数据在缓存里失效&#xff0c;很多…

k8s 四种Service类型(ClusterIP、NodePort、LoadBalancer、ExternalName)详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、k8s概述 2、Service在Kubernetes中的…

大模型本地化部署2-Docker部署MaxKB

大模型本地化部署2-Docker部署MaxKB 0、MaxKB简介1、安装docker2、在docker中拉取MaxKB镜像3、运行镜像4、访问MaxKB5、创建应用6、使用应用进行对话 0、MaxKB简介 MaxKB是一款基于LLM大预言模型的知识库问答系统。具有以下特点&#xff1a; 多模型支持&#xff1a;支持对接主…