C++基础#4:this指针的用法-何时显示引用与隐式引用

1. this指针的含义及其用法: 
(1). this指针是一个隐含于每一个成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。
(2). 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。
(3). 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。
(4). 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;
   在X类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);

(5). 由于this并不是一个常规变量,所以,不能取得this的地址。
(6). 在以下场景中,经常需要显式引用this指针
   (1) 为实现对象的链式引用(如例1);
   (2) 为避免对同一对象进行赋值操作(如例2);

   (3) 在实现一些数据结构时,如list.

 

2. 举例:

(1)例1:为实现对象的链式引用,需要显式引用this指针:

//例1:

/*  编辑编译环境:Dev-C++ 4.9.9.2  */
/*  file: person.cpp */



#include <stdio.h>
#include <string.h>

class Person {
      public:
          typedef enum {
                 BOY = 0,
                 GIRL = !BOY
          } SexType;
      public:
             Person(char *n, int a, SexType s)
             {
                 name = new char[strlen(n)+1];  //这里的 name 等价于this->name
                 strcpy(name,n);                //这里的 name 等价于this->name
                 age = a;                       //这里的 age 等价于this->age
                 sex = s;                       //这里的 sex 等价于this->sex
             }
             int get_age(void) const
             {
                 //age++; //compile error, 因为 age等价于this->age,而 get_age又是一个const成员函数,
                        //不能对 this指针所指向的这种对象进行修改,这也是const的一个作用。
                        //这样做的好处是,增加了代码的健壮性。
                 return age;
             }
             Person& add_age(int a)
             {
                 age +=a;
                 return *this; // 返回本对象的引用
             }
      private:
            char *name;
            int age;
            SexType sex;
};

void TestPerson(void)
{
     Person ZhangSan("ZhangSan", 20, Person::BOY);
     printf("ZhangSan.age = %d/n", ZhangSan.get_age());
     printf("ZhangSan.add_age = %d/n", ZhangSan.add_age(1).get_age()); //增加1岁的同时,可以对新的年龄直接输出;

     return;
}         

int main(void)
{
    TestPerson();
    while(1);
   
}

/* result:
   ZhangSan.age = 20
   ZhangSan.add_age = 21
*/

代码说明:

//age++; compile error,

编译错误,因为 age等价于this->age,而 get_age又是一个const成员函数,C++不允许对 this指针所指向的这种对象进行修改,这也是const的一个作用。

 这样做的好处是,增加了代码的健壮性。

 

(2)例2:为避免对同一对象进行赋值操作,显示引用this指针。

//例2:

/*  编辑编译环境:Dev-C++ 4.9.9.2  */
/* file: location.cpp */

#include <stdio.h>

class Location {
     int X,Y;//默认为私有的
 public:
     void init(int x,int y) { X =x; Y = y;};
     void assign(Location& pointer);
     int GetX(){ return X; }
     int GetY(){ return Y; }
};

void Location::assign(Location& pointer)
{
    if(&pointer!=this) //同一对象之间的赋值没有意义,所以要保证pointer不等于this
    {
        X=pointer.X;
        Y=pointer.Y;
    }
}

int main()
{
     Location x;
     x.init(5,4);
    
     Location y;
     y.assign(x);
    
     printf("x.X = %d, x.Y = %d /n",  x.GetX(), x.GetY());
     printf("y.X = %d, y.Y = %d ",  y.GetX(), y.GetY());
    
     while(1);
     return 0;
}
/* result:
   x.X = 5, x.Y = 4
   y.X = 5, y.Y = 4
*/

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值