1.this指针工作原理
我们知道,c++的数据和操作也是分开存储,并且每一个非内联成员函数(non-inline member function)只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码
那么问题是:这一块代码是如何区分那个对象调用自己的呢?
c++通过提供特殊的对象指针,this指针,解决上述问题。This指针指向被调用的成员函数所属的对象。
c++规定,this指针是隐含在对象成员函数内的一种指针。当一个对象被创建后,它的每一个成员函数都含有一个系统自动生成的隐含指针this,用以保存这个对象的地址,也就是说虽然我们没有写上this指针,编译器在编译的时候也是会加上的。因此this也称为“指向本对象的指针”,this指针并不是对象的一部分,不会影响sizeof(对象)的结果。
this指针是C++实现封装的一种机制,它将对象和该对象调用的成员函数连接在一起,在外部看来,每一个对象都拥有自己的函数成员。一般情况下,并不写this,而是让系统进行默认设置。
this指针永远指向当前对象。
this指针永远指向当前对象。
成员函数通过this指针即可知道操作的是那个对象的数据。This指针是一种隐含指针,它隐含于每个类的非静态成员函数中。This指针无需定义,直接使用即可。
注意:静态成员函数内部没有this指针,静态成员函数不能操作非静态成员变量。
2.this指针的使用
●当形参和成员变量同名时,可用this指针来区分
●在类的非静态成员函数中返回对象本身,可使用return *this.
class Person{
public://1. 当形参名和成员变量名一样时,this指针可用来区分Person(string name,int age){
//name = name;//age = age; //输出错误this->name = name;this->age = age;}//2. 返回对象本身的引用//重载赋值操作符//其实也是两个参数,其中隐藏了一个this指针Person PersonPlusPerson(Person& person){string newname = this->name + person.name;int newage = this->age + person.age;Person newperson(newname, newage);return newperson;}void ShowPerson(){cout << "Name:" << name << " Age:" << age << endl;}
public:string name;int age;
};//3. 成员函数和全局函数(Perosn对象相加)
Person PersonPlusPerson(Person& p1,Person& p2){string newname = p1.name + p2.name;int newage = p1.age + p2.age;Person newperson(newname,newage);return newperson;
}int main(){Person person("John",100);person.ShowPerson();cout << "---------" << endl;Person person1("John",20);Person person2("001", 10);//1.全局函数实现两个对象相加Person person3 = PersonPlusPerson(person1, person2);person1.ShowPerson();person2.ShowPerson();person3.ShowPerson();//2. 成员函数实现两个对象相加Person person4 = person1.PersonPlusPerson(person2);person4.ShowPerson();system("pause");return EXIT_SUCCESS;
}
3.视频内容
程序1:
#pragma warning(disable:4996)
//2022年9月22日20:31:02
#include <iostream>
using namespace std;class Maker
{
public:Maker(){a = 10;b = 20;}void func(){cout << this->a << " " << this->b << endl;}
public:int a;int b;
};
void test01()
{//1.分配空间。2.调用构造函数Maker m;m.func();
}
int main()
{test01();system("pause");return 0;
}
输出结果:
10 20
请按任意键继续. . .
程序2:
#pragma warning(disable:4996)
//2022年9月22日20:31:02
#include <iostream>
using namespace std;class Maker
{
public:Maker(){a = 10;b = 20;}void func()//func()函数只有一份{cout << this->a << " " << this->b << endl;}
public:int a;int b;
};void test01()
{//1.分配空间。2.调用构造函数Maker m;m.func();Maker m2;m2.func();
}class Maker2
{
public:int id;
public://1.当形参名和成员变量名相同时,用this指针区分Maker2(int id){this->id = id;}//2.反回对象的本身Maker2 &getMaker2(){return *this;//运算符重载时有用}
};int main()
{test01();system("pause");return 0;
}
程序3:
#pragma warning(disable:4996)
//2022年9月22日20:31:02
#include <iostream>
using namespace std;class Maker
{
public:Maker(){a = 10;b = 20;}void func()//func()函数只有一份{cout << this->a << " " << this->b << endl;}
public:int a;int b;
};void test01()
{//1.分配空间。2.调用构造函数Maker m;m.func();Maker m2;m2.func();
}class Maker2
{
public:int id;static int a;//静态成员变量
public://1.当形参名和成员变量名相同时,用this指针区分Maker2(int id){this->id = id;}//2.反回对象的本身Maker2 &getMaker2(){return *this;//运算符重载时有用}static void func(){this->a = 300;//静态成员变量,指针指向的空间并没有a}
};
int Maker2::a = 200;int main()
{test01();system("pause");return 0;
}
4.this指针(重点难点)
1.每个对象都有一个隐藏的this指针,但不属于对象,是编译器添加的
2.编译器会把this指针传入成员函数内
3.this指针指向对象的存储空间
4.this的作用:
class Maker2
{
public://1.当形参名和成员变量名相同时,用this指针区分Maker2(int id){this->id = id;}//2.返回对象的本身Maker2 &getMaker2(){return *this;//运算符重载时有用}
public:int id;
};
5.拓展
1.this指针指向的空间有没有存储静态成员变量?
没有
2.this指针的指向可以改变吗?
this指针的指向不能改变,也就是说this是Maker *const this;
6.防止空指针调用成员函数
class Maker
{
public:Maker(){a = 20;}void printMaker(){if (this == NULL){cout << "this==NULL" << endl;return;}cout << this->a << endl;}
private:int a;
};void test()
{Maker *m = NULL;m->printMaker();
}