| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1250 人关注过本帖
标题:对象参数与私有变量
只看楼主 加入收藏
书呆
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:55
专家分:188
注 册:2010-3-26
收藏
得分:0 
按照声明顺序计算偏移量。
比如类中定义int x; int y; 那么x的偏移量是0,而y的偏移量就是4,
对y的赋值就应该是 *((int*)(&a) + 1) = 100;

沉醉东风月下读。柴门闭,莫管客来无。
2010-03-31 12:39
书呆
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:55
专家分:188
注 册:2010-3-26
收藏
得分:0 
偏移量是由声明顺序决定的,跟访问权限无关。

沉醉东风月下读。柴门闭,莫管客来无。
2010-03-31 12:45
wei0000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:136
注 册:2010-3-12
收藏
得分:0 
非常感谢啊
2010-03-31 22:20
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:0 
类的成员变量在内存分部情况,是按类设计时,代码的顺序产生的,所以第一个成员变量的地址一般都是类对象实例的首地址,而这后的成员变量地址偏移,则是根据数据实际的内存上长度来偏移。(这里之所以说一般性,是因为有虚函数的类的首地址是一个虚函数表的指针,这时要取第一个成员变量,需要偏移一个指针的内存宽度)
例:
class A
{
private:
   int  m_i;
   char m_str[10];
}
class B
{
public:
   virtual fun();
   virtual fun1();
private:
   int  m_i;
   char m_str[10];
}
    A a;
    B b;
    //给m_i赋值100
    *((int*)(&a)) = 100;
    *((int*)((char*)(&b) + sizeof(void*))) = 100;//多加一个指针的宽度
    //给m_str赋值"test"
    char* pStrA = (char*)(&a) + sizeof(int) ;
    char* pStrB = (char*)(&b) + sizeof(void*) + sizeof(int);//多加一个指针的宽度
    sprintf_s( pStrA , 10 , "test");
    sprintf_s( pStrB , 10 , "test");
以上只是实验性的,实际情况要复杂的多少,要考虑到内存对齐的原则,变量的内存宽度是受影响的,所以想要真正做到强行访问私有成员变量,需要非常了解源代码的结构。
2010-04-01 20:55
快速回复:对象参数与私有变量
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.057025 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved