this 指针——谭浩强cpp

this指针是指向调用成员函数对象的指针
所谓“调用对象a的成员函数f”,实际上是在调用成员函数f时使this指针指向对象a,从而访问对象a的成员。

引子:每个对象中的数据成员都分别占有存储空间,如果对同一个类定义了n个对象,则有n组同样大小的空间以存放n个对象中的数据成员。但是,不同对象都调用同一个函数代码段。
当不同对象的成员函数引用数据成员时,怎么能保证引用的是所指定的对象的数据成员呢?

#include <iostream>
using namespace std;
class Box
{public:
Box(int h=10,int w=12,int len=15): height(h),width(w),length(len){ }
//声明有默认参数的构造函数,用参数初始化表对数据成员初始化
int volume( );
private:
int height;
int width;
int length;
};

int Box∷volume( )
{return(height*width*length);
}

int main( )
{ 
Box a[3]={                     //定义对象数组
Box(10,12,15),               //调用构造函数Box,提供第1个元素的实参
Box(15,18,20),               //调用构造函数Box,提供第2个元素的实参
Box(16,20,26)                //调用构造函数Box,提供第3个元素的实参
};
cout<<″volume of a[0] is ″<<a[0].volume( )<<endl;   //调用a[0]的volume函数
cout<<″volume of a[1] is ″<<a[1].volume( )<<endl;    //调用a[1] 的volume函数
cout<<″volume of a[2] is ″<<a[2].volume( )<<endl;    //调用a[2] 的volume函数
}

程序中定义的Box类,定义了3个同类对象a[0],a[1],a[2]。如果有a[0].volume( ),应该是引用对象a[0]中的height,width和length,计算出长方体a[0]的体积。如果有b[0].volume( ),应该是引用对象b[0]中的height,width和length,计算出长方体b[0]的体积。而现在都用同一个函数段,系统怎样使它分别引用a[0]b[0]中的数据成员呢?

在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this。它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址

例如,当调用成员函数a[0].volume()时,编译系统就把对象a[0]的起始地址赋给this指针,于是在成员函数引用数据成员时,就按照this的指向找到对象a的数据成员。例如volume函数要计算height*width*length的值,实际上是执行: (this->height)*(this->width)*(this->length)。由于当前this指向a,因此相当于执行: (a.height)*(a.width)*(a.length)。这就计算出长方体a的体积。同理,a[1],a[2]

this指针是隐式使用的,它是作为参数被传递给成员函数的。

  • 本来,成员函数volume的定义如下:int Box∷volume( ){return (height*width*length); }
  • C++把它处理为:int Box∷volume(Box *this){return(this->height * this->width * this->length); }。即在成员函数的形参表列中增加一个this指针。
  • 在调用该成员函数时,实际上是用以下方式调用的: a.volume(&a);。将对象a的地址传给形参this指针。然后按this的指向去引用其他成员。

*this表示被调用的成员函数所在的对象,*this就是this所指向的对象,即当前的对象。例如在成员函数a[0].volume( )的函数体中,如果出现*this,它就是本对象a。

下面三者等价
return(height * width * length);                     //隐含使用this指针
return(this->height * this->width * this->length);   //显式使用this指针    
return((*this).height * (*this).width * (*this).length);

——————————————————————————
你理解了吗?
没有的话就再看一遍,重在理解什么是指针,对象。

理解了就吃饭加个鸡腿!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值