C++中指向类的指针为NULL时依然可以调用类的成员函数?

rzhangww 2008-11-18 04:27:44
C++中指向类的指针为NULL时依然可以调用类的成员函数吗?要是可以的话想不通呀。
example:
class A
{
A(){a = 5; }

int a;
void sum()
{
int b = 10;
}
}

void main()
{
A *pa = NULL;
pa->sum();//问题这里,奇怪了为什么指针并没有new A,也就是说没有初始化,但是还可以执行函数sum()呢? (就是说怎么还能找得到sun()函数的地址呢?)
int aa = pa->a;//这个时候会出错误 找不到pa->a,这个是可以理解的。
}

在网上找到这样一句话,“类的成员函数仅仅是形式上与类一体,在实现中还是分开执行的。所以我们可以把类的成员函数近似地看作类的友元函数。”但还是没有彻底搞清楚这个问题,希望各位帮忙,多谢了!
...全文
394 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
greatliudy123 2011-11-28
  • 打赏
  • 举报
回复
感谢,学习了
aurora001 2008-11-19
  • 打赏
  • 举报
回复
http://blog.programfan.com/article.asp?id=39467
yndfcd 2008-11-19
  • 打赏
  • 举报
回复
如果是虚函数的话,就没法调用了.
qq78951354 2008-11-18
  • 打赏
  • 举报
回复
恩 学习了
luojc714 2008-11-18
  • 打赏
  • 举报
回复
学习了...
rzhangww 2008-11-18
  • 打赏
  • 举报
回复
明白了 多谢各位了!
xkyx_cn 2008-11-18
  • 打赏
  • 举报
回复
函数代码只有一份

[Quote=引用 6 楼 rzhangww 的回复:]
多谢各位的回答,还有一个疑问
A a1;
A a2;
难道a1.sum();和a2.sum():这两个的地址是一样的吗?
[/Quote]
WingForce 2008-11-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 rzhangww 的回复:]
多谢各位的回答,还有一个疑问
A a1;
A a2;
难道a1.sum();和a2.sum():这两个的地址是一样的吗?
[/Quote]

很明显是一样的。。。
rzhangww 2008-11-18
  • 打赏
  • 举报
回复
多谢各位的回答,还有一个疑问
A a1;
A a2;
难道a1.sum();和a2.sum():这两个的地址是一样的吗?
就呆在云上 2008-11-18
  • 打赏
  • 举报
回复
void main() 
{
A *pa = NULL;
//这里问题很简单,因为函数在类里面是独立于类存在的,而且不占用类的空间,在程序
//编译的时候就已经把函数的地址分配好了,因此只要有这么一个对象,不管他指向NULL还是
//非NULL都是可以调用函数的,也不会出错
pa->sum();
//但是这里就有问题了,pa就是NULL了,没有空间了,但是a是类的一个成员,没有空间的对象会有
//内部的a的存在?“皮之不存,毛将焉附?”
int aa = pa->a;
}
gaulis 2008-11-18
  • 打赏
  • 举报
回复
因为sum()不是存放在类的实例里面
xkyx_cn 2008-11-18
  • 打赏
  • 举报
回复
在网上找到这样一句话,“类的成员函数仅仅是形式上与类一体,在实现中还是分开执行的。所以我们可以把类的成员函数近似地看作类的友元函数。”但还是没有彻底搞清楚这个问题,希望各位帮忙,多谢了!

搜索一下关于thiscall的内容,好好看看
xhs_lh04 2008-11-18
  • 打赏
  • 举报
回复
成员函数不在类的空间里,它其实跟你的全局函数一样的,只不过名字不一样,编译器加了一些乱七八糟的东西,类参数都给你加到名字里了
所以pa->sum();
编译器给你组合过了其实是调用_类_函数_参数类型(),组合成你的类函数名进行调用,这个地址当然存在,在编译的时候就能确定下来的,当然不会报错,
而你指向类成员变量,那是分配在类空间里的,类对象都没有,当然没有此成员的地址了,所以找不到
WingForce 2008-11-18
  • 打赏
  • 举报
回复
编译器看到

pa->sum();


于是,直接调用sum()

65,210

社区成员

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

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