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

【C++漂流记】一文搞懂类与对象的封装

本篇文章主要说明了类与对象中封装的有关知识,包括属性和行为作为整体、访问权限、class与struct的区别、成员属性的私有化,希望这篇文章可以帮助你更好的了解类与对象这方面的知识。
在这里插入图片描述


文章目录

    • 一、属性和行为作为整体
    • 二、访问权限
    • 三、class与struct的区别
    • 四、成员属性私有化


一、属性和行为作为整体

封装是面向对象编程中的一种特性,它将数据和操作数据的方法组合在一起,形成一个类。封装的目的是将数据和方法进行包装,使其成为一个独立的实体,外部只能通过类提供的接口来访问和操作数据,而不需要了解内部的实现细节。

示例:

class Circle {
private:double radius;public:void setRadius(double r) {radius = r;}double getRadius() {return radius;}double getArea() {return 3.14 * radius * radius;}
};

在上面的示例中,我们定义了一个名为Circle的类,它具有一个私有的属性radius和三个公有的方法setRadiusgetRadiusgetArea

  • 属性:属性是类中的变量,用于存储对象的状态。在示例中,radiusCircle类的私有属性,只能通过类的方法来进行访问和修改。

  • 行为:行为是类中的方法,用于操作对象的状态。在示例中,setRadius方法用于设置radius的值,getRadius方法用于获取radius的值,getArea方法用于计算圆的面积。

通过封装,我们将属性和行为组合在一起,形成了一个完整的圆对象。外部代码只能通过类的公有方法来访问和操作圆的属性,而不需要知道属性的具体实现细节。这样可以提高代码的可维护性和安全性,同时也方便了代码的重用。


二、访问权限

同样以上面为示例

在示例中,属性radius被声明为私有(private)。私有属性只能在类的内部访问,外部代码无法直接访问或修改私有属性的值。这是通过使用访问修饰符(private, public, protected)来实现的。

私有属性和方法只能在类的内部使用,对外部是不可见的。这种封装的好处是可以隐藏类的内部实现细节,提高代码的安全性和可维护性。

示例解释:

在示例中,radius属性被声明为私有,这意味着外部代码无法直接访问radius属性。为了访问和修改radius的值,我们提供了公有的setRadiusgetRadius方法。通过setRadius方法,外部代码可以传递一个新的半径值来修改radius的值;通过getRadius方法,外部代码可以获取radius的当前值。

Circle circle;
circle.setRadius(5.0); // 通过公有方法setRadius设置radius的值为5.0
double radius = circle.getRadius(); // 通过公有方法getRadius获取radius的值

在上面的示例中,外部代码无法直接访问circle对象的radius属性,而是通过公有方法setRadiusgetRadius来间接访问和修改radius的值。这样可以确保radius属性的访问和修改是受控的,同时隐藏了radius属性的具体实现细节。


三种访问权限修饰符

在C++中,有三种访问权限修饰符:privateprotectedpublic。这些修饰符用于控制类的成员(属性和方法)对外部的可见性和可访问性。

  1. private(私有):私有成员只能在类的内部访问,外部代码无法直接访问或修改私有成员的值。私有成员的目的是隐藏类的内部实现细节,提高代码的安全性和封装性。

  2. protected(保护):保护成员在类的内部和派生类中可访问,但对外部是不可见的。保护成员的目的是在继承关系中提供一定的访问权限,使派生类能够继承和访问基类的成员。

  3. public(公有):公有成员可以在类的内部和外部访问。公有成员没有访问限制,可以被任何代码访问和修改。

这些访问权限修饰符可以应用于类的成员(属性和方法)的声明。默认情况下,类的成员是私有的。


三、class与struct的区别

在C++中,classstruct是用于定义自定义数据类型的关键字。它们之间的主要区别在于默认的成员访问权限和默认的继承权限。

  1. 成员访问权限:
  • class:默认的成员访问权限是私有(private)
  • struct:默认的成员访问权限是公有(public)

这意味着在class中声明的成员(属性和方法)默认是私有的,只能在类的内部访问。而在struct中声明的成员默认是公有的,可以在类的内部和外部访问。

示例:

class MyClass {int x;  // 默认为私有(private)void foo();  // 默认为私有(private)
};struct MyStruct {int x;  // 默认为公有(public)void foo();  // 默认为公有(public)
};
  1. 继承权限:
  • class:默认的继承权限是私有继承(private inheritance)
  • struct:默认的继承权限是公有继承(public inheritance)

这意味着在class中继承的成员默认是私有继承的,派生类只能访问基类的公有和保护成员。而在struct中继承的成员默认是公有继承的,派生类可以访问基类的公有、保护和私有成员。

继承部分会在下一篇文章详细的说明,可以前往我主页订阅专栏,每天一个C++知识点

示例:

class BaseClass {// ...
};class DerivedClass : BaseClass {// 默认为私有继承(private inheritance)
};struct BaseStruct {// ...
};struct DerivedStruct : BaseStruct {// 默认为公有继承(public inheritance)
};

除了上述区别之外,classstruct在语法上没有其他差异,它们可以具有相同的成员、方法和功能。选择使用class还是struct取决于个人偏好和代码的语义。一般来说,如果定义的是一个拥有私有成员和实现细节的复杂数据类型,通常会使用class;如果定义的是一个简单的数据容器或数据结构,通常会使用struct


四、成员属性私有化

将类的成员属性私有化是一种常见的编程实践,它可以提供更好的封装性和数据安全性。私有成员属性只能在类的内部访问,外部代码无法直接访问或修改私有属性的值。这样可以隐藏类的内部实现细节,防止外部代码对属性的误操作或非法访问。

在C++中,可以使用访问权限修饰符来设置成员属性的访问权限。通过将属性声明为私有(private),可以将其限制为只能在类的内部访问。私有属性通常通过公有的成员函数(例如getterssetters)来间接访问和修改。

示例代码:

class MyClass {
private:int privateAttribute;  // 私有属性public:// 公有成员函数用于访问和修改私有属性int getPrivateAttribute() {return privateAttribute;}void setPrivateAttribute(int value) {privateAttribute = value;}
};

在上述示例中,privateAttribute被声明为私有属性,外部代码无法直接访问。通过公有的getPrivateAttribute()setPrivateAttribute()函数,可以间接地访问和修改私有属性的值。

私有化成员属性的好处包括:

  • 隐藏类的内部实现细节,提高代码的封装性和安全性。
  • 通过公有的成员函数来控制对私有属性的访问和修改,可以进行数据验证和处理。
  • 允许在不改变类的接口的情况下,修改属性的实现细节。

相关文章:

【C++漂流记】一文搞懂类与对象的封装

本篇文章主要说明了类与对象中封装的有关知识,包括属性和行为作为整体、访问权限、class与struct的区别、成员属性的私有化,希望这篇文章可以帮助你更好的了解类与对象这方面的知识。 文章目录 一、属性和行为作为整体二、访问权限三、class与struct的区…...

ctfshow 反序列化

PHP反序列化前置知识 序列化和反序列化 对象是不能在字节流中传输的,序列化就是把对象转化为字符串以便存储和传输,反序列化就是将字符串转化为对象 魔术方法 __construct() //构造,当对象new时调用 __wakeup() //执行unserialize()时&am…...

数据结构:线性表之-单向链表(无头)

目录 什么是单向链表 顺序表和链表的区别和联系 顺序表: 链表: 链表表示(单项)和实现 1.1 链表的概念及结构 1.2单链表(无头)的实现 所用文件 将有以下功能: 链表定义 创建新链表元素 尾插 头插 尾删 头删 查找-给一个节点的…...

为IT服务台构建自定义Zia操作

Zia是manageengine的商业人工智能助手,是ServiceDesk Plus Cloud的虚拟会话支持代理。使用Zia,您可以优化帮助台管理,还可以缩小最终用户与其帮助台之间的差距,Zia通过执行预配置的操作来帮助用户完成他们的服务台任务。 例如&…...

【C/C++】BMP格式32位转24位

问题 如题 解决方法 bmp文件格式参考:【C/C++】BITMAP格式分析_vc++ bitmap头文件_sunriver2000的博客-CSDN博客BITMAP文件大体上分成四个部分,如下表所示。文件部分长度(字节)位图文件头 Bitmap File Header14位图信息数据头 Bitmap Info Header40调色板 Palette4*n (n≥…...

合宙Air724UG LuatOS-Air LVGL API控件-滑动条 (Slider)

滑动条 (Slider) 滑动条看起来和进度条是有些是有些像,但不同的是滑动条可以进行数值选择。 示例代码 -- 回调函数 slider_event_cb function(obj, event)if event lvgl.EVENT_VALUE_CHANGED then local val (lvgl.slider_get_value(obj) or "0")..&…...

SQLAlchemy 封装的工具类,数据库pgsql(数据库连接池)

1.SQLAlchemy是什么? SQLAlchemy 是 Python 著名的 ORM 工具包。通过 ORM,开发者可以用面向对象的方式来操作数据库,不再需要编写 SQL 语句。 SQLAlchemy 支持多种数据库,除 sqlite 外,其它数据库需要安装第三方驱动。…...

【Git】Git 基础

Git 基础 参考 Git 中文文档 — https://git-scm.com/book/zh/v2 1.介绍 Git 是目前世界上最先进的分布式版本控制系统,有这么几个特点: 分布式:是用来保存工程源代码历史状态的命令行工具保存点:保存点可以追溯源码中的文件…...

腾讯云AI绘画:探究AI创意与技术的新边界

目录 一、2023的“网红词汇”——AI绘画二、智能文生图1、智能文生图的应用场景2、风格和配置的多样性3、输入一段话,腾讯云AI绘画给你生成一张图4、文本描述生成图像,惊艳全场 三、智能图生图:重新定义图像美学1、智能图生图的多元应用场景2…...

离线数仓同步数据1

用户行为表数据同步 2.1.4 日志消费Flume测试 [gpbhadoop104 ~]$ cd /opt/module/flume/ [gpbhadoop104 flume]$ cd job/ [gpbhadoop104 job]$ rm file_to_kafka.confcom.atguigu.gmall.flume.interceptor.TimestampInterceptor$Builder #定义组件 a1.sourcesr1 a1.channelsc1…...

c语言开篇---跟着视频学C语言

标识符 标识符必须声明定义,可以是变量、函数或其他实体。 Int是标识符吗? 不是,int是c语言关键词,不是随意命名的 C语言关键词如下: 常量 不需要被声明,不能赋值更改。 printf函数 printf是由print打印…...

本地yum源-如学

学不学? 如学~ 到底学不学? 如学~ 学? 如学~ 配置本地的镜像yum 使用到的 rpm 包 是根据centos8 里面自带的 在 /dev/cdrom 中包含着 一些系统自带的 rpm # 先将 /dev/cdrom 设备进行挂载 mkdir /up # 在…...

【实训】“宅急送”订餐管理系统(程序设计综合能力实训)

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 🌝每一个不曾起舞的日子,都是对生命的辜负 前言 大一小学期,我迎来了人生中的第一次实训…...

openeuler上安装polarismesh集群

1、安装MySQL数据库 数据库连接地址10.10.10.168 用户root 密码123456 MySQL安装参考搭建DSS环境(六)之安装基础环境MySQL_linux安装dss_青春不流名的博客-CSDN博客 2、安装Redis集群 IPResid PORTSentinel PORTPASSWORDCluster NAME10.10.10.110637…...

Java基础——stream

流 stream是什么&#xff1f;stream优点stream和集合的区别stream的创建steam的操作从steam中取值 stream是什么&#xff1f; stream可以简化对集合的操作&#xff0c;具体操作由流内部实现&#xff0c;而无需用户自行实现过程 stream优点 对于以下ArrayList List<Strin…...

Spring Quartz 持久化解决方案

Quartz是实现了序列化接口的&#xff0c;包括接口&#xff0c;所以可以使用标准方式序列化到数据库。 而Spring2.5.6在集成Quartz时却未能考虑持久化问题。 Spring对JobDetail进行了封装&#xff0c;却未实现序列化接口&#xff0c;所以持久化的时候会产生NotSerializable问题&…...

基于Java+SpringBoot+Vue前后端分离火锅店管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…...

Unity——导航系统补充说明

一、导航系统补充说明 1、导航与动画 我们可以通过设置动画状态机的变量&#xff0c;让动画匹配由玩家直接控制的角色的移动。那么自动导航的角色如何与动画系统结合呢&#xff1f; 有两个常用的属性可以获得导航代理当前的状态&#xff1a; 一是agent.velocity&#xff0c;…...

nginx实现负载均衡load balance

目录 nginx实现负载均衡load balance相关算法负载均衡https的访问后端的real server是否知道真正访问的用户的IP地址健康检查提升负载均衡的并发数量七层负载均衡和四层负载均衡七层负载均衡四层负载均衡四层和七层的区别502错误 nginx实现负载均衡load balance 准备&#xff…...

淘宝订单接口:连接消费者与商家的桥梁

当我们谈论淘宝订单接口时&#xff0c;我们谈论的是淘宝网为卖家和买家提供的一个用于处理订单的核心系统。通过这个接口&#xff0c;卖家可以接收订单、处理订单状态&#xff0c;并更新买家和平台的状态信息&#xff1b;买家则可以实时追踪自己的订单状态&#xff0c;更好地掌…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...