C++ this指针的理解
this 指针: 指向成员函数所作用的对象;
注意: 从这个定义即可看出, this存在的前提是对象必然存在。
- 非静态成员函数中可以直接使用this 来代表该函数作用的对象的指针。
- 静态成员函数中不可以使用this 指针,因为静态成员函数是在类上只有一份,跟对象无关,即 对象不存在时就可以执行该函数。
class A {
private:
int i;
public:
void Hello() { // 编译器翻译为C程序得到: Hello(A* this)
cout << "hello" << endl;
}
};
int main()
{
A* p = nullptr;
p->Hello(); //编译器翻译为C程序得到: Hello(p);
return 0;
}
输出结果:
hello
Process finished with exit code 0
C++ 程序编译的步骤是先将C++程序转换为C 程序,然后再使用C 编译器进行编译;
这个是历史原因,C++语言是在C 语言的后面发展起来的,当时只有C的编译器,所以就将C++转换为C语言,然后在使用C编译器进行编译。
所以,我们可以看到下面2个规则:
- C++ 的非静态成员函数 实际参数个数比定义的多一个,因为第一个参数是this 指针;参考上面的Hello()函数;
- C++ 的静态成员函数 实际参数个数与定义的相同,因为静态成员函数不作用于某个具体的对象,整个类中只要一份, 所以也就跟this 指针没有关系了。
理解了上面的规则,那么我们就可以知道为什么 上面的程序能够正常执行了。
因为Hello 函数实际执行时有传递this 指针,即使它为nullptr,但是在我们的函数体中并没有使用这个this 指针,所以程序可以正常执行。
可以尝试在Hello()函数中访问成员变量i,那么你就会发现程序会崩溃。