当前位置: 首页 > 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;一个主机。每个端…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…...

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起&#xff0c;为了跨网段推流&#xff0c;千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…...

Electron简介(附电子书学习资料)

一、什么是Electron&#xff1f; Electron 是一个由 GitHub 开发的 开源框架&#xff0c;允许开发者使用 Web技术&#xff08;HTML、CSS、JavaScript&#xff09; 构建跨平台的桌面应用程序&#xff08;Windows、macOS、Linux&#xff09;。它将 Chromium浏览器内核 和 Node.j…...

持续交付的进化:从DevOps到AI驱动的IT新动能

文章目录 一、持续交付的本质&#xff1a;从手动到自动的交付飞跃关键特性案例&#xff1a;电商平台的高效部署 二、持续交付的演进&#xff1a;从CI到AI驱动的未来发展历程 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/101f72defaf3493ba0ba376bf09367a2.png)中国…...