首先是空指针调用成员函数的场景的完整代码:
//空指针访问成员函数
class Person {
public:
void ShowClassName() {
cout << "我是Person类!" << endl;
}
void ShowPerson() {
if (this == NULL) {
return;
}
cout << mAge << endl;
}
public:
int mAge;
};
void test01()
{
Person * p = NULL;
p->ShowClassName(); //空指针,可以调用成员函数
p->ShowPerson(); //但是如果成员函数中用到了this指针,就不可以了
}
int main() {
test01();
system("pause");
return 0;
}
C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针,如果用到this指针,需要加以判断保证代码的健壮性
空指针可以调用成员函数,但是如果成员函数中用到了this指针就不可以了,为什么???
原因在于成员函数隐含地通过this指针来访问对象,如果this指针为空,就无法正常完成成员函数的执行。
当对一个空指针调用成员函数时,this指针的值为nullptr。编译器可以允许调用发生,但是实际执行时需要通过this访问对象的数据与函数,这时就会出问题。
例如:
class Person {
void printName() {
cout << name << endl;
}
string name;
}
int main() {
Person* p = nullptr;
p->printName(); // 错误,空指针无法读取name
}
printName函数需要通过this指针查找name成员,但是此时this==nullptr,无法定位和访问name变量,因此会出错。
所以编译器可能允许调用,但是执行时的Crash是不可避免的。
这就是空指针不能调用涉及this指针的成员函数的根本原因。空指针根本无法定位和访问对象内存。