c++小题 帮解释一下

来源:百度知道 编辑:UC知道 时间:2024/09/22 19:34:26
class A
{
public:

A()
: _memeber(88)
{
}

void testA()
{
printf("testA\n");
}

void testB()
{
printf("testB %d\n", _memeber);
}

virtual void testC()
{
printf("testC\n");
}

protected:

int _memeber;
};

int _tmain(int argc, _TCHAR* argv[])
{
// 写出以下程序中哪些运行时会出错的函数调用,哪些不会出错,并说明原因
A* a = 0;
a->testA();
a->testB();
a->testC();

return 0;
}
B和C时会出错 请说明详细些·

a->testB();会出错。a->testA();和 a->testC();不会出错。
因为A* a=0;只是是个空指针。并未指向任何实在的对象。a->testB();时。会访问_member.却找不到member。

很有意思的问题,平常没注意过,以下是我的推测(猜测):
程序执行时,A类的地址被存放在内存中,其成员函数testA和testB地址偏移量也已经载入内存,testc是虚函数,调用时会根据不同子类而去找函数地址从而调用,载入内存时候貌似是一个长度为4的虚表(具体作用实现我不太了解)

当运行a->testA时,可以正常输出,因为内存中可以找到函数A的地址

a->testB,也可以正常找到testB的地址。函数testB引用了成员变量,调用时候,会根据类A的地址,按地址偏移量去找到成员变量_memeber的地址。 注意,此时类的对象并没有正常初始化,即没有申请到内存空间来存储他的成员变量,所以函数testB得到的地址是一个不安全的地址值。

a->testC ,这个其实我一点都不知道了,推测是载入内存时候是一个长度为4的虚表,调用时会根据表的值去找不同子类的函数地址偏移量,还是因为类对象指针是个空指针,并没有实际申请到内存,所以这个虚表里的值都是未确定的,所以再一次调用了错误的指针,导致错误。

答案确实是BC

先写这么多,大家互相讨论吗,并且等待高手回答,我去翻翻书,看有没有这方面的

a->testA();相当于
(*a).testA();
所以“Ms_yam”辩的是对的。
三条语句失败,原因是对a,0指针解引用出错。

下列三句会出错:
a->testA();
a->testB();
a->testC();
原因是不能对指向0值的指针进行*运算.