this指针是一个隐藏的形式参数,其存放在栈中
空指针编译器不会编译不通过,只会在程序运行时对空指针解引用访问才会使得程序运行时报错。
【面试题】this指针可以为空吗?
- 情况一
class A{
public:
void Show(){
cout << "hello world" << endl;
}
private:
int _a;
};
int main(){
A* ptr = nullptr;
ptr->Show();
return 0;
}
成员函数的地址不在对象中存储而存在公共代码段,这里ptr->Show()
调用成员函数并不会去访问ptr
指向的内存空间,因此不存在指针解引用;并且在Show
内并没有对this
指针也就是ptr
解引用,因此不会报错。
- 情况二
class A{
public:
void PrintA(){
cout << this->_a << endl;
}
private:
int _a;
};
int main(){
A* ptr = nullptr;
ptr->PrintA();
return 0;
}
ptr->PrintA()
不是引起程序运行时报错的原因(原因如上情况一),this->_a
才是引起运行时报错的原因。this
代表的是ptr
,而ptr
是空指针,对空指针解引用使得程序运行报错。