我们知道,C++的类是有封装性的,那么对于私有数据成员我们如果想在类外访问,一般而言无外乎这么两种方法:

1、通过公有的成员函数
2、通过友元
这是两种通常的做法,还有一种是比较“反常”的,但是同样也可以达到这样的目的,那就是通过类的基地址偏移来访问,这是网上有人给出的例程:

#include <iostream>
#include "conio.h"

class tester
{
public:
tester() : i(5), ch('x'){};
private:
int i;
char ch;
};

int main(void)
{
   tester myTester;
  char* p = NULL;

p = (char*) &myTester + sizeof(int);  //Here is the point! Jumps sizeof(int) units of bytes!

cout << "Address of ch = " << (void*) p << endl; //The type modifier void* forces it to output the
              //address, not the content.
  cout << "ch = " << * (p) << endl;

getch();  //Waits your action
  * p = 'y';

cout << "Now ch = " << * (p) << endl;

return 0;
}

真是不看不知道,原来还可以这样子,指针这个东西还真是……。不过这种反常的做法也受到了一些限制,比方说对类的内存布局你需要清楚,否则得不到正确的地址。实际当中真的不知道谁是这么用的,总之是破坏了C++的封装性,不大好:)

转自http://blog.csdn.net/tassadar/article/details/871785

转载于:https://blog.51cto.com/2012huhu/1009198

C++中访问类的私有数据成员的第三种方法相关推荐

  1. C++访问类的私有数据成员的三种方法

    总是忘记C++的私有数据成员到底什么能访问,今天总结下,特此记录. 注:还可以使用指针访问修改private数据成员的值: class Test {private:int x;int y; publi ...

  2. [转]asp.net导出数据到Excel的三种方法

    原文出处:asp.net导出数据到Excel的几种方法(1/3) .asp.net导出数据到Excel的几种方法(2/3).asp.net导出数据到Excel的几种方法(3/3) asp.net导出到 ...

  3. 芯片数据的差异分析主要包括三种方法 ANCOVA进行差异分析 为何不用deseq2

    Shared Gene Expression Alterations in Schizophrenia and Bipolar Disorder Expression of cilium-associ ...

  4. DataTable数据批量写入数据库三种方法比较

    DataTable数据批量写入数据库三种方法比较 标签: it 分类: C# 1)   insert循环插入: 2)   sqldataadapter.update(dataset,tablename ...

  5. 在 C# 中,(int) ,Int32.Parse() 和 Convert.toInt32() 三种方法的区别

    在 C# 中,(int),Int32.Parse() 和 Convert.toInt32() 三种方法有何区别? int 关键字表示一种整型,是32位的,它的 .NET Framework 类型为 S ...

  6. 机器学习中的矩阵求导的一点总结(三种方法求线性回归最佳参数)

    机器学习中的矩阵求导的一点总结(三种方法求线性回归最佳参数) 转载于:https://blog.csdn.net/promisejia/article/details/80159619?ops_req ...

  7. python提取cad坐标_怎么提取cad中坐标?CAD批量提取坐标点的三种方法

    经常有一些小伙伴问,CAD中怎么批量提取坐标点,今天给大家总结三种方法. 方法一:多段线顺序连接并提取. 1.多段线pl连接点: 2.li命令提取坐标: 3.将点位粘贴至excel,利用数据,分列,最 ...

  8. mysql 自增长id string_Mysql中获取刚插入的自增长id的三种方法归纳

    我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数, 一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的. 但在多线程情况下,就不行了. 下面 ...

  9. 监控器sd卡初始化怎么恢复数据?有这三种方法可尝试

    sd卡监控器数据能恢复吗?监控器sd卡初始化怎么恢复数据?如果您的监控器sd卡被初始化(格式化)导致数据丢失,建议立即停止使用sd卡,因为如果您继续使用sd卡,它可能会覆盖您要恢复的数据,导致无法恢复 ...

最新文章

  1. 绘制业务流程图:流程图绘制工具
  2. python pdf报告_Python实现html转换为pdf报告(生成pdf报告)功能示例
  3. 撸一段 SQL ? 还是撸一段代码?
  4. python简单词频统计_python简单词频统计
  5. Context.PROVIDER_URL 逗号间隔
  6. java cron工具类_Java工具类之:包装类
  7. 想系统化提升自己产品能力,就要读这些书籍
  8. Spring Boot一个极简且完整的后台框架
  9. centos 6 install EPEL
  10. 重构之以委托取代继承
  11. redis jar包_「建议收藏」手把手教你从零搭建一个redis服务
  12. mysql 存储过程案列一个。
  13. 【转】勤奋小孩的遗言:没有理由不坚持。
  14. VS2015安装提示“安装包丢失或损坏”
  15. Raytrace学习的阶段性总结
  16. vlan间路由+静态路由+NAT(PAT+静态NAT)综合实验
  17. 解决Ubuntu 20.04 虚拟机克隆出多台造成的IP地址冲突的问题
  18. Twrp recovery 编译教程(译文)
  19. Linux操作手机端
  20. 软件测试之冒烟测试中易犯的三个误区--新梦想软件测试

热门文章

  1. 用Transformer实现OCR字符识别!
  2. 科研指导:深度学习的应用研究课程
  3. 最新数据分析教程资源合集(案例、数据集、SQL教程、分析样板、面经、简历、PY教程... )...
  4. 一个「PPT」框架,让超大模型调参变简单:清华刘知远、黄民烈团队力作
  5. 86岁还在录网课:MIT教授Gilbert Strang最新「线性代数」课程上线
  6. 博弈论速成指南:那些融入深度学习的经典想法和新思路
  7. 进程的介绍(概念、作用)
  8. 栈溢出原理 小记 基础中的基础~~
  9. 电路交换-报文交换-分组交换- 分组交换包括:虚电路和数据报
  10. Python报错TypeError: Tuple or struct_time argument required