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

先看程序吧:(这也是我遇见的笔试题)

#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();调用失败。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值