当前位置: 首页 > news >正文

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面向对象编程三大特性为&#xff1a;封装&#xff0c;继承&#xff0c;多态。C认为万事万物皆为对象&#xff0c;对象有属性和行为。比如&#xff1a;游戏里的地图场景可以看作是长方形对象&#xff0c;属性场景id&#xff0c;有长&#xff0c;有宽&#xff0c;可能有NPC&…...

IDEA插件系列(3):Maven Helper插件

一、引言在写Java代码的时候&#xff0c;我们可能会出现Jar包的冲突的问题&#xff0c;这时候就需要我们去解决依赖冲突了&#xff0c;而解决依赖冲突就需要先找到是那些依赖发生了冲突&#xff0c;当项目比较小的时候&#xff0c;还比较依靠IEDA的【Diagrams】查看依赖关系&am…...

SAP 更改物料基本计量单位

前言部分 在SAP中物料创建后&#xff0c;一旦发生业务&#xff0c;其基本计量单位便很难修改。由于单位无法满足业务要求&#xff0c;往往会要求新建一个物料替代旧物料。这时候除了要将旧物料上所有的未清业务删除外&#xff0c;还需要替换工艺与BOM中的旧物料。特别是当出现旧…...

蓝桥web基础知识学习

HTMLCSS 知识点重要指数HTML 基础标签&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;HTML5 新特性&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;HTML5 本地存储&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;CSS 基础语法…...

Python+ChatGPT制作一个AI实用百宝箱

目录一、注册OpenAI二、搭建网站及其框架三、AI聊天机器人四、AI绘画机器人ChatGPT 最近在互联网掀起了一阵热潮&#xff0c;其高度智能化的功能能够给我们现实生活带来诸多的便利&#xff0c;可以帮助你写文章、写报告、写周报、做表格、做策划甚至还会写代码。只要与文字相关…...

Python中格式化字符串输出的4种方式

Python格式化字符串的4中方式 一、%号 二、str.format(args) 三、f-Strings 四、标准库模板 五、总结四种方式的应用场景’ 一、%号占位符 这是一种引入最早的一种&#xff0c;也是比较容易理解的一种方式.使用方式为&#xff1a; 1、格式化字符串中变化的部分使用占位符 2、…...

C#基础教程15 枚举与类

文章目录 C# 枚举(Enum)声明 enum 变量C# 类(Class)类的定义成员函数和封装C# 中的构造函数关键字 staticC# 枚举(Enum) 枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。 C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。 声明 enum 变…...

三步 让你的 vscode 自动编译ts文件

三步让你的 vscode 自动编译ts文件 TypeScript环境安装与如何在vscode实现自动编译ts文件? 文章目录三步让你的 vscode 自动编译ts文件前提条件环境安装自动编译运行监视任务时报错&#xff1f;前提条件 安装 node 环境 环境安装 tsc 作用&#xff1a;负责将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 的区别 分析 三者根本没有可比性&#xff0c;不要被题目搞混了。要说出他们的本质 传统 ajax AJAX &#xff08;几个单词首字母&#xff0c;按规范应该大写&#xff09; - Asynchronous JavaScript and XML&#xff08;异…...

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事物源码分析

今天的任务是剖析源码&#xff0c;看看Spring 是怎么运行事务的&#xff0c;并且是基于当前最流行的SpringBoot。还有&#xff0c;我们之前剖析Mybatis 的时候&#xff0c;也知道&#xff0c;Mybatis 也有事务&#xff0c;那么&#xff0c;他俩融合之后&#xff0c;事务是交给谁…...

炫龙游戏本Win10系统总是蓝屏崩溃怎么办?

炫龙游戏本Win10系统总是蓝屏崩溃怎么办&#xff1f;有用户使用的炫龙游戏本最近总是在运行的过程中出现自动蓝屏的情况&#xff0c;有的时候自己还在操作电脑&#xff0c;而屏幕却蓝屏了&#xff0c;导致自己的工作被中断了。那么这个情况要怎么去进行修复呢&#xff1f;来看看…...

华为OD机试题,用 Java 解【数字加减游戏】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…...

C++ 手写一个高性能json生成与解析器

文章目录 前言一、了解json格式二、统一数据类型:TJson三、解析json数据四、输出json数据五、实现便利的修改与访问六、性能优化七、源码下载与解析前言 由于C++标准库中并不存在解析json数据库,但json格式又非常的常见 如今绝大部分网络数据传输都采用的json数据传输格式,…...

java——了解反射

目录 什么是反射&#xff1f; 反射如何获取类信息&#xff1f; 小结&#xff1a; 什么是反射&#xff1f; 反射是用代码分析类信息的能力 类中有哪些信息&#xff1a;方法、对象、构造器、全局变量、父类、接口等.... 反射如何获取类信息&#xff1f; 三种方式 1.通过对象…...

The Sandbox 中的独特体验——《奥米加》

在过去几年间&#xff0c;The Sandbox 游戏变得越来越受欢迎。因为我们为玩家提供了在虚拟世界中探索、创造和游戏的自由&#xff0c;没有线性游戏的限制。DeQuest 工作室创作的《奥米加》也正是如此&#xff0c;绝对是一个前所未有的体验&#xff01; 先了解一下《奥米加》的故…...

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】文件夹…...

高等数学——定积分和不定积分

文章目录不定积分概念几何意义性质不定积分的基本公式三种主要积分法三类常见可积函数积分定积分概念几何意义性质积分上限的函数定积分的计算几何应用反常积分无穷区间的反常积分无界函数的反常积分不定积分 不定积分是导数的逆运算。 概念 原函数&#xff1a;设f(x)f(x)f(…...

imx6 usb增强信号强度

USB信号 参考&#xff1a;官方文档 USB信号完整性取决于许多因素&#xff0c;如电路设计、PCB布局、堆叠和阻抗。每个产品可能彼此不同&#xff0c;因此客户需要微调参数&#xff0c;以获得最佳的信号质量。 测试板已经路由出两个USB端口:一个OTG1&#xff0c;一个主机。每个端…...

Xray漏洞扫描工具进阶实战:从配置优化到企业级部署

1. Xray工具深度调优&#xff1a;从基础配置到性能极限 第一次用Xray做全站扫描时&#xff0c;我盯着卡在63%的进度条整整两小时&#xff0c;直到发现是默认线程数把系统资源吃光了。这个教训让我意识到&#xff0c;会运行扫描和真正用好扫描工具完全是两回事。下面分享的调优方…...

2026年了,为什么很多企业做了智慧气象,结果还是没把风险降下来?

上个月&#xff0c;和一位新能源集团的运营负责人聊天&#xff0c;他抛出一个百思不得其解的问题&#xff1a;“我们花了300多万上了智慧气象系统&#xff0c;接了精细化预报&#xff0c;预警信息每天推送到手机、电脑、大屏&#xff0c;三个渠道同步。结果上个月一场雷暴&…...

nanobot应用场景:用Qwen3-4B构建Linux运维助手,自动解析nvidia-smi输出

nanobot应用场景&#xff1a;用Qwen3-4B构建Linux运维助手&#xff0c;自动解析nvidia-smi输出 1. 项目介绍&#xff1a;超轻量级AI运维助手 nanobot是一款受OpenClaw启发的超轻量级个人人工智能助手&#xff0c;专门为Linux运维场景设计。这个工具最大的特点是轻量高效&…...

SolveSpace:参数化 CAD 软件网页版的实验性突破

【导语&#xff1a;SolveSpace 作为一款参数化二维/三维 CAD 软件&#xff0c;推出了实验性网页版。虽存在速度损失和未解决的 bug&#xff0c;但处理小模型时体验不错&#xff0c;为 CAD 软件的使用带来新可能。】小巧 CAD 软件的网页版尝试SolveSpace 主要以普通桌面软件形式…...

千问3.5-2B在物流场景:运单图片自动识别+收发件信息结构化

千问3.5-2B在物流场景&#xff1a;运单图片自动识别收发件信息结构化 1. 物流行业的痛点与机遇 每天&#xff0c;物流企业需要处理数以百万计的运单信息录入工作。传统的人工录入方式存在三个明显问题&#xff1a; 效率低下&#xff1a;一个熟练的录入员每小时最多处理50-80…...

别再只用ZF和MMSE了!手把手教你用MATLAB实现ML信号检测(附完整代码与性能对比)

突破传统线性检测&#xff1a;MATLAB实战ML信号检测全解析 在无线通信系统的接收端设计领域&#xff0c;信号检测算法的选择直接影响着系统性能与实现复杂度之间的平衡。许多初学者往往止步于迫零(ZF)和最小均方误差(MMSE)这两种线性检测方法&#xff0c;却忽视了最大似然(ML)检…...

Qwen3.5-9B-AWQ-4bit实战教程:用‘概括最重要信息’提示词压缩冗余输出

Qwen3.5-9B-AWQ-4bit实战教程&#xff1a;用"概括最重要信息"提示词压缩冗余输出 1. 认识Qwen3.5-9B-AWQ-4bit模型 Qwen3.5-9B-AWQ-4bit是一个强大的多模态AI模型&#xff0c;它能同时理解图片和文字。想象一下&#xff0c;你给这个AI看一张照片&#xff0c;然后问…...

利用kimi与快马平台,十分钟搭建个人博客web应用原型

最近想快速验证一个个人博客的创意&#xff0c;但自己从头写代码太费时间。尝试用InsCode(快马)平台的Kimi模型生成原型&#xff0c;没想到十分钟就搞定了可运行的Web应用&#xff0c;分享下这个高效流程&#xff1a; 明确需求梳理结构 先花2分钟在纸上画了博客的基本框架&…...

还在用老方法显示数据?手把手教你用MFC的CListCtrl打造一个带图标的学生信息查询系统

实战MFC&#xff1a;用CListCtrl构建可视化学生管理系统 在桌面应用开发领域&#xff0c;数据展示一直是用户体验的核心环节。传统的表格控件虽然能完成基本功能&#xff0c;但缺乏视觉层次和交互灵活性。MFC中的CListCtrl控件提供了四种视图模式&#xff0c;特别适合需要同时呈…...

鸿蒙 ArkTS 高级样式复用:@Extend 装饰器完全解析(比 @Styles 更强大)

&#x1f525;前言&#xff1a;在上一篇文章《鸿蒙 ArkTS 样式复用&#xff1a;Styles 装饰器从入门到实战》中&#xff0c;我们学习了使用 Styles 实现基础样式复用。 但 Styles 不支持传参、不能使用组件专有属性&#xff0c;在复杂 UI 场景下能力有限。 &#x1f4cc; 本文…...