您的位置:首页 > 其它

当指针并没有指向实际的对象时,能否调用对象的成员函数

2012-11-09 09:47 295 查看
先看程序吧:(这也是我遇见的笔试题)

#include <iostream>

using namespace std;

class Test1
{
public:
void func()
{
cout<<"Test1"<<endl;
}
};
class Test2
{
public:
Test2(int i = 0):val(i){}
void func()
{
cout<<val<<endl;
}
private:
int val;
};

class Test3
{
public:
virtual void func()
{
cout<<"Test3"<<endl;
}
};

int main(void)
{
Test1* p1 = NULL;
p1->func();//可以输出,为什么

Test2* p2 = NULL;
p2->func();//报错,为什么

Test3* p3 = NULL;
p3->func();//报错,为什么
return 0;
}

为什么Test1可以输出呢?因为这时并不需要p1的地址,因为Test1中的func函数的地址是固定的,编译器给func传入一个this指针,该指针为NULL,但在p1->func()中this指针没有使用到;这就好比是你给一个函数传递了错误的实参,但是这个对应的型参并没有时函数中被使用一样,不影响输出的结果。
这也就解释了为什么Test2中的不能输出,因为它的func使用了成员变量val,所以如果this指针并没有指向这个对象的话,就不能得到成员变量了,自然会出错。

那么Test3又是为什么呢?因为它有虚函数,所以需要虚函数表,vptr是在构造函数中初始化的,而p2并没有构造,故p2->Func();调用失败。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐