请问,this指针。

hydvivian 2008-02-18 06:24:20

如果拿到了this指针,根据偏移量,是不是可以访问类内任何成员。?

如果通过这样的方法访问private数据,编译器还会报错么?

...全文
441 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
herman~~ 2008-02-28
  • 打赏
  • 举报
回复
果拿到了this指针,根据偏移量,是不是可以访问类内任何成员。?

不要尝试这样做
ssdx 2008-02-23
  • 打赏
  • 举报
回复
code*(int*)((char*)&a + (int)p1) = 65535

这句gcc 4.1.2编译通不过:

main.cpp: In function 'int main()':
main.cpp:41: error: invalid cast from type 'int A::*' to type 'int'
main.cpp:42: error: invalid cast from type 'int A::*' to type 'int'

c++ primer: 13.6.2
类成员的指针必须总是通过特定的对象或指向该类类型的对象的指针来访问。
ssdx 2008-02-23
  • 打赏
  • 举报
回复
能否解释一下((void(*)())(**(int*(**))&a))();这句?
hydvivian 2008-02-22
  • 打赏
  • 举报
回复
多谢各位热心大虾。揭帖。
飘飘白云 2008-02-20
  • 打赏
  • 举报
回复
TO jukifox:

1,能提示下,这段CODE是引自那章?我没有发现有类似的CODE 在深度探索C++对象模型里

2,另外从C++的可用性的角度讲,我觉得这种代码很难让人读懂,在没有DOCUMENTS的情况下。

回复:
1,第4章or5章?反正是讲数据语义那一种,函数语义前一章。有类似的代码,你去看数据成员指针那一节。

2,实际项目中几乎从不这么写代码,之所以这么着只是为了弄明白C++语言背面的秘密而已~~
sepnic 2008-02-20
  • 打赏
  • 举报
回复
Mark
icoding 2008-02-20
  • 打赏
  • 举报
回复
可以访问private成员,但是直接访问不成,汇编器报错,但是你可以耍点小花招,比如汇编啥的
stoneyrh 2008-02-20
  • 打赏
  • 举报
回复
当然可以啦,不过没必要这么做
这种研究精神可嘉
z_kris 2008-02-20
  • 打赏
  • 举报
回复
c++必知必会也提到过数据成员指针以及成员函数指针 呵呵
jukifox 2008-02-20
  • 打赏
  • 举报
回复
另外从C++的可用性的角度讲,我觉得这种代码很难让人读懂,在没有DOCUMENTS的情况下。
jukifox 2008-02-20
  • 打赏
  • 举报
回复
能提示下,这段CODE是引自那章?我没有发现有类似的CODE 在深度探索C++对象模型里
飘飘白云 2008-02-19
  • 打赏
  • 举报
回复
C/C++ codeA a;
int A::* p0 = 0;
int A::* p1 = &A::data1;
int A::* p2 = &A::data2;


C/C++ code*(int*)((char*)&a + (int)p1) = 65535;

第一段代码,我迫切的想得到核心原理的解释.第二段代码,基本可以理解,还是希望牛人给个小小的解释...

回复:
这里讲的是指向数据成员的指针.

数据成员的指针有两种含义,一种是没有绑定具体对象的数据成员指针,其地址实际是该数据成员在类布局结构中的位移;另一种是绑定了具体对象的的数据成员指针,其地址是该对象的该数据成员在内存中的地址。下面参照书中的例子用vs2005中在32位的机器上写了个测试程序。

输出结果:
第一行是输出8,可以理解,前面有两个整型数据(4+4 = 8),故位移为8;
第二行理应输出4,但在vs2005中得到的是0,大概是编译器做了些类似于空基类的优化处理。
第三行是输出内存地址以及5。

#include <stdlib.h>

class Base1 {
public:
int value1;
};

class Base2 {
public:
int value2;
};

class Derived :
public Base1,
public Base2 {
public:
int value3;
};

int _tmain(int argc, _TCHAR* argv[])
{
printf("\n Point to class's data member %p.\n", &Derived::value3);//第一种情形
printf("\n Point to class's data member %p.\n", &Derived::value2);//It should be 4,but it is 0.

int Derived:: *pVal3 = &Derived::value3;//第二种情形

Derived object;
object.*pVal3 = 5;

printf("\n Point to object's data member %p, value is %d.\n", &(object.*pVal3), object.*pVal3);

system("pause");
return 0;
}
hydvivian 2008-02-19
  • 打赏
  • 举报
回复
用了一个很好的词——Arcane 来说明这样子写的代码

int A::* p0 = 0; // 指向对象的首地址
int A::* p1 = &A::data1; // 指向数据成员data1的地址
int A::* p2 = &A::data2; // 指向数据成员data2的地址

这个例子中,p0要么指向了vptr,要么与p1是一样的。

各位大虾,这么解释有问题么?
netxuning 2008-02-19
  • 打赏
  • 举报
回复
学习
czp_opensource 2008-02-19
  • 打赏
  • 举报
回复
这是什么鬼代码? 深度探索C++对象模型让你这么写代码了? 我也看了,没看过这样的。 可能是我没看全。 不过这种代码最好还是不要写。
taodm 2008-02-19
  • 打赏
  • 举报
回复
先看了《深度探索C++对象模型》再说。
antimatterworld 2008-02-19
  • 打赏
  • 举报
回复
A a;
int A::* p0 = 0;
int A::* p1 = &A::data1;
int A::* p2 = &A::data2;


*(int*)((char*)&a + (int)p1) = 65535; 


第一段代码,我迫切的想得到核心原理的解释.第二段代码,基本可以理解,还是希望牛人给个小小的解释...
hydvivian 2008-02-19
  • 打赏
  • 举报
回复
恩恩。。是偏移量。。

---

离题了,看来原问题中那么做是没问题的?只要维护得当?
antimatterworld 2008-02-19
  • 打赏
  • 举报
回复
刚才看了MFC教材一下,MFC消息影射宏就是利用这个技术的.

受益匪浅啊~~
herman~~ 2008-02-19
  • 打赏
  • 举报
回复
深度探索C++对象模型
我就没看完,呵呵 不过照样知道是可以的,编译器难道还要保证你不能写个病毒出来吗?
加载更多回复(9)

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧