空指针访问成员函数问题
先看一段代码,分析结果:
#include<iostream>
using namespace std;
class Person{
public:
void show(){
cout << "Person show" << endl;
}
void showAge(){
cout << this->m_Age << endl;
}
int m_Age;
};
void test01(){
Person * p = NULL;
p->show();
p->showAge();
}
int main(){
test01();
return EXIT_SUCCESS;
}
如果把p->showAge();
注释掉,程序是可以正常运行的,结果为打印"Person show"
但是为什么加上p->showAge();
之后,程序运行就会崩溃呢?
原因是C++会在成员函数里隐含加上this指针,也就是代码如下:
#include<iostream>
using namespace std;
class Person{
public:
void show(Person* this){
cout << "Person show" << endl;
}
void showAge(Person* this){
cout << this->m_Age << endl; //NULL -> m_Age
}
int m_Age;
};
void test01(){
Person * p = NULL;
p->show();
p->showAge();
}
int main(){
test01();
return EXIT_SUCCESS;
}
在show
函数内,没有用到this
对象,仅仅提供打印功能,所以没有报错,但是showAge
函数内,用到了this
对象的成员函数,由于Person * p = NULL;
则访问空的成员就会报错。
我们常常在成员函数里加上判空检查,来保证代码的鲁棒性:
#include<iostream>
using namespace std;
class Person{
public:
void show(){
cout << "Person show" << endl;
}
void showAge(){
if (this == NULL){
return;
}
cout << this->m_Age << endl;
}
int m_Age;
};
void test01(){
Person * p = NULL;
p->show();
p->showAge();
}
int main(){
test01();
return EXIT_SUCCESS;
}