通过指针访问C++对象的私有成员
C++对象的私有成员是禁止类外的访问的。但是我们仍然可以通过指针访问C++对象的私有成员。
#include <iostream>
using namespace std; class A
{
public:
A(int i = )
:m_i(i)
{}
void print()
{
cout << "m_i" << this->m_i << endl;
}
private:
int m_i;
}; int main(int argc, char **argv)
{
A a();
// 初始化后的a的私有变量是10
a.print(); //可以通过指针访问a中的m_i变量
int *pi = (int *)&a;
cout << "a::m_i: " << *pi << endl; //通过指针更改m_i
*pi = ;
//我们看到对象a中的私有变量m_i已经被改变
a.print();
return ;
}
运行结果:
m_i:
a::m_i:
m_i:
在上面代码中,a对象有一个私有的数据成员m_i,原则上在类外部是不能对m_i进行访问的。但是我们可以通过地址访问对象的私有数据成员m_i。并且还对其进行了修改。运行结果也表明我们确实可以通过指针访问对象的私有成员并且可以对其进行修改。
究其原因,在C++中访问对象的数据成员,可以根据数据在对象中的偏移地址访问。C++的对象其实就是一个指针数组。这个指针数组存放的是对象的虚函数表和数据成员的地址,我们当然可以通过指针访问对象的任何成员。我想着可能是C++为了兼容C语言而留下的一些不是很安全的做法。
通过指针访问C++对象的私有成员的更多相关文章
- C++之在类内部访问对象的私有成员
一.引言 今天看项目里的一段代码发现,竟然可以再类的成员函数中访问该类的对象的私有成员.感觉不可思议. 自己写的实例代码: #include <iostream> using namesp ...
- C++中内部类访问外部类的私有成员
首先,如果不知道什么是内部类InnerClass的话,就没必要往下看了. 尝试在C++中模仿apple objective-c 的Grand Dispatch简化多线程编程时,使用了boost::fu ...
- C#箴言之用属性来访问类的私有成员
在程序中,难免要访问某个对象的私有成员.那么以前实现这类功能的方法有两种,第一种方法最简单,就是把成员访问符从“private”改为“public”即可:而另一个就是提供公有的成员访问函数来进行访问. ...
- CPP-基础:关于私有成员的访问
a.C++的类的成员函数中,允许直接访问该类的对象的私有成员变量. b.在类的成员函数中可以访问同类型实例的私有变量. c.拷贝构造函数里,可以直接访问另外一个同类对象(引用)的私有成员. d.类的成 ...
- 父类指针指向子类内存,为什么当父类的成员函数不加virtual时,访问的还是父类的成员函数,而不是子类同名的成员函数
我认为是这样,类的成员函数都在代码区,不同的类的成员函数在代码区有自己的类名称空间限制,类的虚函数在虚函数表中,程序执行的时候,是先在虚函数表中找该成员函数,如果没有找到,就去该类在代码区的成员函数中 ...
- C#中访问私有成员
首先访问一个类的私有成员不是什么好做法.大家都知道私有成员在外部是不能被访问的.一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员造访,可以套用下面这种非常好的方式去解决. pr ...
- 使用C#反射机制访问类的私有成员【转】
首先我必须承认访问一个类的私有成员不是什么好做法.大家也都知道私有成员在外部是不能被访问的.而一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员访问,可以套用下面这种非常好的方式 ...
- c++中嵌套类,外部类访问内部类的私有成员变量
在嵌套类中,内部类可以直接访问外部类的私有成员变量,但是外部类不能直接访问内部类的私有成员变量,必须把外部类声明为内部类的友元类 /********************************** ...
- C#中访问私有成员--反射
首先我必须承认访问一个类的私有成员不是什么好做法.大家也都知道私有成员在外部是不能被访问的.而一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员访问,可以套用下面这种非常好的方式 ...
随机推荐
- 亚马逊EC2构建代理服务器心血历程
1.亚马逊上申请一台免费的EC2服务器,有相应的教程,绑定信用卡,预支付1美元,据说可以退回(防止到期后直接扣款,支付后通过修改卡信息,但好象有提示了,说卡不对了,也不管它了,到期后再说,美国人也不是 ...
- 关于Adaper的相关用法
使用BaseAdapter的话需要重载四个方法: getCount getItem getItemId getView getView是用来刷新它所在的ListView的.在每一次item从屏幕外滑进 ...
- sql中表变量
今天在公司看sql优化的文章的时候,提到了表变量,做下笔记. 表变量 顺便复习下临时表.
- H5 标签属性、input属性
高亮文字: 全部商品只要<mark>6.18</mark> 结果: 加拼音文字: <ruby>變<rt>bian</rt></ ...
- JS——tab切换
排它思想: 1.先让所有的元素恢复默认值 2.再让选中的元素赋专有的值 3.干掉所有人,剩下我一个 <!DOCTYPE html> <html> <head lang=& ...
- 认识 java JVM虚拟机选项 Xms Xmx PermSize MaxPermSize 区别
点击window---->preferences---->配置的tomcat---->JDK,在Optional Java VM arguments:中输入 -Xmx512M -Xm ...
- JSP学习笔记 - 内置对象 Request
1.主要掌握以下5个内置对象及其所属类,必须学会在java docs里根据类名查找相应的方法 request javax.servlet.http.HttpServletRequest res ...
- CSS3设计炫目字体
阴影 .text-shadow{ text-shadow:#FF0000 0 0 10px; color:white; font-size:60px } 描边 <style> .text- ...
- mysql_基础1
初学mysql,感觉挺有意思的. mysql指令的一些参数: promrt修改提示符: PROMPT \D mysql的语法规范: 一些函数: 创建数据库: SHOW CREATE DATABAS ...
- scp: /xxxx: not a regular file
问题描述 scp root@10.2.1.92:/home /home/wangju/databakroot@10.2.1.92's password: xxxxscp: /home: not a r ...