当前位置: 首页 > 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;更好地掌…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

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

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

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...