首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++种的公有数据成员可以通过类名访问,这是为何

2013-09-06 
C++类的公有数据成员可以通过类名访问,这是为何?#includeiostream#includecstdiousing namespace std

C++类的公有数据成员可以通过类名访问,这是为何?


#include<iostream>
#include<cstdio>
using namespace std;

class Point3d
{
public:
//static Point3d origin;
float x;
float y;
float z;

void funa() {};
};

int main()
{
cout<<&Point3d::z<<endl;
printf("%d\n",&(Point3d::z));
//Point3d:funa();
return 0;
}


不太懂,为何非静态公有数据成员可以通过类名来访问,这符合C++的标准吗,这种语法从何而来?
允许这样操作有意义吗? c++ 公有数据成员
[解决办法]
这是类成员指针啊
楼上这么多回帖的都不知道吗……

[解决办法]
首先,这不是C++标准规定的;但基本上编译器都这么实现。

指向类成员的指针本质上都不是指针,只是形似而已!

你不仅可以取数据成员的指针,还可以取成员函数指针&Point3d::funa!
不同的是,取成员函数指针不能绑定到具体对象;但取数据成员指针可以绑定到具体对象。这是C++标准规定的!

至于你说输出没意义,肯定是不可能的!
对于数据成员指针,输出的是对象内存而已里的偏移量;若绑定到具体对象,输出的是实际地址。
对于成员函数指针,若是非virtual则输出的是实际地址;若是virtual则输出vptrTable中的偏移量(编译器会做调整避免与空类冲突,一般会加1)。

以上都是针对非static成员,至于static成员的指针,不需多说吧,它们是真正意义上的指针!

还有我印象中,&(Point3d::z)这种写法是错误的!!
因为&Point3d::z格式是固定的,成员指针都是右值;而且这种写法会与static形式混淆,编译器应该提示出错!!

PS:关于成员指针,网上很多详解的;搜一下吧,我也只说了说其中一小部分,当然算是精华了!
[解决办法]
可以这样调用函数, 但前题是那个函数没有访问任何的成员变量, 否则程序崩溃是肯定的.

输出的地址是其偏移. 基于0. 因为还未分配内存空间, 如果分配了, 则以此内存为起点计算偏移.
[解决办法]
引用:
Quote: 引用:

发发运行结果,呵呵

VC6.0的结果

1
8
Press any key to continue_


cout输出1是由于ostream并没有重载类数据成员指针,但存在对bool的重载,因此类数据成员指针值被隐式转换为bool值输出了。

而printf并没有重载这样的东西,它只是简单地输出其值,由于类数据成员指针的值为该成员在类对象内存布局中的偏移,所以才输出8。

热点排行