当指针并没有指向实际的对象时,能否调用对象的成员函数
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();调用失败。
#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();调用失败。
相关文章推荐
- this指针指向当前调用对象,只是用于类的非静态成员函数。静态函数和全局函数 无当前对象,无this指针。
- Qt使用回调函数报错“函数调用缺少参数列表,请使用&xxx创建指向成员的指针”解决办法
- C++之指向对象成员函数的指针
- 对象指针为NULL,为什么还是可以调用成员函数
- 当父类指针指向子类对象时的函数调用
- B继承自A,A指针无法隐式转换为B指针,函数参数只管指针类型,与实际指向对象无关
- “error C3867: “XXX”: 函数调用缺少参数列表;请使用“&XXX”创建指向成员的指针”的错误
- C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- VC++之对象含指针成员指向堆空间并调用复制构造函数问题—参考范磊VC++
- 多态继承情况下,有一个基类指针指向派生类对象,如何用它调用基类的虚函数?
- B继承自A,A指针无法隐式转换为B指针,函数参数只管指针类型,与实际指向对象无关
- static函数 函数调用缺少参数列表;请使用“&XXX”创建指向成员的指针;类的static成员函数
- 巧妙解决问题:&CMFCcodeDlg::RunCommands”创建指向成员的指针。MFC多线程调用要求调用的接口必须是全局函数或静态成员函数
- 指向对象成员变量的指针和指向成员函数的指针
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- this 指针的地址--调用成员函数的所在对象的起始地址
- 函数调用缺少参数列表;请使用“&****Dlg::getThread”创建指向成员的指针”--多线程函数调用
- error: 函数调用缺少参数列表;请使用“&BinTree<char>::_PrintNode”创建指向成员的指针
- 指向对象的指针访问成员函数
- 函数调用缺少参数列表;请使用“&Student::Printf”创建指向成员的指针 问题解析