| 查看: 2108 | 回复: 11 | ||
[求助]
c++ 一道题目,关于cout 和printf的差异,不理解(p82) 已有4人参与
|
||
|
下面是主函数的代码,另外,A .B是我定义的两个类,分别含有数据成员ma,mb和mc, 我有疑惑的地方就在于用printf输出和我注释掉的地方,我要查看的是数据成员的偏移量,为什么用cout(注释掉的地方)没有任何输出,但是用printf却可以正确输出呢,不理解,求指教。。 int main() { A a; B *pb=(B*)(&a); cout<<"&a:"<<&a<<endl; cout<<"&a.ma"<<&a.ma<<endl; printf("%p\n",&A::ma); printf("%p\n",&A::mb); printf("%p\n",&B::mc); /* cout<<"&A::ma"<<&A::ma<<endl; cout<<"&A::mb"<<&A::mb<<endl; cout<<"&B::mc"<<&B::mc<<endl; */ pb->print(); } |
» 猜你喜欢
不自信的我
已经有11人回复
北核录用
已经有3人回复
要不要辞职读博?
已经有6人回复
实验室接单子
已经有3人回复
磺酰氟产物,毕不了业了!
已经有8人回复
求助:我三月中下旬出站,青基依托单位怎么办?
已经有10人回复
26申博(荧光探针方向,有机合成)
已经有4人回复
论文终于录用啦!满足毕业条件了
已经有26人回复
2026年机械制造与材料应用国际会议 (ICMMMA 2026)
已经有4人回复
Cas 72-43-5需要30g,定制合成,能接单的留言
已经有8人回复
» 本主题相关价值贴推荐,对您同样有帮助:
求助,一道简单却不能小觑的题目
已经有14人回复
疑惑:一道C++的小程序,不理解
已经有9人回复
rbs
木虫 (小有名气)
- 应助: 32 (小学生)
- 金币: 3589.1
- 红花: 3
- 帖子: 221
- 在线: 16.3小时
- 虫号: 695603
- 注册: 2009-02-03
- 性别: GG
- 专业: 计算机应用技术
【答案】应助回帖
★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
我爱小虫子: 金币+7, ★★★★★最佳答案, 非常感谢,理解了 2014-04-01 19:01:57
感谢参与,应助指数 +1
我爱小虫子: 金币+7, ★★★★★最佳答案, 非常感谢,理解了 2014-04-01 19:01:57
|
第一:你的描述有错误。用cout不是没有任何输出,而是有一个“1”的输出 第二:&A::ma实际上是一个指向成员的指针类型,而不是一个普通指针类型。如果你使用VS2010编译器的话,写成cout<<(int)(&A::ma)<<endl即可,编译器就会告诉你: error C2440: “类型转换”: 无法从“int A::* ”转换为“int” 但是如果你用gcc4.9.8做类型转换就不会报错,而且会输出你想要的结果,也就是偏移量。编译器有区别原因我只能猜测为制造者的因素,而非C++标准的因素。 所以,你在5楼的说法是不对的,因为cout是没有针对成员指针进行重载的。因此对于cout<<&A::ma这样的代码,编译器只好将&A::ma转换成其能够匹配的类型。成员指针类型将被转化为bool型,且非空指针(空指针不是指向0位置的指针,而是不指向任何位置的指针)都将被转为true,而用cout输出true自然就是1。关于成员指针向bool转换,无论C++98标准,还是11标准,4.10节都说的非常清楚。 |
8楼2014-03-31 22:47:23
2楼2014-03-30 23:16:43
wenguilong
金虫 (小有名气)
- 应助: 9 (幼儿园)
- 金币: 666.7
- 散金: 4
- 帖子: 210
- 在线: 43.2小时
- 虫号: 2650431
- 注册: 2013-09-12
- 性别: GG
- 专业: 电路与系统
3楼2014-03-31 09:13:57
|
好的,下面是完整程序 #include<iostream> using namespace std; class A{ public: A(){ ma=1; mb=2; } ~A(){}; void print(){cout<<ma<<mb<<endl;} int ma,mb; }; class B{ public: B(){mc=3;} ~B(){} void print(){cout<<mc<<endl;} int mc; }; int main() { A a; B *pb=(B*)(&a); /* cout<<"&a:"<<&a<<endl; cout<<"&a.ma"<<&a.ma<<endl; printf("%p\n",&A::ma); printf("%p\n",&A::mb); printf("%p\n",&B::mc); */ cout<<"&A::ma"<<&A::ma<<endl; cout<<"&A::mb"<<&A::mb<<endl; cout<<"&B::mc"<<&B::mc<<endl; pb->print(); } 谢谢关注。望解答 |
4楼2014-03-31 17:58:21
5楼2014-03-31 17:58:46
libralibra
至尊木虫 (著名写手)
骠骑将军
- 程序强帖: 40
- 应助: 817 (博后)
- 金币: 12914.1
- 红花: 64
- 帖子: 2238
- 在线: 287.3小时
- 虫号: 696514
- 注册: 2009-02-05
- 专业: 计算机软件

6楼2014-03-31 18:56:51
wenguilong
金虫 (小有名气)
- 应助: 9 (幼儿园)
- 金币: 666.7
- 散金: 4
- 帖子: 210
- 在线: 43.2小时
- 虫号: 2650431
- 注册: 2013-09-12
- 性别: GG
- 专业: 电路与系统
7楼2014-03-31 21:46:45
9楼2014-03-31 23:47:37
rbs
木虫 (小有名气)
- 应助: 32 (小学生)
- 金币: 3589.1
- 红花: 3
- 帖子: 221
- 在线: 16.3小时
- 虫号: 695603
- 注册: 2009-02-03
- 性别: GG
- 专业: 计算机应用技术
10楼2014-04-01 08:23:24












回复此楼
我爱小虫子