能否解释一下?

cba_v 2008-11-04 01:25:34
在论坛看到的
class mystring
{
public:
mystring(const string& str, const int& count) : m_str(str), m_count(count)
{

}
private:
string m_str;
int m_count;
};

int main(int argc, char ** argv)
{
mystring ms(string("Hello, World!"), 2008);

cout << *((string*) &ms) << endl;
cout << *((int*)((string*) &ms + 1)) << endl;

return 0;
}

cout << *((string*) &ms) << endl; 为什么能输出m_str,
类中的成员不一定是按顺序存放的 但是 *((int*)((string*) &ms + 1)) 加一后 可以输出m_count 为什么?
...全文
159 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rickymathit 2008-11-05
  • 打赏
  • 举报
回复
这是对象的内存存放规律,你取对象的地址然后强转之后再输出肯定是输出对应的string指针的内容了
e_sharp 2008-11-05
  • 打赏
  • 举报
回复
UP
Big鹏 2008-11-05
  • 打赏
  • 举报
回复

cout < < *((string*) &ms) < < endl;
//&ms 取对象的地址,(string *)将其地址转成string类型,然后取值。由于对象的首地址和第一个变量的地址指向//一位置,帮输出m_str;
*((int*)((string*) &ms + 1)) 加一后 可以输出m_count 为什么?
//移动一个sizeof(string),即指向第二个变量的地址!!
jia_xiaoxin 2008-11-05
  • 打赏
  • 举报
回复
1.类的第一个变量的地址和类的对象的地址起始位置是同一个位置。所以用类的第一个变量的类型强制转化对象,就能得到第一个变量的指针。
2.加1就相当于偏移了一个string大小的地址,
可以这样理解,string * str; str + 1就是str指针向前移动1,移动的大小为string的大小
刚好指向第二个变量。
太乙 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cba_v 的回复:]
那函数 没有地址吗
怎么取
[/Quote]

函数有地址!!

http://www.cnblogs.com/yfcomeon/archive/2007/10/17/926996.html
cba_v 2008-11-05
  • 打赏
  • 举报
回复
那函数 没有地址吗
怎么取
xmczr 2008-11-04
  • 打赏
  • 举报
回复
注意几点:
1,是对地址进行的强制转换而不是变量本身。
2,注意类在内存的布局跟那些因素有关。
cnn_505 2008-11-04
  • 打赏
  • 举报
回复
&ms 是对象的首地址,指向对象大小的内存,强制转化成(string*)后,
就指向sizeof(string)大小的内存,输出对象的m_str
feng4206yu 2008-11-04
  • 打赏
  • 举报
回复
对象中的内容在内存中也是有规律摆放的,通过对象名得到指向该对象的指针,然后转换指针类型(也就是如何解释该指针),就可以读取内存的内容了...具体的,深入c++对象模型里面应该有详细的论述..
cba_v 2008-11-04
  • 打赏
  • 举报
回复
还有 为什么 强制转换后 能输出 类中的成员呢?
hhyttppd 2008-11-04
  • 打赏
  • 举报
回复
呵呵,不一定那也是有可能啊,你可以多搞几个编译器试试。
1 gcc
2 code warrior
3 vc、intel
cba_v 2008-11-04
  • 打赏
  • 举报
回复
不好意思 没贴上全部代码
class mystring
{
public:
mystring(const string& str, const int& count) : m_str(str), m_count(count)
{

}
private:
string m_str;
int m_count;
};

int main(int argc, char ** argv)
{
mystring ms(string("Hello, World!"), 2008);

cout << *((string*) &ms) << endl;
cout << *((int*)((string*) &ms + 1)) << endl;

return 0;
}

64,662

社区成员

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

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