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

【C++】类的封装 ② ( 封装最基本的表层概念 | 类对象作为参数传递的几种情况 )

文章目录

  • 一、类的封装 : 将数据和方法封装到一个类中
    • 1、封装最基本的表层概念
    • 2、代码分析 - 基本封装
    • 3、代码分析 - 类对象作为参数传递的几种情况 ( 指针 / 引用 / 直接 )
    • 4、完整代码示例





一、类的封装 : 将数据和方法封装到一个类中




1、封装最基本的表层概念


将数据和方法封装到一个类中 , 是封装最基础的概念 ;


类的封装 最基本的功能 就是将 若干数据 和 若干方法 , 封装到一个类中 , 这些数据在内存中以一个整体的形式进行运作 ;

封装 Encapsulation : 将 数据 和 操作 封装在类中 , 可以将 类 内部的 实现细节 隐藏 , 只暴露有限的 接口 与外部进行交互 , 从而达到保护 类 对象的 内部状态 不被外部随意修改 ;


将 现实世界 中 存在的 客观事物 封装成 抽象 的 类 , 类 中 包含了 数据 和 操作 ,

  • 只有 可信的 类 或 对象 才能访问 隐藏起来的信息 ;
  • 大部分类默认只能访问 类 公开的接口 ;

2、代码分析 - 基本封装


在下面的代码中 , 定义了一个 Circle 类对象 , 其中 封装了 2 个成员属性 ;

	// 定义属性成员 , 圆的半径double m_r;// 定义属性成员 , 圆的面积double m_s;

3 个成员方法 ;

定义该 Circle 类对象 circle , 则借助 circle 对象 , 可以直接访问其中的 2 个成员属性 和 3 个成员 方法 ;

	// 获取半径double getR(){return m_r;}// 设置半径void setR(double r){m_r = r;}// 获取面积double getS(){m_s = 3.14 * m_r * m_r;return m_s;}

3、代码分析 - 类对象作为参数传递的几种情况 ( 指针 / 引用 / 直接 )


使用 类 对象 作为函数参数时 , 分别讨论下面三种情况 ;

  • 第一种情况 : 使用 类对象 指针作为参数 , 传参时 , 传入的必须是一个指针值 , 也就是地址值 ,
    • 如果将 Circle circle 对象传入 , 必须使用 取地址符 & 获取对象的地址 , 才能传给 void fun1(Circle* circle) 函数 ;
    • 在函数内部调用 circle 对象的成员 , 需要使用 -> 符号调用 , 也就是访问指针内存空间的成员的方式 ;
// 使用 类对象指针作为参数
void fun1(Circle* circle) 
{cout << "fun1(Circle* circle) : " << circle->getS() << endl;
}Circle circle;
// 传递指针必须使用取地址符取地址
fun1(&circle);
  • 第二种情况 : 使用 类对象引用作为 参数 ; 传参时 , 可以直接将 circle 对象传入 , 因为 C++ 编译器在编译引用时 , 会自动为 引用参数 添加 & 取地址 , 在函数内部访问时 , 会自动为引用添加 -> 符号访问内存空间数据 , 引用 等价于 一级指针 ;
// 使用 类对象引用作为参数
void fun2(Circle& circle)
{cout << "fun2(Circle& circle) : " << circle.getS() << endl;
}Circle circle;
// 传递引用直接传递即可
fun2(circle);
  • 第三种情况 : 直接使用 类对象作为参数 , 这种情况下 , 需要拷贝整个对象作为副本 , 函数调用效率很低 , 不建议使用这种方式 , 该调用方式与 引用 类型参数操作相同 , 推荐使用 引用类型的参数 ;
// 直接使用 类对象作为参数
void fun3(Circle circle)
{cout << "fun3(Circle circle) : " << circle.getS() << endl;
}Circle circle;
// 传递对象直接传递 , 需要拷贝整个对象效率很低
fun3(circle);

4、完整代码示例


完整代码示例 :

// 包含 C++ 头文件
#include "iostream"// 使用 std 标准命名空间
//		该命名空间中 , 定义了很多标准定义
using namespace std;// 定义圆形类
class Circle
{
public:// 定义属性成员 , 圆的半径double m_r;// 定义属性成员 , 圆的面积double m_s;public:// 获取半径double getR(){return m_r;}// 设置半径void setR(double r){m_r = r;}// 获取面积double getS(){m_s = 3.14 * m_r * m_r;return m_s;}
};// 使用 类对象指针作为参数
void fun1(Circle* circle) 
{cout << "fun1(Circle* circle) : " << circle->getS() << endl;
}// 使用 类对象引用作为参数
void fun2(Circle& circle)
{cout << "fun2(Circle& circle) : " << circle.getS() << endl;
}// 直接使用 类对象作为参数
void fun3(Circle circle)
{cout << "fun3(Circle circle) : " << circle.getS() << endl;
}int main()
{Circle circle;circle.setR(10);cout << "圆面积为 : " << circle.getS() << endl;// 传递指针必须使用取地址符取地址fun1(&circle);// 传递引用直接传递即可fun2(circle);// 传递对象直接传递 , 需要拷贝整个对象效率很低fun3(circle);// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
}

执行结果 :

圆面积为 : 314
fun1(Circle* circle) : 314
fun2(Circle& circle) : 314
fun3(Circle circle) : 314
Press any key to continue . . .

在这里插入图片描述

相关文章:

【C++】类的封装 ② ( 封装最基本的表层概念 | 类对象作为参数传递的几种情况 )

文章目录 一、类的封装 : 将数据和方法封装到一个类中1、封装最基本的表层概念2、代码分析 - 基本封装3、代码分析 - 类对象作为参数传递的几种情况 ( 指针 / 引用 / 直接 )4、完整代码示例 一、类的封装 : 将数据和方法封装到一个类中 1、封装最基本的表层概念 将数据和方法封…...

Linux上安装FTP

1、登录FTP&#xff0c;执行安装命令 yum -y install vsftpd 2、启动FTP服务器&#xff0c;设置开启自启动 systemctl enable vsftpd.service systemctl start vsftpd.service systemctl status vsftpd.service #查看状态, 显示active说明FTP启动成功 3、修改FTP配置文件/et…...

C/C++使用GDAL库编程窍门之——通用可移植性库(Common Portability Library, CPL)

C/C使用GDAL库编程窍门之——通用可移植性库&#xff08;Common Portability Library, CPL&#xff09; CPL简介 GDAL全称地理空间数据抽象库&#xff08;Geospatial Data Abstraction Library&#xff09;&#xff0c;是一个强大的地理栅格空间数据转换库&#xff0c;支持众…...

Linux container_of() 宏定义

container_of 宏 今天遇到了一段这样的代码&#xff0c;大致意思是 通过该struct结构体变量的成员的地址来反推该struct结构体变量的地址 并且用到了内核的宏&#xff0c;container_of() static inline struct nova_inode_info *NOVA_I(struct inode *inode) {return container…...

详解python中的序列类型---列表list

概述 列表类型是包含0个或多个元素的有序序列&#xff0c;属于序列类型。列表可以进行元素的增加、删除、替换、查找等操作。列表没有长度限制&#xff0c;无素类型可以不同&#xff0c;不需要预定长度。 列表类型用中括号[]表示&#xff0c;也可以通过list(x)函数将集合或字…...

Unity 引擎中国版 “团结引擎” 发布

导读Unity 官方宣布&#xff0c;Unity 中国正式推出 Unity 中国版引擎 —— 团结引擎&#xff0c;同时也开启了 Unity 中国本土化进程的全新篇章。作为推动团结引擎落地的核心人物&#xff0c;Unity 中国 CEO 张俊波称致力于将其打造为一款更懂中国开发者的引擎。 团结引擎以 U…...

MindsDB为许多不支持内置机器学习的数据库带来了机器学习功能

选择平台的首要原则是“靠近数据”,让代码靠近数据是保持低延迟的必要条件。 机器学习,特别是深度学习往往会多次遍历所有数据(遍历一次被称为一个epoch)。对于非常大的数据集来说,理想的情况是在存储数据的地方建立模型,这样就不需要大量的数据传输。目前已经有部分数据…...

世界级黑客丨电脑犯罪界的汉尼拔

被美国FBI称为电脑界的汉尼拔的人&#xff0c;有什么样的故事&#xff1f; 这个人就是世界级黑客凯文李波尔森&#xff0c;他在早期是正儿八经的黑客&#xff0c;他在17岁的时候就使用TRS-80电脑攻入美国国防部的高等研究计划署网络&#xff0c;但是当时他进去啥也没干&#x…...

【Matlab】Matlab实现数据的动态显示方法

Matlab实现数据的动态显示方法 主要为大家详细介绍了Matlab使用Plot函数实现数据动态显示方法&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可 以参考一下 对于真实系统或者仿真平台&#xff0c;数据是增量式的产生的。Matlab除了强大的矩阵运算外&#xff0c;还…...

【Android】SDK安装及配置

一、下载SDK Tools https://www.androiddevtools.cn 以windows10系统为例&#xff0c;下载压缩版直接解压即可。 二、安装SDK Tools 解压后双击运行SDK Manager.exe 一般根据默认推荐安装即可。 如果无法打开SDK Manager&#xff0c;可以参考&#xff1a;https://blog.cs…...

ETCD详解

一、etcd概念 ETCD 是一个高可用的分布式键值key-value数据库&#xff0c;可用于服务发现。 ETCD 采用raft 一致性算法&#xff0c;基于 Go语言实现。 etcd作为一个高可用键值存储系统&#xff0c;天生就是为集群化而设计的。由于Raft算法在做决策时需要多数节点的投票&…...

React笔记(五)hook

一、函数组件 1、函数组件的创建 函数组件&#xff1a;使用JS的函数&#xff08;或箭头函数&#xff09;创建的组件称为函数组件&#xff0c;函数组件有如下约定 函数名称必须以大写字母开头 函数组件必须有返回值&#xff0c;返回JSX表达式 渲染函数组件&#xff1a;用函数…...

vue3中使用viewerjs实现图片预览效果

vue3中使用viewerjs实现图片预览效果 1、前言2、实现效果3、在vue3项目中使用viewer.js3.1 安装3.2 在main.js中引入3.3 组件中使用 1、前言 viewer.js是一款开源的图片预览插件&#xff0c;功能十分强大: 支持移动设备触摸事件支持响应式支持放大/缩小支持旋转&#xff08;类…...

Erlang:Linux下使用observer、debugger进行调试

之前写了一篇文章Erlang:使用observer连接远程服务器进行调试&#xff0c;内容是绕过Linux服务器缺失’wxe_driver.so’的wxWidgets环境&#xff0c;启动observer远程连接实现observer调试。 本文则讨论在Linux环境下通过编译安装的方式&#xff0c;保证wxWidgets环境可用性&am…...

2023 年高教社杯全国大学生数学建模竞赛-E 题 黄河水沙监测数据分析详解+思路+Python代码

2023 年高教社杯全国大学生数学建模竞赛-E 题 黄河水沙监测数据分析 十分激动啊啊啊题目终于出来了&#xff01;&#xff01;官网6点就进去了结果直接卡死现在才拿到题目&#xff0c;我是打算A-E题全部做一遍。简单介绍一下我自己&#xff1a;博主专注建模四年&#xff0c;参与…...

一生一芯10——verilator v5.008环境搭建

搜索 verilator 官网&#xff0c;得到网址如下&#xff1a; https://www.veripool.org/verilator/ 点击download 找到 git quick install 可以看到git快捷安装所需命令行 可以看到&#xff0c;需要预先安装下面的包文件&#xff0c;去掉前面的#注释符号进行安装 直接进行下面…...

信息化发展27

关键技术一云安全技术 云安全研究主要包含&#xff1a; 一是云计算技术本身的安全保护工作&#xff0c; 涉及相应的数据完整性及可用性、隐私保护性以及服务可用性等方面的内容&#xff1b; 二是借助于云服务的方式来保障客户端用户的安全防护需求&#xff0c; 通过云计算技术…...

leetcode做题笔记129. 求根节点到叶节点数字之和

给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字&#xff1a; 例如&#xff0c;从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和 。…...

任务管理系统所需功能概述

"任务管理需要有哪些功能&#xff1f;清晰的任务创建与编辑、智能分类和标签系统、提醒与通知功能、进度跟踪与报告、协作与共享功能、集成与兼容性。" 一款优秀的任务管理工具可以帮助我们有效地规划、执行和监控各项任务&#xff0c;提高工作效率。本文将探讨一款理…...

一文学会K8s集群搭建

环境准备 节点数量&#xff1a;2台虚拟机 centos7硬件配置&#xff1a;master节点内存至少3G&#xff08;2G后面在master节点初始化集群时会报错&#xff0c;内存不够&#xff09;&#xff0c;node节点可以2G&#xff0c;CPU至少2个&#xff0c;硬盘至少30G网络要求&#xff1…...

3个高效Searchkit高亮技巧:让你的搜索结果直观又专业

3个高效Searchkit高亮技巧&#xff1a;让你的搜索结果直观又专业 【免费下载链接】searchkit Search UI for Elasticsearch & Opensearch. Compatible with Algolias Instantsearch and Autocomplete components. React & Vue support 项目地址: https://gitcode.com…...

Qwen3-ASR-1.7B实战教程:结合Punctuation Restoration模型提升标点准确率

Qwen3-ASR-1.7B实战教程&#xff1a;结合Punctuation Restoration模型提升标点准确率 语音识别技术已经相当成熟&#xff0c;但识别结果往往缺少标点符号&#xff0c;让长文本阅读变得困难。本文将教你如何将Qwen3-ASR-1.7B语音识别模型与标点恢复技术结合&#xff0c;获得既准…...

Qwen2.5-VL-7B-Instruct本地部署指南:ClawdBot实现

Qwen2.5-VL-7B-Instruct本地部署指南&#xff1a;ClawdBot实现 1. 引言 想不想在本地电脑上搭建一个能看懂图片、理解视频的AI助手&#xff1f;今天咱们就来聊聊怎么把Qwen2.5-VL-7B-Instruct这个强大的视觉语言模型部署到本地环境&#xff0c;并且集成到ClawdBot中。 这个模…...

Qt, C++数据类型扩展问题

Qt项目中ObjectDic类的类型扩展与代码优化 前言 在Qt项目开发中&#xff0c;我们经常会遇到需要处理不同类型数据的情况&#xff0c;尤其是当涉及到负数时&#xff0c;类型的选择就显得尤为重要。本文将详细介绍如何在Qt项目中扩展ObjectDic类的类型支持&#xff0c;从无符号整…...

Spring AI vs Python生态:Java开发者如何选择AI工具链?

Spring AI vs Python生态&#xff1a;Java开发者如何构建高效AI工具链&#xff1f; 当Java开发者第一次踏入AI应用开发领域时&#xff0c;往往会面临一个灵魂拷问&#xff1a;是拥抱Python生态的LangChain/LlamaIndex&#xff0c;还是坚持Java技术栈选择Spring AI&#xff1f;这…...

嘉立创PCB打样被加价到170元?手把手教你用STM32H743飞控板案例解决‘拆单嫌疑’

STM32H743飞控板PCB打样避坑指南&#xff1a;如何巧妙应对嘉立创拆单判定 最近不少硬件开发者在使用嘉立创进行STM32H743飞控板PCB打样时&#xff0c;遇到了一个令人头疼的问题——原本33元的4层板打样价格突然飙升到170多元。这种情况往往是由于平台算法误判设计文件存在"…...

如何高效配置Kodi PVR IPTV Simple:专业级家庭IPTV直播系统部署指南

如何高效配置Kodi PVR IPTV Simple&#xff1a;专业级家庭IPTV直播系统部署指南 【免费下载链接】pvr.iptvsimple IPTV Simple client for Kodi PVR 项目地址: https://gitcode.com/gh_mirrors/pv/pvr.iptvsimple Kodi PVR IPTV Simple是一款功能强大的开源IPTV客户端插…...

bilibili-downloader完全指南:从入门到精通的4个关键步骤

bilibili-downloader完全指南&#xff1a;从入门到精通的4个关键步骤 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 一、痛点分析&am…...

避坑指南:用高德DistrictSearch获取精准行政边界时遇到的5个典型问题(含最新GeoJson处理技巧)

高德DistrictSearch深度避坑&#xff1a;5个实战难题与GeoJson优化方案 当你在深夜调试地图边界数据时&#xff0c;突然发现某个街道的轮廓出现了诡异的锯齿状变形——这不是恐怖片情节&#xff0c;而是使用高德DistrictSearch时可能遇到的真实场景。作为经历过数十个地图项目…...

别再死记硬背GAT公式了!用Python+PyTorch手把手图解注意力机制(附代码)

图解GAT&#xff1a;用PythonPyTorch拆解图注意力机制的实现奥秘 当你第一次听说图注意力网络&#xff08;GAT&#xff09;时&#xff0c;是否被那些复杂的数学公式和抽象概念吓退&#xff1f;本文将以全新的可视化方式&#xff0c;带你从零实现一个完整的GAT层&#xff0c;用代…...