什么是this指针?
当我们进入一个房子之后,可以看见房子里的电视、灯、花草等,但是看不到房子的全貌。对于一个类的实例来说,
你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向这个实例
具体说明:
在建立对象时,系统会为每一个对象分配独立的存储空间,也就是给每个对象中的数据成员都分配
有自己独立的存储空间。如果对同一个类定义多个对象,则有多个同样大小的空间存放对象中的数据成员,
但对于成员函数来说,一个函数的代码段在内存中只有一份。也就是说,同一个类中的不同对象在调用自己的成员函数时,
其实它们调用的是同一段函数代码。
那么,当一个对象调用自己的成员函数时,如何保证成员函数中对数据成员的处理是针对自己的数据成员
而不是其他对象的数据成员呢?
答案就是:this指针
每一个非静态成员函数中都包含一个this指针
例子:
class A
{
public:
void set(int x)
{
this->a = x;
}
void print()
{
cout << "this" << this << endl;
}
private:
int a;
};
int main()
{
A a1;
cout << "&a1=" <<&a1<< endl;
a1.print();
system("pause");
return 0;
}
运行结果为:
这个例子这就说明this指针记录的是当前对象的内存地址,也就是this指针指向当前对象
在调用成员函数时,系统隐式地将对象的起始地址传递给成员函数,使this指针得到当前对象的地址。
于是在成员函数中对数据成员的引用,就按照this的指向找到对象的数据成员,实现对数据成员的操作。
也就是说, 成员函数中数据成员名的前面隐含有“this->” 的指向。
class Test
{
public:
Fun(int a)
{
//doSomething
}
private:
int a;
};
其实这个Fun函数里面有两个参数 Fun(Test* const this,int a);
this指针特性:
1.this指针的类型:类类型* const
2.this指针并不是对象本身的一部分,不影响sizeof的结果
3.this的作用域在类”成员函数”的内部
4.this指针是”类成员函数”的第一个默认隐含参数,编译器自动维护
5.传递,类编写者不能显式传递
6.只有在类的非静态成员函数中才可以使用this指针,其它任何函数都不可以
7.存储类型:this指针是由编译器生成的,当类的非静态成员函数的参数个数一定时
this指针存储在ecx寄存器中,调用——thiscall约定。若该函数参数个数未定(可变参数)存放在栈中
调用_cdecl.
注意:
1.this指针不能为空
2.为什么使用的是指针,而不是引用?
this指针的类型和类引用的类型都是Test* const但是,由于历史原因,C++最初是没有引用,而有指针的,
在设计类时,就采用了指针的方式,就导致了现在的局面。虽然引用理论上也可以实现this的功能。