在如下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;
} 展开
#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;
} 展开
1个回答
展开全部
首先 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));
可以得到相同输出
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,这个就想不通了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询