目录
this指针介绍
C++类实例化创建对象,函数是共用的,变量是每个对象独一份的。(第二级内容,类的存储部分)
那在函数中要使用成员变量,怎么知道是哪个对象的呢?
C++中有一个隐藏彩蛋,在每一个成员函数中都有一个藏着的this指针作为函数的第一参数。
this指针就是指向当前调用函数的对象的一个指针,既然是一个指向对象的指针,相对的就可以通过这个指针,获取当前对象的成员变量。
this指针的使用
#include<iostream>
using namespace std;
class Person {
public:
Person(int age){
//1、当形参和成员变量同名时,可用this指针来区分
this->age = age;
}
Person& PersonAddPerson(Person p){
this->age += p.age;
//返回对象本身
return *this;
}
int age;
};
int main() {
Person p1(10);
cout << "p1.age = " << p1.age << endl;//打印出来还是10
Person p2(20);
p2.PersonAddPerson(p1).PersonAddPerson(p1); //20+10+10=40 链式调用(返回的还是对象)
cout << "p2.age = " << p2.age << endl;
return 0;
}
由上述代码看出
1.this指针,并不用写在函数参数上,就可以使用。
2.出现同名变量时,this指针代表的是类内的成员变量,而参数上的则是传入的变量。
3. return *this,解引用this指针,就是这个对象。返回值如果是引用,相当于返回对象本身。
4.由3我们知道如果能返回对象本身,那就可以链式调用,调用完一次后返回的还是本身,在调用这个函数,就是链式调用。
this指针的本质
this指针的本质:const Type(类名)* const this;双const限制
双const 第一个const保证的是this指针指向的对象的内容不能改变。(关于对象内容的)
第二个const保证的是this指针指向的对象不能改变。(关于指针指向的)
const详解点这里->后期补上,还没写。
Person& PersonAddPerson(/*const Person* const this,*/Person p){
this->age += p.age;
//返回对象本身
return *this;
}
p2.PersonAddPerson(p1).PersonAddPerson(p1);
这段代码中我们第一个参数const Person* const this,后面person p是传入的参数。
下面调用这段代码时 p2 调用的函数所以就指定了 p2 是此次调用的this。
所以p2.PersonAddPerson(p1) <==> PersonAddPerson(&p2,p1);
注意: PersonAddPerson(&p2,p1)是不可用的只是抽象表示一下
this指针的tips
1.只能在成员函数中使用,且只有成员函数有
在成员函数中使用,全局函数和静态函数(函数前 + static)就算写在类中也不能使用。
2.在使用时创建,完成时删除。同时系统默认创建,不接受外界传入。
创建指针,然后指针指向对象,结束后可以通过*this返回对象,但是this不能传出
3.经典描述
当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子的全貌 ,你看不到了。
对于一个对象(也就是类的实例)来说,你可以看到它的成员函数、成员变量,但是看不到对象本身了。
所以有了this指针,它时时刻刻指向你这个对象本身(随时能通过指针找到对象,然后进去房子里找东西)