C++ 面向对象-封装

C++ 是一种多范式编程语言,它支持面向对象编程(OOP)范式。面向对象编程是一种程序设计思想,其中程序由对象组成,每个对象都是一个实例,具有数据和相关操作。在C++中,实现面向对象编程主要通过类和对象。

  1. 类(Class):类是一种用户定义的数据类型,用于封装数据和操作。类可以看作是对象的蓝图或模板,描述了对象的属性(成员变量)和行为(成员函数)。

C++ 中的类是一种用户定义的数据类型,用于封装数据和相关操作。类可以看作是一种模板,描述了数据的结构和如何对数据进行操作。在类中,可以定义成员变量(数据)和成员函数(操作)。这样的封装使得数据更安全,也更易于维护和重用。
类的简单实例:

类可以在头文件中进行定义,也可以在源文件中进行定义。

class RolePlayer {
public:
    double m_PosX;
    double m_PosY;
​
private:
    char * m_NPCName;
    int m_nHP;
};

在源文件中进行实例化:

    RolePlayer role;

在C++中,实例化是指创建一个类的对象。通过实例化,你可以使用类中定义的成员变量和成员函数。获得实例化对象就能够对成员变量或成员函数进行访问。

2.对象(Object):对象是类的一个实例,具有类中定义的属性和行为。通过实例化类,可以创建对象,并 在程序中使用它们。

在类中我定义了4个成员变量,但是此时我只能访问两个,这就涉及到成员的访问权限;在C++中,类的成员(包括成员变量和成员函数)可以通过访问权限属性进行限制。这些属性控制了成员在类内和类外的可见性和访问权限。主要的访问权限属性包括:

1.public: 公有成员可以在类的内部和外部被访问。这意味着类的对象以及类的成员函数可以访问公有成员;

上述示例中RolePlayer类中的公有成员:

public:
    double m_PosX;
    double m_PosY;

2.private: 私有成员只能在类的内部被访问,类的外部无法直接访问私有成员。即使是类的其他成员函数也不能直接访问私有成员。所有成员默认是私有的。

上述示例中RolePlayer类中的私有成员:

private:
    char * m_NPCName;
    int m_nHP;

3.protected: 受保护成员可以在类的内部被访问,也可以在派生类中被访问,但在类的外部无法直接访问受保护成员。

补充:

派生类:是通过继承一个或多个已存在的类来创建的新类。派生类继承了其基类(也称为父类或超类)的特性,包括成员变量和成员函数,并且可以添加新的成员变量和成员函数。这种继承机制允许在不重复编写相同代码的情况下,扩展和修改现有类的功能。

在RolePlayer类中添加受保护的成员:

protected:
    int m_PP;

发现在实例化出来的role对象中依旧无法进行访问;

事实上若是要对私有成员或者受保护成员进行修改,一般来说会在提供一个公共成员函数接口进行成员的修改或访问;如此时我要对私有成员变量进行赋值(修改)或访问,那么此时就可以编辑一个公共的赋值(修改)函数或和一个公共的访问函数;受保护成员变量同理。

public:
    //修改:
    void SetHP(int HP) {
        m_nHP = HP;
    }
​
    //访问:
    int GetHP() {
        return m_nHP;
    }
成员函数的使用:
    RolePlayer role;
    role.m_PosX = 3.222;
    role.m_PosY = 3.233;
​
    role.SetHP(44);
    std::cout << role.GetHP() << std::endl;

role.SetHP(44);对role对象的m_nHP 进行传值,传入的值为44;

role.GetHP():获取role对象的m_nHP值,获得的值为44;

在类中也可以定义对象相关的行为,如我在类中定义Attack()方法

此时IDE会自动在与头文件同名的.cpp文件中进行行为方法的定义;

此时我们可以注意到IDE自动就将类的类名设置为Attack()方法的命名空间,事实上,在某种程度上,类可以被视为一个单独的命名空间,但它们并不完全等同于命名空间。

总结:

这些权限属性允许你控制成员的访问级别,从而提高了封装性和安全性。通常情况下,成员变量应该被声明为私有的,而成员函数可以根据需要选择公有、私有或受保护。

上述内容就涉及到C++面向对象编程的第一大特性----封装。

封装(Encapsulation):封装是一种将数据和操作绑定在一起的机制,通过将数据成员声明为私有的并提供公有的成员函数来实现。这样可以隐藏数据的具体实现细节,并确保数据的安全性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3、 Vue2 Diff算法比较

Vue2 Diff算法 源码位置:src/core/vdom/patch.ts 源码所在函数:updateChildren() 源码讲解: 有新旧两个节点数组:oldCh和newCh; 有下面几个变量: oldStartIdx 初始值=0 oldStartVnode 初始值=oldCh[0] oldEndIdx 初始值=oldCh.length - 1 oldEndVnode 初始值=oldCh[ol…

如何在PostgreSQL中设置定期任务(如定时备份、数据分析等),并使用pgAgent或其他方式实现

文章目录 使用pgAgent实现定期任务步骤一&#xff1a;安装pgAgent步骤二&#xff1a;配置pgAgent步骤三&#xff1a;创建和调度任务示例代码&#xff1a; 使用操作系统的任务调度功能实现定期任务步骤一&#xff1a;编写脚本步骤二&#xff1a;设置cron任务示例代码&#xff1a…

ssh日志的独立与ssh远程日志

日志相关介绍&#xff1a; 1.系统日志&#xff1a;是记录了历史事件&#xff1a;包括时间地点人物事件等。日志级别&#xff1a;事件的关键性程度&#xff0c;Loglevel。 级号消息级别说明0EMERG紧急会导致主机系统不可用的的情况1ALERT警告必须马上采取措施解决的问题2CRIT严…

vue3实现全局事件总线

1、vue3中使用全局事件总线是变化最大的。在vue2中&#xff0c;我们在new Vue中在beforeCreate钩子函数中使用vue.prototype.$busthis来创建全局事件总线。vue3中我需要借助第三方库来完成创建全局事件总线。 2、安装依赖 npm i mitt -s3、封装event-bus.js文件 import mitt …

【白菜学习问问问系列】if __name__ == ‘__main__‘:怎么理解

可以让.py文件既可以当成一个模块调用&#xff0c;也可以单独的作为一个函数执行

【基础算法】双指针

1.移动零 移动零 思路&#xff1a; 利用双指针算法 cur&#xff1a;从左往右扫描数组&#xff0c;遍历数组 dest&#xff1a;处理好的区间包括dest dest初始化为-1&#xff0c;因为刚开始dest前应该没有非零元素。 即将非零元素移到dest之前即可 class Solution { public…

2016年新华三杯复赛实验试题

2016年新华三杯复赛实验试题 拓扑图 配置需求 考生根据以下配置需求在 HCL 中的设备上进行相关配置。 以太网接口配置 将 S1、S2 的以太网接口 G1/0/1 至 G1/0/16 的模式用命令 combo enable copper 激活为电口。 虚拟局域网 为了减少广播&#xff0c;需要规划并配置 VLA…

浏览器工作原理与实践--HTTPS:浏览器如何验证数字证书

你好&#xff0c;我是李兵。 在《HTTPS&#xff1a;让数据传输更安全》这篇文章中&#xff0c;我们聊了下面几个问题&#xff1a; HTTPS使用了对称和非对称的混合加密方式&#xff0c;这解决了数据传输安全的问题&#xff1b; HTTPS引入了中间机构CA&#xff0c;CA通过给服务器…

重生奇迹mu卷轴有什么用

问题一&#xff1a;重生奇迹mu里面的国王卷轴有什么用啊?创造宝石怎么用啊?国王卷不晓得~~宝石用来创造果实的。&#xff08;属性果实&#xff09; 问题二&#xff1a;请问重生奇迹mu里国王卷轴去哪弄&#xff1f;天空之城有&#xff0c;废墟1和2也有&#xff0c;遗址230也有…

付费SSL证书比免费SSL证书好在哪?

1. 身份证明更权威&#xff1a;付费证书可进行深度身份验证&#xff0c;让访客知道你的网站是真实、合法的公司运营&#xff0c;尤其高级证书能在浏览器地址栏显示公司名&#xff0c;让人一看就放心。 2. 适用范围广&#xff1a;有单域名、多域名、通配符等多种证书类型&#x…

基于SpringBoot的“幼儿园管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“幼儿园管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 个人信息界面图 缴费信息管理界…

重温javascript --(一)值的介绍

值的介绍 一、 值类型&#xff1a; 原始值 stack栈: 遵循后进先出原则&#xff0c;中主要存放一些基本类型的变量和对象的引用。如&#xff1a;Number String Boolean undefined null symbol BigInt 栈内不可修改值&#xff0c;内存满才会实现二次值覆盖 引用值 heap堆&#x…

C盘满了如何清理

1.更改位置 &#xff08;1&#xff09;找到要更改的用户 &#xff08;2&#xff09;找到要更改的部分&#xff0c;右键点击“属性” &#xff08;3&#xff09;选择“位置”——“移动”——选择要移动的盘及地方 点击“确定”——“是”&#xff0c;等待迁移完成

STL_vector源码剖析

STL vector STL2.91源码地址: https://github.com/lewischeng-ms/sgi-stl 侯捷老师用的是 2.91,不同版本的STL差异很大&#xff0c;靠后版本的STL用了太多typedef以及继承关系&#xff0c;导致可读性很差。 本文参考博客: https://blog.csdn.net/weixin_45389639/article/detai…

Docker NetWork (网络)

Docker 为什么需要网络管理 容器的网络默认与宿主机及其他容器都是相互隔离的&#xff0c;但同时我们也要考虑下面的一些问题&#xff0c; 比如 多个容器之间是如何通信的容器和宿主机是如何通信的容器和外界主机是如何通信的容器中要运行一些网络应用(如 nginx、web 应用、数…

【Linux系统编程】第七弹---权限管理操作(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、修改文件权限的做法(一) 2、有无权限的表现 总结 上一弹我们讲解了Linux权限概念相关的知识&#xff0c;但是我们只知道有…

设计模式学习笔记 - 开源实战四(中):剖析Spring框架中用来支持扩展的设计模式

概述 上篇文章&#xff0c;学习了 Spring 框架背后蕴含的设计思想&#xff0c;比如约定优于配置、低侵入松耦合、模块化轻量级等等。这些设计思想可以借鉴到其他框架开发中&#xff0c;在大的设计层面提高框架的代码质量。 除了上篇文章降到的设计思想&#xff0c;实际上&…

yolov8 裁剪检测结果

yolov8 裁剪检测结果 1. 基础2. 图片批量裁剪2.1 检测裁剪2.2 分割裁剪 3. 视频裁剪3.1 检测裁剪3.2 分割裁剪3.3 实时裁剪 4. 源码 1. 基础 本项目是在 WindowsYOLOV8环境配置 的基础上实现的 思路&#xff1a;将检测得到的物体边框提取&#xff0c;然后边框裁剪原图&#xf…

Python网络数据抓取(3):Requests

引言 在这一部分&#xff0c;我们将探讨Python的requests库&#xff0c;并且利用这个库来进行网页数据抓取。那么&#xff0c;我们为何需要这个库&#xff0c;以及怎样利用它呢&#xff1f; requests库是广受大家欢迎的一个库&#xff0c;它是下载次数最多的。这个库使我们能够…

直流负载在新能源领域的作用有哪些

直流负载在新能源领域的作用主要体现在以下几个方面&#xff1a; 新能源如太阳能、风能等&#xff0c;其发电过程中产生的电能为直流电。传统的电力系统主要采用交流电&#xff0c;因此在新能源并网时需要进行逆变器转换。然而&#xff0c;逆变器在转换过程中会存在一定的能量损…