C++-- 如何在类外访问一个类中私有的成员变量?

2023-11-16

如何在类外访问一个类中私有的成员变量?我在网上搜答案的时候看到大部分回答都是在类内部创建一个接口,所以此方法我就不再多做赘述,今天我说的是利用指针

边看代码边理解。上代码:

class Test
{
private:
	int a = 10;
	int b = 100;
};

int main()
{
	Test s;
	cout << sizeof(s) << endl;//s为8个字节
	Test* ps = &s;
	
	int * ps1 = ((int *)ps + 1);
	void* ps2 = (ps + 1);
			
	system("pause");
	return 0;
}

对上述代码进行调试,打开监视窗口,我们可以看到下面的内容:我在main函数中新建了一个Test对象s,s中的内容为{a = 10, b = 100},对s取地址可以看到&s = 0x004ffc20 ;我又新建了一个Test * 对象ps,指向的是s的地址,所以ps里面存储的内容为0x004ffc20 ,对ps取地址可以看到&ps = 0x004ffc14;新建一个int*类的对象ps1,指向的是ps+1的地址,里面存储的内容为0x004ffc24,对ps1取地址为0x004ffc08;新建一个void*对象ps2,指向的也是ps+1的地址,里面存储的内容为0x004ffc28,ps2的地址为0x004ffbfc。

这里写图片描述
为什么同样都是指向ps+1的位置,ps1与ps2里面的内容不一样呢?对监视里的内容,对比代码来看:

首先说说s与ps的关系:ps存的就是s的首地址,又因为s是Test对象,所以s的首地址就是内存中保存a的位置,那么ps存的其实就是内存中a的位置;

再接着说说ps1与ps2:ps是Test*类型的,而Test的大小为8个字节,所以直接将ps+1就相当于将ps向后移动了8个字节,所以ps2指向的就是将ps向后移动了8个字节的位置,也就是内存中b的位置的下一个位置;而先将ps强转为int *类型后再+1,此时就代表将ps向后移动了4个字节的位置,所以ps1指向就是将ps向后移动了4个字节的位置,也就是b的位置

为了验证我的言论,打开调试的内存窗口,输入&s,可以看到ps = 0x004ffc20 = 10 = a的位置;ps1 = 0x004ffc24 = 100 = b的位置;ps2 = 0x004ffc28 => b的下一个位置。
这里写图片描述
了解了上面这些,我们就可以通过ps1来改变私有成员b的数值了。

class Test
{
public:
	void SetA(int _a)//接口(可以从类外设置a的值)
	{
		a = _a;
	}
	void Print()
	{
		cout << a << endl;
		cout << b << endl;
		cout << endl;
	}
private:
	int a = 10;
	int b = 100;
};

int main()
{
	Test s;
	s.Print();

	s.SetA(0);//通过接口把a设置为0;
	s.Print();

	Test* ps = &s;
	int * ps1 = ((int *)ps + 1);
	*ps1 = 0;//通过指针把b设置为0;
	s.Print();
		
	system("pause");
	return 0;
}

结果:

原理:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++-- 如何在类外访问一个类中私有的成员变量? 的相关文章

  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List
  • 解释一下 AF 标志在 x86 指令中如何工作?

    我有一个小型 8086 模拟器 并且我已经有一个长期存在的错误了大约 2 年 因为 AF 在 sub 和 add 指令内无法正常运行 我当前计算其值的方法是 8 位数字和减法 uint8 t base subt base base 0xF
  • 重叠 I/O 的 GetOverlappedResult(bWait=TRUE) 与 WaitForSingleObject()

    当我在 Win32 api 上以重叠方式打开和读取文件时 我有几种方法来完成 IO 请求 包括等待文件句柄 或重叠结构中的事件 WaitForSingleObject GetOverlappedResultbWait TRUE 这两个函数似
  • 使用 XmlWriterSettings 或 XmlWriter 设置引号字符

    我目前有一些直接实例化的代码XmlTextWriter对象 它允许我将引号字符设置为单引号 我需要它来生成 XML 以匹配旧系统 例如 var fred new XmlTextWriter stream encoding fred Quot
  • 无法将“RSACng”类型的对象转换为“System.Security.Cryptography.RSACryptoServiceProvider”类型

    我得到了这个异常 无法将 RSACng 类型的对象转换为 System Security Cryptography RSACryptoServiceProvider 类型 调用这个方法 GoogleCredential cred Googl
  • 从静态方法调用 Response.TransmitFile()

    我有许多页面需要支持将数据导出到 Excel 电子表格 我可以很好地生成 Excel 文件 但我正在尝试找出如何抽象此行为 以便可以轻松地从我需要它的所有页面中重用它 我目前的想法是使用静态实用方法 如下 public static voi
  • 使用 DotNetOpenAuth 获取数据?

    我已经实施了这个简单的代码如下所述 http www rtur net blog post 2012 05 23 OpenID with ASPNET Made Simple 与 2010 年相比 网络表单 protected void P
  • RigidBody2D 冻结 X 位置

    我想知道是否有一种方法可以使用 Unity 的 RigidBody2D 来模拟以下代码行 而不是使用普通的 RigidBody rigidbody constraints RigidbodyConstraints FreezePositio
  • 检测可为 null 的类型

    当 Nullable 类型为 null 时是否可以检测到它 转换为对象 Since Nullable
  • 空 catch 与 try-catch 语句中的“catch Exception”相同吗?

    try catch Exception 我可以写吗 try catch 这在 C NET 3 5 中可以吗 代码看起来更好 但我不知道是否相同 他们是not一样的 catch Exception 将仅捕获托管异常 catch 也会捕获非 C
  • 为什么 C# 中 Encoding.ASCII != ASCIIEncoding.Default ?

    为什么 C 中 Encoding ASCII ASCIIEncoding Default 这是因为ASCIIEncoding源自于Encoding where Default定义为
  • 为什么不能将函数中变量的最后一次赋值视为移动?

    在这样的代码中 class X X const X X const X void f X a X b a code that doesn t use a 我的理解是最后一个语句调用复制构造函数而不是移动构造函数 假设a不再使用于f 编译器是
  • minidump stackwalk 与 gdb 回溯

    我的 Firefox 中有一个漏洞触发器 CVE 2018 18492 它会崩溃并给出 SIGSEGV 我用过breakpadminidump stackwalk从崩溃时生成的小型转储文件中获取其堆栈跟踪 我得到如下内容 Thread 0
  • 这是我们可以强制 ObjectDataSource 的唯一方法吗?

    问候 1 我假设对象数据源仅在第一次请求时自动绑定到数据源 但不会在回发时自动绑定到数据源 否则ObjectDataSource 选择事件也会在回发时被触发 但事实并非如此 A 所以唯一的办法就是强迫对象数据源也可以通过手动调用来绑定回发数
  • UDP打洞

    我有一些关于 UDP 打洞的问题 基于维基百科http en wikipedia org wiki UDP hole punching http en wikipedia org wiki UDP hole punching 1 要在两方
  • 将 IRandomAccessStreamWithContentType 转换为 Byte[]

    在我的应用程序中 我允许用户使用 ContactPicker 添加联系人 我尝试将 IRandomAccessStreamWithContentType 转换为 Byte IRandomAccessStreamWithContentType
  • 类库的 app.config 中的绑定重定向有什么作用吗?

    我经常使用的 VS 解决方案包括单个可执行项目 控制台应用程序 网络应用程序 和许多类库项目这些都被可执行文件引用 使用 NuGet 并安装包时 经常会出现app config为每个项目创建的文件 通常只包含合并引用程序集版本的绑定重定向列

随机推荐

  • C++ 中的指针使用

    1 指针的定义和声明 指针是一个变量 其值是一个内存地址 指向内存中的某个数据 指针变量的类型与它所指向的数据类型相同 在 C 中 指针的定义和声明方式如下 int p 定义一个指向 int 类型数据的指针变量 p double q 定义一
  • 一文了解什么是web3

    一 web1 0和web2 0 Web 1 0和Web 2 0指的是万维网历史上的时代 因为它通过各种技术和格式发展 Web 1 0 大致指的是从 1991 年到 2004 年期间 大部分网站由静态页面组成 绝大多数用户是内容的消费者 而不
  • win10 64位下载64位python

    下载步骤 1 打开Python官网 https www python org 如果是32位的可以直接点击download下载 否则点击downloads 点击windows 2 选择安装版本 eg 选择安装版 然后一直默认下一步 安装 期间
  • K8s存储管理——volume、pv、pvc

    目录 介绍 前言 emptyDir存储卷 hostPath存储卷 本地 NFS共享存储卷 PV PVC NFS使用pv pvc 介绍 来自官方文档 存储的管理是一个与计算实例的管理完全不同的问题 PersistentVolume 子系统为用
  • java基础——内存和变量

    目录 前言 一 java的内存 1 栈内存 2 堆内存 3 方法区内存 二 成员变量与局部变量 1 成员变量 2 局部变量 3 成语变量和局部变量的区别 前言 介绍Java的三种内存分配 栈 堆 方法区 成员变量和局部变量 一 java的内
  • 渗透漏洞 Bugku CTF-Web5

    Bugku CTF Web5 一 开启环境 点击链接 二 查看源代码 发现PHP弱类型 三 构造出 payload 提交获得 flag 一 开启环境 点击链接 二 查看源代码 发现PHP弱类型 1 PHP 比较 2 个值是否相等可以用 或
  • 神策学堂“训练营+特训营”,种子学员招募中,来一起出圈呀!

    2020 年难吗 难 失业 瓶颈 焦虑包围着互联网人 面对这个现状 神策学堂准备了一系列精品课程 芒种训练营 高级特训营 让大家逆流 出圈 神策数据分析芒种训练营 突破瓶颈 晋升高阶岗位 3 场直播 6 实战案例 教你用数据高效赋能业务 1
  • oracle数据库找不到主库,Oracle DG 主库丢失归档

    DG 主库丢失归档 主要原因就是备库没有APP呢 主库就误把归档删除了 常见的这种情况都是主库RMAN做备份的时候把归档删除了 丢失归档解决方法 用RMAN 增量备份恢复 还有恢复控制文件 备库 SQL gt select sequence
  • Centos7.4制作简易RPM包

    准备nginx 1 10 1 tar gz 准备php 7 1 7 tar bz2 这两个源码编译tar包 1 准备制作环境 yum y install rpm build 安装rpm build软件 rpmbuild ba xx spec
  • SpringSecurity最全实战讲解

    文章目录 Spring Security 专题 一 基本概念 认证 授权 会话 RBAC模型 二 一个自己实现的权限模型 BasicAuth 三 SpringBoot Security 快速上手 1 项目搭建步骤 2 用SpringBoot
  • AIF360入门教学

    1 AIF360简介 AI Fairness 360 工具包 AIF360 是一个开源软件工具包 可以帮助检测和缓解整个AI应用程序生命周期中机器学习模型中的偏见 在整个机器学习的过程中 偏见可能存在于初始训练数据 创建分类器的算法或分类器
  • MessageDigest(加密)

    MessageDigest类 MessageDigest 类是一个引擎类 它是为了提供诸如 SHA1 或 MD5 等密码上安全的报文摘要功能而设计的 密码上安全的报文摘要可接受任意大小的输入 一个字节数组 并产生固定大小的输出 该输出称为一
  • 使用 Cloudflare Zero Trust 通过 SSH 连接到 GitHub Actions 的 Runner 机器以进行调试

    GitHub Actions 的 Runner Images 包含了很多常用的开发环境 使用它来构建一些软件是很方便的 不过 构建过程难免会遇到问题 而在 GitHub Actions 上进行构建和在本地有很多不同之处 首先 Runner
  • 服务器装系统都会有哪些坑,小白装机避坑——电脑装系统篇 二

    装机系统分区 首先你需要安装好你的固态硬盘 开机 进入系统 一般用的分区工具都是 DiskGenius 这个软件 粗暴的组装 不需要机箱 一台电脑里面只能设置一个盘作为系统盘 也就是我们的主分区 切记 先对硬件进行测试组装 看看能不能正常启
  • 1125 斐波那契数列

    题目描述 输入整数n 输出斐波那契数列的前n项 输入要求 输入一个整数n 1 lt n lt 12 输出要求 输出斐波那契数列的前n项 每个数后面都有空格 输入样例 6 输出样例 1 1 2 3 5 8 提示 斐波那契数列的排列规则为 第1
  • echarts legend文字颜色

    legend textStyle color fft
  • 一个有意思的let面试题

    今天看到一个面试题 let des 我在外边 let obj des 我在里面 foo function console log this des let bar obj foo bar 这个bar 调用后会打印出什么 本以为是考 this
  • 查看微信小程序的appID和secret

    https mp weixin qq com wxopen devprofile action get profile token 1504304474 lang zh CN 转载于 https www cnblogs com fuckin
  • springmvc源码学习(三十)@ControllerAdvice 全局异常处理

    目录 前言 一 示例 二 原理 前言 在请求到达了 DispatcherServlet 的处理流程 进入 doDispatch 以及后续流程处理业务的过程中出现异常 会进入到 processDispatchResult 处理异常 此时 如果
  • C++-- 如何在类外访问一个类中私有的成员变量?

    如何在类外访问一个类中私有的成员变量 我在网上搜答案的时候看到大部分回答都是在类内部创建一个接口 所以此方法我就不再多做赘述 今天我说的是利用指针 边看代码边理解 上代码 class Test private int a 10 int b