this指针

当引用一个的数据成员其引用代码又在类外时,在表达式中总要指明该类一个具体实例,编译器才能知道要访问哪一个数据成员.例如,以下代码首先打印属于对象test1的数据成员n,然后打印属于对象*ptest2的n,CTest是一个类:
            CTest test1;
            CTest *ptest2=new CTest;
            //...
            cout<<test1.n<<'/n';
            cout<<ptest2->n<<'/n';
然而,在一个类的成员函数内部引用一个数据成员却不能指明一个类的具体实例:
            class CTest
            {
                 public:
                     int n;
                     int getn()
                     {
                           return n;
                      }
             };
那么,编译器怎样决定引用哪一个实例对象的n拷贝呢?为了分辨,编译器实际上给成员函数传递一个隐藏的对象指针.此指针指向函数调用所要引用的对象.该函数隐式的使用这个指针,例如,在以下调用:
             CTest test;
             test.getn();
中,编译器传给getn一个隐藏的指向test对象的指针,getn隐式的使用这个指针,访问属于对象test的成员n.
    利用C++的关键字this可以直接访问这个隐藏的指针.事实上,对于类X,它的每一成员函数中都隐式的声明了this指针:
              X * const this;
此指针指向该成员函数所在的对象的地址(即函数"当前"引用的对象).在test.getn()调用中,getn()中的this指针指向的就是test对象.而对于
             CTest test1;
             test1.getn();
getn()中的this指针,指向的是test1对象.
    由于this指针被声明为* const,它是一个指针常量,因此不能改变它的值(在低版本的C++中,修改this指针是可以的),但可以改变它所指对象的值.例如:
              int CTest::chargethis() //假定changethis在CTest中已有声明
              {
                    CTest temp;
                    this=temp; //非法
                    //...
               }
利用this指针,getn可重写如下:
               int CTest::getn()
               { 
                     return this->n; //等价于return n;
               }
在数据成员的名字前加上表达式this->是合法的但没有什么效果,因为this指针的使用本来就是隐式的,它只引用数据成员.
   如果需要访问全局数据或函数,而它们的名字又和数据成员或成员函数的名字相同,则必须在名字前面加上作用域分辨符" :: ".例如:
               int n=0; //全局n
               class CTest
               {
                     int n; //数据成员n
                     int demo()
                     {
                           cout<<::n<<'/n'; //打印全局n
                           cout<<n<<'/n'; //用this访问数据成员n
                     }
               };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值