this 指针的简单理解

什么是 this 指针

要想理解什么是 this 指针,首先必须理解在 C++ 中是如何为类的对象分配内存空间的。

#include<iostream>
using namespace std;
class Student{
public:
    void CountTotal();
    void GetName(char name[]);
    void GetAmount();
    void GetPrice();
    void GetTotal();
private:
    char Name[24]; //占24个字节
    int Amount; //占4个字节
    float Price; //占4个字节
    float Total; //占4个字节 
};

int main(){
    Student stu;
    cout<<"对象stu占的字节数:"<<sizeof(stu)<<endl;
}

由上例可以看出,当用类 Student 定义一个对象 stu 时,内存开辟 36 个字节的空间用来存储这个对象,而内存开辟的空间刚好分配给了这个对象的四个成员变量(Name、Amount、Price、Total),那么问题来了,成员函数所占的内存空间为什么在对象定义时没有分配给所定义的对象呢?
其实原因很简单,并不是一个对象对应一个单独的成员函数体,而是此类的所有对象共用这个函数体。当程序被编译之后,此成员函数的地址就已经确定了。如果为每个类的对象都开辟空间来存储这个对象的成员函数,由于每个对象的成员函数的函数体代码都相同,只是所要传递的实参不一样,这样做会造成内存的浪费。那么类的成员函数又是如何识别不同对象传递过来的实参呢?没错,就是靠 this 指针。
在这里插入图片描述

this 指针的本质

我们先来看一个 struct 的例子

#include<iostream>
#include<string>
using namespace std;
struct Student{
    string Name;
    int Age;
    string Gender;
};
void Init(Student *_this,string name,int age,string gender){ //对对象进行初始化
    
    _this->Name=name;
    _this->Age=age;
    _this->Gender=gender;
}
int main(){
    Student stu1,stu2,stu3;
    Init(&stu1,"Tomwenxing",23,"male");
    Init(&stu2,"Jack",22,"male");
    Init(&stu3,"Ellen",18,"female");
    return 0;
}

如上例,_this 指针的作用是指向需要进行操作的对象,其作用和 C++ 类中的 this 指针相似,只不过类中的 this 指针是隐式的插入在类中的成员函数中,不需要编程者手动的定义,以类 Student 中的成员函数 GetAmount 为例:

//相当于void GetAmount(Student* this) 
 void Student::GetAmount(){
     //相当于return this->return; 
     return Amount;
 }
 
 int main(){
     Student stu;
     //相当股GetAmount(&stu);
     stu.GetAmount();
        return 0;
 }

那这就是 this 指针的本质的全部么?既然 this 指针的作用是指向需要进行操作的对象,并且是隐式的自动插入在类中的成员函数中,那我们在定义类的成员函数时是否可以手动的更改 this 指针的指向呢?

void Student::GetAmount(){
     this=NULL; //错误:c++不允许更改this指针的指向
     return Amount;
}

由上可知是不允许的,因为 this 指针是一个指针常量,即 this 指针一旦初始化,它就再也不能改变自己的指向,将会始终指向自己需要操作的对象,仍以 Student 类中的 GetAmount 为例:

//相当于void GetAmount(Student* const this) 
void Student::GetAmount(){
     //相当于return this->return; 
     return Amount;
}

因此 this 指针的本质是一个隐式插入类成员函数体中,用来指向需要操作的对象的指针常量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值