this指针详解

原文地址:https://blog.csdn.net/qq_21110983/article/details/105558882


我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针:this指针,通过this指针来访问自己的地址。
注:this指针并不是对象的一部分,this指针所占的内存大小是不会反应在sizeof操作符上的。this指针的类型取决于使用this指针的成员函数类型以及对象类型,

this指针常用概念

this只能在成员函数中使用。全局函数,静态函数都不能使用this。实际上,成员函数默认第一个参数为T const register this。

为什么this指针不能在静态函数中使用?

大家可以这样理解,静态函数如同静态变量一样,他不属于具体的哪一个对象,静态函数表示了整个类范围意义上的信息,而this指针却实实在在的对应一个对象,所以this指针当然不能被静态函数使用了,同理,全局函数也一样。

  1. this指针是什么时候创建的?
    this在成员函数的开始执行前构造的,在成员的执行结束后清除。
  2. this指针如何传递给类中函数的?绑定?还是在函数参数的首参数就是this指针.那么this指针又是如何找到类实例后函数的?
    this是通过函数参数的首参数来传递的。this指针是在调用之前生成的。类实例后的函数,没有这个说法。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。自从类的函数定义完成后,它就在那儿,不会跑的。
  3. this指针只有在成员函数中才有定义。 因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们也无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以&this获得),也可以直接使用的。
  4. this指针经常隐藏使用。

this指针的使用:

一种情况就是,在类的非静态成员函数中返回类对象本身的时候,我们可以使用圆点运算符(this).,箭头运算符this->,另外,我们也可以返回关于this的引用,这样我们可以像输入输出流那样进行“级联”操作。

#include<iostream>
#include<string>
using namespace std;
class Stu_Info_Mange//定义了一个学生信息类,储存了学号,姓名,年龄,年纪
{
  int sno;
  string sname;
  int age;
  int grade;
public:
  Stu_Info_Mange(int s=0,string n="",int a=0,int g=0)//默认构造函数 
  {
    sno=s;
    sname=n;
    age=a;
    grade=g;
  }
  void Setsname(int sn)   //使用this指针进行赋值
  {
    this->sname=sn;
  }
  int  Setage(int a)
  {
    this->age=a;
    return (*this).age; //使用this指针返回该对象的年龄
  }
  void print()
  {
    cout<<"the sname is "<<this->sname<<endl;  //显式this指针通过箭头操作符访问
    cout<<"the sno   is "<<sno<<endl;//隐式使用this指针打印
    cout<<"the age   is "<<(*this).age<<endl;//显式使用this指针通过远点操作符
    cout<<"the grade is "<<this->grade<<endl<<endl;
  }

};
int main()
{
  Stu_Info_Mange sim1(761,"张三",19,3);

  sim1.print();      //输出信息

  sim1.Setage(12);  //使用this指针修改年龄

  sim1.print();     //再次输出
  return 0;
}

注意print函数中的隐式使用this指针,其实每个成员函数的调用都隐式使用了this指针。

this函数还有一种常见情况

#include<iostream>
#include<string>
using namespace std;
class num
{
private:
  int number;
public:
  num(int n = 0);
  const num& topval(const num& n)const;
  void show(void)const
  {
    cout << this->number;
  }
};

num::num(int n)
{
  this->number = n;//显示的使用this指针;
}
const num& num::topval(const num& n) const
{
  if (n.number > number)
    return n;    //如果传入的类的数字大小大于本身,则返回传入类 
  else             //否则返回原本对象 
    return *this;
}
int main(void)
{
  num Num[10] = { 1,2,3,4,5,6,7,8,9,25 };//类数组
  const num* top = &Num[0];//设置一个top变量一直指向类中num数值最大类
  for (int i = 1; i < 10; i++)
  {
    top = &top->topval(Num[i]);//使用循环遍历,俩俩比较找出最大值
  }
  cout << "最大值是:";
  top->show();
  return 0;
}

最大值是:25

在该例子中,使用了this指针将他*解引用返回他一个类的引用值,来达到了比较类的作用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值