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

#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;
}

首先 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,这个就想不通了

温馨提示:答案为网友推荐,仅供参考
相似回答