当前位置: 首页 > 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…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

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

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

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...