在c++类的静态成员变量和静态成员函数中,多次涉及到了this指针。下面注重介绍一下
前面讲static成员变量占用的时候提到,如果sizeof类的大小,是不会计算static成员变量的,同样的也不会计算成员函数,
换句话说,其实成员函数是在类外的。那么当我们创建完对象,使用对象的成员函数,它是怎么知道我们访问的是哪个对象的成员变量的?
我们知道编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数能在创建对象后通过对象来调用并访问该对象的成员变量。
在创建对象之后,调用对象的成员函数时,编译器会将我们左边的代码翻译成右边的样子。
关于this指针,有以下几点总结:
1)this指针指向当前对象,可以访问当前对象的所有成员变量。包括private、protected、public。
2)this指针是const指针,一切企图修改该指针的操作,如赋值(改变指向)、增减都是不允许的!
3)this指针只有在成员函数中才有定义。因此,在创建一个对象后,也不能通过对象使用this指针。所以,我们也无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以&this获得),也可以直接使用的。
4)只有创建对象后,this指针才有意义。
5)static静态成员函数不能使用this指针。原因静态成员函数属于类,而不属于某个对象,所以static静态成员函数压根就没有this指针。
6)this在成员函数的开始执行前构造的,在成员函数的执行结束后清除。至于如何清除的,由编译器实现,程序员不关心。this是通过函数参数的首参数来传递的。
拓展1:如果在堆上创建对线,student *pstu = new student;这里的this的值和pstu的值是相同的。
#include <iostream>
#include <cstring>
using namespace std;
class AA
{
public:
AA(int a)
{
m_a = a;
}
~AA()
{
}
void PinrtThis()
{
printf("this = 0x%x\n", this);
}
private:
int m_a;
};
int main(void)
{
AA *pa = new AA(10);
pa->PinrtThis();
printf("pa = 0x%x\n", pa);
return 0;
}
拓展2:如何返回对象本身
#include <iostream>
#include <cstring>
using namespace std;
class AA
{
public:
AA(int a)
{
m_a = a;
}
AA& returnAA()
{
return *this;
}
void Pinrt()
{
printf("m_a = %d\n", m_a);
}
private:
int m_a;
};
int main(void)
{
AA a(10);
AA b = a.returnAA();
b.Pinrt();
return 0;
}
this是一个指针指向对象,如果要在类的成员函数中返回对象本身,需要对this取值,也就是*this