C++的一个大秘密

prettyboybaoxiaopeng 2009-11-08 10:04:45
题目是吸引眼球的,不过有个现象想请大家解释一下:

在MFC的一个错误,我把它抽象出来了。//我觉得这是研究问题的好办法。


#include <iostream.h>

class A
{
public:
int i;
void funA()
{
cout<<"in funA"<<endl;
//i++;
}

};


class B
{
public:
A* a;
void funB()
{
a->funA();
}
};


void main()
{
B b;
(&b)->funB();

}


这个程序中B类的成员A* a并没有指向任何一个对象,确也能调用a->funA();这与常理违背呀!

于是我在funA()加了i++;后更奇怪了,编译没问题,运行出错。

请大家来解释一下这现象啊,这个错误找了半天才找出来,能说说这么调试这种程序错误也行!
...全文
733 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouxingyu896 2009-11-10
  • 打赏
  • 举报
回复
学习

学习

das_jack 2009-11-10
  • 打赏
  • 举报
回复
查看c++对象模型,对于这种情况,可见c++实现类结构的机制,自然成员函数被处理成一般的函数,this未初始,所以当调用时,如果未引用到成员,也就是对this的访问,自然是可以运行的
Michael_Xie 2009-11-10
  • 打赏
  • 举报
回复
你可以看看The C++ Programming Language
Michael_Xie 2009-11-10
  • 打赏
  • 举报
回复
1.成员函数空间是编译期间分配的,并不和类对象空间一起,所以你会看到funcA()的输出;
2.i是成员变量,是属于特定对象的,只有对象存在的时候它才是合法的,所以对i做操作是非法的。

这样解释清楚吗?
lizzoe 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 berryluo 的回复:]
程序的语法确实是没问题的
A* a; 没有赋初值,那么a这个指针指向的空间就是一个不确定的值,程序运行的时候,会把a指向的地址空间看成是一个A实例对象,当然基本这种不确定值的地址空间是你的程序不能访问的,所以运行时程序会崩溃掉,一般会是提示你访问了不可访问的地址空间;
当然假如你的程序里有一个A的实例对象,而且你的a指针指向的这个“不确定值”又刚好指向你程序里的那个A的实例对象的地址,你的程序还真会正常运行,不过这种情况应该是“不可能事件”。。。。。。
[/Quote]

xuexi
zhang3xing1 2009-11-09
  • 打赏
  • 举报
回复
A的构造函数初始化变量i为某个值;或者在B的构造函数实现也可以;

changy 2009-11-09
  • 打赏
  • 举报
回复
不是秘密,跟MFC也没关系
thy38 2009-11-09
  • 打赏
  • 举报
回复
在两种情况下这个程序就跑不了了:
1.funA中访问了A的成员变量
2.funA是个虚函数。
na2650945 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 berryluo 的回复:]
程序的语法确实是没问题的
A* a; 没有赋初值,那么a这个指针指向的空间就是一个不确定的值,程序运行的时候,会把a指向的地址空间看成是一个A实例对象,当然基本这种不确定值的地址空间是你的程序不能访问的,所以运行时程序会崩溃掉,一般会是提示你访问了不可访问的地址空间;
当然假如你的程序里有一个A的实例对象,而且你的a指针指向的这个“不确定值”又刚好指向你程序里的那个A的实例对象的地址,你的程序还真会正常运行,不过这种情况应该是“不可能事件”。。。。。。
[/Quote]
貌似明白啦。
aflyeagle 2009-11-09
  • 打赏
  • 举报
回复
一年都没有看过类了,都忘记了
forster 2009-11-09
  • 打赏
  • 举报
回复
这里call funA会传递一个错误的this指针(ecx),通过this指针引用i时出错
如果class 有虚函数 会在通过错误A指针在vtable中找funA时出错
The_facE 2009-11-09
  • 打赏
  • 举报
回复
果然只是吸引眼球的......
sj13426074890 2009-11-09
  • 打赏
  • 举报
回复
mark
unfuncs 2009-11-09
  • 打赏
  • 举报
回复
没有访问成员变量可以运行的,加入了访问成员变量,因为没有实例化成员变量的地址的地址是不确定的,当然会访问出错。
ghost0088 2009-11-09
  • 打赏
  • 举报
回复
貌似类的成员函数与成员变量创建时间是不同的。

class A
{
public:
A()
{
data = 1;
}
void fun()
{
printf("Hello");
}

int data;
}

int main()
{
A *a = new A();
a = NULL;
a->fun(); //可能成功print
a->data = 0;//必定崩溃
return 0;
}
zj294006 2009-11-09
  • 打赏
  • 举报
回复
新手来学习下,是不是不给a赋初值是很危险的事?
陌上花花 2009-11-09
  • 打赏
  • 举报
回复
新手来学习下呀
Julykey 2009-11-09
  • 打赏
  • 举报
回复
具体问题具体分析吧
id648897547 2009-11-09
  • 打赏
  • 举报
回复
新来的新人,进来看见大家都很有才,小弟有礼了
我看你有戏 2009-11-09
  • 打赏
  • 举报
回复
切忌不要用侥幸心理去考研你的编译器
加载更多回复(23)

64,682

社区成员

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

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