在如下C++程序中,为什么cout 和printf输出的值不一致?

#include<iostream>#include<cstdio>usingnamespacestd;classPoint3d{public:staticPoint3d... #include<iostream>
#include<cstdio>
using namespace std;
class Point3d{
public:
static Point3d origin;
float x;
float y;
float z;
};
int main()
{
cout<<&Point3d::z<<endl;
printf("%d\n",&(Point3d::z));
return 0;
}
展开
 我来答
风若远去何人留
2013-09-03 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450129
专业C/C++软件开发

向TA提问 私信TA
展开全部
首先 Point3d::z是一种错误的调用方式

z是一个类中的变量,在没有创建对象的时候,这个类中变量是没有实际的内存空间的,对其取地址也就没有意义
要想采用Point3d::z这种方式,需要把float定义为static,这样在没有构建对象时就有自己的地址了

cout<<&Point3d::z<<endl;

输出指针的地址
printf("%d\n",&(Point3d::z));同样是输出地址的值,不过是10进制的

在不同程序中,地址不同,我测试的结果
0x8049ab4
134519476
可以看到134519476就是10进制的0x8049ab4,二者是相同的
如果要达到相同的输出效果,可以在printf中用%p,这个是C中用来输出指针的格式
cout<<&Point3d::z<<endl;
printf("%p\n",&(Point3d::z));
可以得到相同输出
追问
我写的这个程序是在深度探索C++|对象模型中看到的,在VC6.0下
cout的结果为1,printf的结果为8
书中提到: &Point3d::z 将得到z在class object 中的偏移量。
追答
这样啊。。。 
搞不懂了
在g++下编译,直接会报错的
bd.c: In function 'int main()':
bd.c:4499: error: invalid use of non-static data member 'Point3d::z'
bd.c:4504: error: from this location

不觉得这样属于C++标准的操作方式 可能是部分编译器的扩展吧
至于结果,为2 为8的话都可以解释通,不过为1,这个就想不通了
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式