03-3 空指针访问成员函数
在 c++中,允许空指针调用成员函数的,但是也需要注意有没有用到this
指针。
如果用到了this
指针,需要加以判断保证代码的健壮性。
#include <iostream>
using namespace std;
class Person
{
public:
int m_age;
void Print()
{
cout << "这是类Person" << endl;
}
void PrintAge()
{
cout << m_age << endl;
}
};
void main()
{
class Person* p;
p = NULL;
p->Print();
//p->PrintAge();
}
在这里面我们创建了一个类,名称是Person
,这里面有两个函数,一个函数只是打印一段话,另外一个函数是打印一个成员变量的数值。
之后我们创建了一个class Person
的指针p
,将这个p
设置到空的位置(也就是NULL
)。之后使用p
去调用函数,会发现如果调用的是只有打印一句话的函数,程序会正常运行。如果调用的函数中含有属性,则会报错。
如果调用的函数中含有属性,则会报错。将p->PrintAge();
打开,那么会有错误。报错如下
读取位置 0x0000000000000000 时发生访问冲突。
这是因为我们在调用含有属性的函数是,其实默认加上了this
。报错原因:传入的指针是NULL
。
比如这样一段代码:
void PrintAge()
{
cout << m_age << endl;
}
在编译器的眼中是这样的:
void PrintAge()
{
cout << this->m_age << endl;
}
但是我们使用的p
是一个空指针,那么this
没有确切的数据,那么就不可能访问到成员。
但是如果我们用到了空指针,我们需要加上一些操作来提高代码的健壮性,比如说这样:
void PrintAge()
{
if (this == NULL)
{
return;
}
cout << m_age << endl;
}
在这里会先判断传入的指针是否为空(this
指针,隐藏在每一个类中的对象中,不需要手动创建),如果传入的是空,那么会直接返回掉这个函数。
总结:
- 空指针可以访问成员函数
- 在成员函数可以添加
if (this == NULL) { return; }
来增强代码的健壮性。
:-)