C++:this指针的简单理解
一、什么是this指针
要想理解什么是this指针,首先必须理解在C++中是如何为类的对象分配内存空间的。
1 #include<iostream> 2 using namespace std; 3 class Student{ 4 public: 5 void CountTotal(); 6 void GetName(char name[]); 7 void GetAmount(); 8 void GetPrice(); 9 void GetTotal(); 10 private: 11 char Name[24]; //占24个字节 12 int Amount; //占4个字节 13 float Price; //占4个字节 14 float Total; //占4个字节 15 }; 16 17 int main(){ 18 Student stu; 19 cout<<"对象stu占的字节数:"<<sizeof(stu)<<endl; 20 }
由上例可以看出,当用类Student定义一个对象stu时,内存开辟36个字节的空间用来存储这个对象,而内存开辟的空间刚好分配给了这个对象的四个成员变量(Name、Amount、Price、Total),那么问题来了,成员函数所占的内存空间为什么在对象定义时没有分配给所定义的对象呢?
其实原因很简单,并不是一个对象对应一个单独的成员函数体,而是此类的所有对象共用这个函数体。当程序被编译之后,此成员函数的地址就已经确定了。如果为每个类的对象都开辟空间来存储这个对象的成员函数,由于每个对象的成员函数的函数体代码都相同,只是所要传递的实参不一样,这样做会造成内存的浪费。那么类的成员函数又是如何识别不同对象传递过来的实参呢?没错,就是靠this指针。
二、this指针的本质
我们先来看一个struct的例子
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 struct Student{ 5 string Name; 6 int Age; 7 string Gender; 8 }; 9 void Init(Student *_this,string name,int age,string gender){ //对对象进行初始化 10 11 _this->Name=name; 12 _this->Age=age; 13 _this->Gender=gender; 14 } 15 int main(){ 16 Student stu1,stu2,stu3; 17 Init(&stu1,"Tomwenxing",23,"male"); 18 Init(&stu2,"Jack",22,"male"); 19 Init(&stu3,"Ellen",18,"female"); 20 return 0; 21 }
如上例,_this指针的作用是指向需要进行操作的对象,其作用和C++类中的this指针相似,只不过类中的this指针是隐式的插入在类中的成员函数中,不需要编程者手动的定义,以类Student中的成员函数GetAmount为例:
1 //相当于void GetAmount(Student* this) 2 void Student::GetAmount(){ 3 //相当于return this->return; 4 return Amount; 5 } 6 7 int main(){ 8 Student stu; 9 //相当股GetAmount(&stu); 10 stu.GetAmount(); 11 return 0; 12 }
那这就是this指针的本质的全部么?既然this指针的作用是指向需要进行操作的对象,并且是隐式的自动插入在类中的成员函数中,那我们在定义类的成员函数时是否可以手动的更改this指针的指向呢?
1 void Student::GetAmount(){ 2 this=NULL; //错误:c++不允许更改this指针的指向 3 return Amount; 4 }
由上可知是不允许的,因为this指针是一个指针常量,即this指针一旦初始化,它就再也不能改变自己的指向,将会始终指向自己需要操作的对象,仍以Student类中的GetAmount为例:
1 //相当于void GetAmount(Student* const this) 2 void Student::GetAmount(){ 3 //相当于return this->return; 4 return Amount; 5 }
因此this指针的本质是一个隐式插入类成员函数体中,用来指向需要操作的对象的指针常量。