• C++ this指针详解


                     C++this指针操作

    在这里总结一下this 指针的相关知识点。

      首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针:this指针,通过this指针来访问自己的地址。注:this指针并不是对象的一部分,this指针所占的内存大小是不会反应在sizeof操作符上的。this指针的类型取决于使用this指针的成员函数类型以及对象类型,(1)假如this指针所在类的类型是Stu_Info_Mange类型,(下面的测试用例中的类的类型,借来用用),并且如果成员函数是非常量的,则this的类型是:Stu_Info_Mange * const 类型,(2)既一个指向非const Stu_Info_Mange对象的常量(const)指针,假若成员函数是常量类型,则this指针的类型是一个指向constStu_Info_Mange对象的常量(const)指针。有点绕吧,仔细理解。

     

     

    二: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获得),也可以直接使用的。

     

     

    三: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;
    }
    
    



         以上的例子中,我们要设置一个学生的信息,需要对每一个相关变量所属的成员函数进行调用(名字调用设置名字的成员函数。。。),我们还可以使用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;
    	}
    	<span style="color:#ff0000;">Stu_Info_Mange &</span> Setsname(string s)   //<span style="color:#ff0000;">所有的相关函数,都返回该对象的引用,这样就可以实现级联,方便编码</span>
    	{
    		this->sname=s;
    		<span style="color:#ff0000;">return (*this);</span>
    	}
    	<span style="color:#ff0000;">Stu_Info_Mange &</span> Setsno(int sno)
    	{
    		this->sno=sno;
    		<span style="color:#ff0000;">return *this</span>;
    	}
    	<span style="color:#ff0000;">Stu_Info_Mange &Setgrade(</span>int grade)
    	{
    		this->grade=grade;
    		<span style="color:#ff0000;">return *this;</span>
    	}
    	<span style="color:#ff0000;">Stu_Info_Mange &</span>Setage(int age)
    	{
    		this->age=age;
    		<span style="color:#ff0000;">return *this;</span>
    	}
    	void print()
    	{
    		cout<<"the sname is "<<this->sname<<endl;
    		cout<<"the sno   is "<<this->sno<<endl;
    		cout<<"the age   is "<<this->age<<endl;
    		cout<<"the grade is "<<this->grade<<endl<<endl;
    
    	}
    };
    int main()
    {
    	Stu_Info_Mange sim;//  使用默认参数
    	<span style="color:#ff0000;">sim.Setsname("张三").Setsno(457).Setgrade(2012).Setage(20);  //级联</span>
    	//使用this指针使串联的函数调用成为可能
    
    	sim.print();
    	 
    	return 0;
    
    }
    

       



      关于this指针的一些概念就总结到这里吧,现在抓紧攻读C++primer,有新东西再完善吧奋斗奋斗




  • 相关阅读:
    bzoj 1057: [ZJOI2007]棋盘制作
    【NOIP2012】开车旅行
    bzoj 2326: [HNOI2011]数学作业
    一本通1527欧拉回路
    一本通1530 Ant Trip
    一本通1528单词游戏
    luogu1856
    CF1045G
    10.18模拟赛
    10.16模拟赛
  • 原文地址:https://www.cnblogs.com/zhangruilin/p/5769843.html
Copyright © 2020-2023  润新知