此篇博客仅作为个人学习总结,顺便分享,有幸被小伙伴们看到时如果文章中有什么问题希望大家能帮我提出来,共同进步。
1.类
要理解this关键字首先通过C语言的结构体来理解C++中的类。
C:
struct A {
int x;
int y;
};
C++:
class A {
public:
int x;
int y;
}
然后加入函数。
C:
struct A {
int x;
int y;
};
void func();
C++:
class A {
public:
int x;
int y;
void func();
}
2.调用函数
在C++中,同一个类的不同对象在调用该类下的同一个函数时,本质上是函数通过调用它的对象的地址来判断是谁在调用它。用C语言实现的话其实就是:
struct A {
int x;
int y;
};
void func(struct A* this)
{
printf("...");
}
int main()
{
struct A* a;
func(a);
}
来到面向对象的C++中,这个this就是每一个类所有的成员函数都拥有的一个隐藏的参数。因此会出现如下情况:
#include <stdio.h>
class A {
public:
int x;
int y;
void func();
};
void A::func() {
x = 1;
printf("A::func()中的x的地址=%p\n", &x);
printf("this=%p\n", this);
int main() {
A a;
A aa;
a.func();
aa.func();
}
输出结果:
可以看到,对象a调用func时变量x的地址与this的值是一样的,对象aa调用func时变量x的地址与this的值是一样的。
综上,可以将func函数的定义看作是:
void A::func(A *p)
在创建了对象a之后,调用函数时可以看作是:
A::func(& a);
3.结论——this:Pointer to the caller
在学习过程中通过C来理解C++是一个非常好的学习方法,通过这样的方式,得知C++中的关键字this就相当于是指向所属类的对象的指针(pointer to the caller),因此通过对象调用某个成员函数时,成员函数根据this提供该对象的地址来判断是哪个对象调用了它。