[地址][指针]疑问:为什么一个空指针可以调用类的静态方法?

Tamce 2014-10-22 05:56:57
如下代码
(tamce::conio是我在tamce命名空间内定义的一个类,showHello()为静态成员,输出Hello)

(*((tamce::conio *)((void *)(0)))).showHello();

运行结果:
输出Hello

std::cout << ((tamce::conio *)((void *)(0)));

运行结果:0

这是怎么回事?为什么对一个空指针解引用就可以调用类的静态方法?
...全文
168 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tamce 2014-10-25
  • 打赏
  • 举报
回复
引用 6 楼 u010328107 的回复:
非静态方法可以访问了成员变量。
引用 4 楼 bluesnail1986 的回复:
函数代码本身就不在类里,空指针又能如何?只要不去访问成员变量就没问题~~ 如同3楼的解释,即便不是静态方法也一样的
天!自己试了一下,不是静态方法也可以通过空指针访问!!只不过如果在该方法内访问了成员变量就出错了... 非静态方法使用静态成员:不出错,正常输出 非静态方法使用非静态成员:运行时出错 静态方法使用静态成员:不出错,正常输出 我貌似终于明白了原理上的东西... 谢谢大家了
u010328107 2014-10-22
  • 打赏
  • 举报
回复
非静态方法可以访问了成员变量。
Tamce 2014-10-22
  • 打赏
  • 举报
回复
引用 4 楼 bluesnail1986 的回复:
函数代码本身就不在类里,空指针又能如何?只要不去访问成员变量就没问题~~ 如同3楼的解释,即便不是静态方法也一样的
非静态方法访问了成员变量的话就不行了是吧!
bluesnail1986 2014-10-22
  • 打赏
  • 举报
回复
函数代码本身就不在类里,空指针又能如何?只要不去访问成员变量就没问题~~ 如同3楼的解释,即便不是静态方法也一样的
Tamce 2014-10-22
  • 打赏
  • 举报
回复
引用 1 楼 xihu1364 的回复:
静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。 而使用空指针访问,是因为这个函数地址本来就在内存中存在
所以该类型的指针只是相当于"tamce::conio::",说明这是该类的方法,然后去找到这个类这个静态函数的地址并且执行的吗?
勤奋的小游侠 2014-10-22
  • 打赏
  • 举报
回复
class A { publice: void func(){}; } main() { A* p =0; p->func();//完全没有问题 }
版主大哥 2014-10-22
  • 打赏
  • 举报
回复
静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。 而使用空指针访问,是因为这个函数地址本来就在内存中存在

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧