Object* pObj = nullptr;
空指针是指向nullptr的指针,比如pObj就是一个例子。
空指针能被使用去调用一个方法吗?
通常人们说不能,因为空指针所指没有对象,没对象,那也就不存在方法的调用了。
但实际上存在意外:
class Names
{
public:
Names() = default;
~Names() = default;
std::string GetTestName()
{
return "TestName";
}
std::string GetName()
{
return m_Name;
}
private:
std::string m_Name = "RealName";
};
void CCxxTestDlg::RunTest()
{
m_strOutput = _T("已经运行。\r\n");
Names* pName = new Names;
delete pName;
pName = nullptr;
m_strOutput += pName->GetTestName().c_str();
m_strOutput += "\r\n";
上面的简单代码,你能看到
delete pName;
这行代码,不会将指针pName设置为nullptr,因此需要手动在后面行设置为nullptr。
pName = nullptr;
按理说pName这里已经被置空了,不能再被调用方法了。
m_strOutput += pName->GetTestName().c_str();
但意外的是,这行代码,pName一个空指针,调用pName->GetTestName()方法是能工作的。
这是输出结果,红线所示是输出的TestName。
当然,pName->GetName()就不行了。
实际上,这个意外例子还可以更简单。
Names* pName = nullptr;
m_strOutput += pName->GetTestName().c_str();
m_strOutput += "\r\n";
这样就可以了,代码能工作。