C++类中this指针的理解

先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。用这个类型可以来声明一个变量,比如int x, myclass my等等。这样就像变量x具有int类型一样,变量my具有myclass类型。理解了这个,就好解释this了,my里的this 就是指向my的指针。如果还有一个变量myclass mz,mz的this就是指向mz的指针。 这样就很容易理解this 的类型应该是myclass *,而对其的解引用*this就应该是一个myclass类型的变量。

通常在class定义时要用到类型变量自身时,因为这时候还不知道变量名(为了通用也不可能固定实际的变量名),就用this这样的指针来使用变量自身。 

1. this指针的用处:

一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。

this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 .

在成员函数内部,我们可以直接使用调用该函数的对象的成员,而无需通过成员访问运算符来做到这一点,因为this所指的正是这个对象。任何对类成员的直接访问都被看成this的隐式使用。

this的目的总是指向这个对象,所以this是一个常量指针,我们不允许改变this中保存的地址

2. this指针的使用:

一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。 

3. 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;  
  
}  

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值