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指针的本质是一个隐式插入类成员函数体中,用来指向需要操作的对象的指针常量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
**数字乡村解决方案摘要** **国家战略与乡村振兴** 中国正实施国家大数据战略,以加快数字中国的建设,整合数据资源,保障数据安全,并推动产业升级。2023年中央一号文件强调了乡村振兴战略,旨在通过产业兴旺、生态宜居、乡风文明、治理有效和生活富裕五大方面,实现农业农村现代化。 **数字乡村建设的重要性** 数字乡村建设是乡村振兴战略的重要组成部分,通过整合资源数据,推动物联网和遥感技术在农业中的应用,促进农业现代化。它被视为促进乡村转型发展的新方向,是数字化在农业农村经济社会发展中的应用。 **关键要素与效益** 数字乡村建设的关键要素包括数据资源整合、产业促进、农业发展规模化和标准化,以及改善乡村生活服务体系。预期效益包括提升国家治理能力,实现政府决策科学化和社会治理精准化,同时推动公共服务高效化。 **体系架构与数据融合** 数字乡村的体系架构包括乡村生态、基层治理、慧治、慧享、慧融、慧美、慧智和慧图等多个方面,实现城乡、政企、农户各级平台及服务的融合。数据融合是核心,整合乡村人口、产值、环境监测等多方面数据,为乡村治理和产业发展提供支撑。 **多业务协同与智慧治理** 数字乡村通过多业务协同应用平台,实现乡村物联网的布局和触达,涵盖农业生产、农资厂商、消费者等环节。区块链技术在农产品质量溯源中的应用,确保了产品全过程可追溯。乡村智慧治理通过村务管理、财务管理等方面提升治理效能,实现绿色发展理念。综合服务体系通过“互联网+服务”模式,提供便民服务和乡村经济发展支持,推动乡村全面振兴。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值