C++面向对象编程之一:封装
C++面向对象编程三大特性为:封装,继承,多态。
C++认为万事万物皆为对象,对象有属性和行为。
比如:
游戏里的地图场景可以看作是长方形对象,属性场景id,有长,有宽,可能有NPC,可能有玩家,可能有怪物...,行为有设置长度,设置宽度,获取长度,获取宽度...
游戏里的玩家可以看作是对象,属性有玩家名字,血量,魔法值,攻击力,技能...,行为有上线下线,有行走,释放技能攻击怪物...
游戏里的怪物可以看作是对象,属性有怪物名字,血量,魔法值,攻击力,技能...,行为有释放技能攻击玩家,可能有行走...
具有相同属性和行为的对象,我们可以抽象称为类。
比如:
游戏里的地图场景属于场景类
游戏里的玩家属于玩家类
游戏里的怪物属于怪物类
将具有相同属性和行为的对象,抽象为类,并对属性和行为加以权限控制,来表现事物,我们称为封装。
定义一个类的语法:
class 类名
{权限控制:行为;权限控制:属性;
};example:设计一个怪物类,并创建一个怪物,设置怪物id,并打印这个怪物id。
#include <iostream>
using namespace std;class Monster
{//权限控制public://行为void setMonsterId(const int monsterId){m_monsterId = monsterId;}int getMonsterId(){return m_monsterId;}//权限控制private://属性int m_monsterId;
};int main(int argc, char *argv[])
{Monster m;m.setMonsterId(10001);cout << "怪物id = " << m.getMonsterId() << endl;return 0;
}
在设计类的时候,可以把属性和行为放在不同的权限下,控制属性和行为的访问权限。
访问权限有三种:
关键字 | 权限 | 访问控制 |
public | 公共权限 | 类内可以访问,类外也可以访问,子类可以访问 |
protected | 保护权限 | 类内可以访问,类外不可以访问,子类可以访问 |
private | 私有权限 | 类内可以访问,类外不可以访问,子类不可以访问 |
example:设计一个人类,有姓名,有车,有存款属性。人的姓名大家都可以知道的,我们可以设置为公共权限;人拥有一辆车,外人不能用,人的儿子女儿可以拿来用,我们可以设置为保护权限;人拥有多少存款,是私有的,只有自己可以访问。
#include <iostream>
using namespace std;class Person
{//公共权限public:void setName(const string name){m_name = name;}string getName(){return m_name;}void setCar(const string car){m_car = car;}string getCar(){return m_car;}void setMoney(const double money){m_money = money;}double getMoney(){return m_money;}string m_name;//保护权限protected:string m_car;//私有权限private:double m_money;
};int main(int argc, char *argv[])
{Person person;person.setName("Jim");person.setCar("劳斯莱斯");person.setMoney(1000000);cout << "姓名:" << person.m_name << endl; //正确:m_name是公共权限,类外可以访问cout << "姓名:" << person.getName() << endl; //正确:getName()是公共权限,类外可以访问//cout << "车:" << person.m_car << endl; //错误:m_car是保护权限,类外不可以访问cout << "车:" << person.getCar() << endl; //正确:getCar()是公共权限,类外可以访问//cout << "存款:" << person.m_money << endl; //错误:m_money是私有权限,类外不可以访问cout << "存款:" << person.getMoney() << endl; //错误:getMoney()是公共权限,类外可以访问return 0;
}
C++中类(class)和结构体(struct)的区别
在C++中,类(class)默认的访问权限为私有,结构体(struct)默认的访问权限为共有
#include <iostream>
using namespace std;class CMonster
{//没有声明访问权限,默认为私有void setMonsterId(const int monsterId){m_monsterId = monsterId;}int getMonsterId(){return m_monsterId;}int m_monsterId;
};struct SMonster
{//没有声明访问权限,默认为共有void setMonsterId(const int monsterId){s_monsterId = monsterId;}int getMonsterId(){return s_monsterId;}int s_monsterId;
};int main(int argc, char *argv[])
{CMonster cm;//cm.setMonsterId(10001); //错误:类默认访问权限为私有,类外不能访问//cm.m_monsterId = 10002; //错误:类默认访问权限为私有,类外不能访问SMonster sm;sm.setMonsterId(20001); //正确:结构体默认访问权限为共有,结构体外可以访问cout << "怪物id = " << sm.getMonsterId() << endl;sm.s_monsterId = 20002; //正确:结构体默认访问权限为共有,结构体外可以访问cout << "怪物id = " << sm.getMonsterId() << endl;return 0;
}在设计类的时候,应该将所有成员属性设置为private权限,这样可以自己写get和set方法控制属性的读写权限。可读可写属性,提供get属性方法和set属性方法;只读属性,提供get属性方法;只写属性,提供set属性方法。
#include <iostream>
using namespace std;class Monster
{//共有权限public://行为void setMonsterId(const int monsterId){m_monsterId = monsterId;}int getMonsterId(){return m_monsterId;}void setName(const string name){m_name = name;}string getName(){return m_name;}void setBlood(const int blood){m_blood = blood;}int getBlood(){return m_blood;}//私有权限private://属性int m_monsterId; //怪物idstring m_name; //怪物名字int m_blood; //血量
};int main(int argc, char *argv[])
{Monster m;m.setMonsterId(10001);m.setName("紫衣仙子");m.setBlood(1000);cout << "怪物id = " << m.getMonsterId() << ", 怪物名字 = " << m.getName() << ", 血量 = " << m.getBlood() << endl;return 0;
}
好了,关于C++面向对象三大特性之一:封装,先写到这。
相关文章:
C++面向对象编程之一:封装
C面向对象编程三大特性为:封装,继承,多态。C认为万事万物皆为对象,对象有属性和行为。比如:游戏里的地图场景可以看作是长方形对象,属性场景id,有长,有宽,可能有NPC&…...
IDEA插件系列(3):Maven Helper插件
一、引言在写Java代码的时候,我们可能会出现Jar包的冲突的问题,这时候就需要我们去解决依赖冲突了,而解决依赖冲突就需要先找到是那些依赖发生了冲突,当项目比较小的时候,还比较依靠IEDA的【Diagrams】查看依赖关系&am…...
SAP 更改物料基本计量单位
前言部分 在SAP中物料创建后,一旦发生业务,其基本计量单位便很难修改。由于单位无法满足业务要求,往往会要求新建一个物料替代旧物料。这时候除了要将旧物料上所有的未清业务删除外,还需要替换工艺与BOM中的旧物料。特别是当出现旧…...
蓝桥web基础知识学习
HTMLCSS 知识点重要指数HTML 基础标签🌟🌟🌟🌟🌟HTML5 新特性🌟🌟🌟🌟🌟HTML5 本地存储🌟🌟🌟🌟CSS 基础语法…...
Python+ChatGPT制作一个AI实用百宝箱
目录一、注册OpenAI二、搭建网站及其框架三、AI聊天机器人四、AI绘画机器人ChatGPT 最近在互联网掀起了一阵热潮,其高度智能化的功能能够给我们现实生活带来诸多的便利,可以帮助你写文章、写报告、写周报、做表格、做策划甚至还会写代码。只要与文字相关…...
Python中格式化字符串输出的4种方式
Python格式化字符串的4中方式 一、%号 二、str.format(args) 三、f-Strings 四、标准库模板 五、总结四种方式的应用场景’ 一、%号占位符 这是一种引入最早的一种,也是比较容易理解的一种方式.使用方式为: 1、格式化字符串中变化的部分使用占位符 2、…...
C#基础教程15 枚举与类
文章目录 C# 枚举(Enum)声明 enum 变量C# 类(Class)类的定义成员函数和封装C# 中的构造函数关键字 staticC# 枚举(Enum) 枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。 C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。 声明 enum 变…...
三步 让你的 vscode 自动编译ts文件
三步让你的 vscode 自动编译ts文件 TypeScript环境安装与如何在vscode实现自动编译ts文件? 文章目录三步让你的 vscode 自动编译ts文件前提条件环境安装自动编译运行监视任务时报错?前提条件 安装 node 环境 环境安装 tsc 作用:负责将ts 代码 转为 浏…...
STM32程序下载和启动方式
目录1 BOOT引脚配置和下载说明2 关于串口下载方式3 关于一按复位就跑代码4 关于下载调试速度5 关于三种启动方式5.1 FLASH启动5.2 系统存储器器启动5.3 SRAM启动6 关于程序的三种下载方式1 BOOT引脚配置和下载说明 BOOT0BOOT1程序运行ST-Link下载串口下载启动说明xx无0x√√用…...
基础01-ajax fetch axios 的区别
ajax fetch axios 的区别 题目 ajax fetch axios 的区别 分析 三者根本没有可比性,不要被题目搞混了。要说出他们的本质 传统 ajax AJAX (几个单词首字母,按规范应该大写) - Asynchronous JavaScript and XML(异…...
Android Execution failed for task ‘:app:mergeDebugJavaResource
错误提示 FAILURE: Build failed with an exception.* What went wrong: Execution failed for task :app:mergeDebugJavaResource. > A failure occurred while executing com.android.build.gradle.internal.tasks.MergeJavaResWorkAction> 2 files found with path k…...
spring事物源码分析
今天的任务是剖析源码,看看Spring 是怎么运行事务的,并且是基于当前最流行的SpringBoot。还有,我们之前剖析Mybatis 的时候,也知道,Mybatis 也有事务,那么,他俩融合之后,事务是交给谁…...
炫龙游戏本Win10系统总是蓝屏崩溃怎么办?
炫龙游戏本Win10系统总是蓝屏崩溃怎么办?有用户使用的炫龙游戏本最近总是在运行的过程中出现自动蓝屏的情况,有的时候自己还在操作电脑,而屏幕却蓝屏了,导致自己的工作被中断了。那么这个情况要怎么去进行修复呢?来看看…...
华为OD机试题,用 Java 解【数字加减游戏】问题
华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…...
C++ 手写一个高性能json生成与解析器
文章目录 前言一、了解json格式二、统一数据类型:TJson三、解析json数据四、输出json数据五、实现便利的修改与访问六、性能优化七、源码下载与解析前言 由于C++标准库中并不存在解析json数据库,但json格式又非常的常见 如今绝大部分网络数据传输都采用的json数据传输格式,…...
java——了解反射
目录 什么是反射? 反射如何获取类信息? 小结: 什么是反射? 反射是用代码分析类信息的能力 类中有哪些信息:方法、对象、构造器、全局变量、父类、接口等.... 反射如何获取类信息? 三种方式 1.通过对象…...
The Sandbox 中的独特体验——《奥米加》
在过去几年间,The Sandbox 游戏变得越来越受欢迎。因为我们为玩家提供了在虚拟世界中探索、创造和游戏的自由,没有线性游戏的限制。DeQuest 工作室创作的《奥米加》也正是如此,绝对是一个前所未有的体验! 先了解一下《奥米加》的故…...
76 Python写入csv文件时出现空行_newline参数解决
76 Python写入csv文件时出现空行_newline参数解决 文章目录76 Python写入csv文件时出现空行_newline参数解决1. 准备工作2. with open 语句没有newline参数3. with open 语句有newline参数4. 总结1. 准备工作 在电脑D盘新建一个【76】文件夹。 用VScode编辑器打开【76】文件夹…...
高等数学——定积分和不定积分
文章目录不定积分概念几何意义性质不定积分的基本公式三种主要积分法三类常见可积函数积分定积分概念几何意义性质积分上限的函数定积分的计算几何应用反常积分无穷区间的反常积分无界函数的反常积分不定积分 不定积分是导数的逆运算。 概念 原函数:设f(x)f(x)f(…...
imx6 usb增强信号强度
USB信号 参考:官方文档 USB信号完整性取决于许多因素,如电路设计、PCB布局、堆叠和阻抗。每个产品可能彼此不同,因此客户需要微调参数,以获得最佳的信号质量。 测试板已经路由出两个USB端口:一个OTG1,一个主机。每个端…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
