this指针

在这里插入图片描述
每一个对象中的成员函数都占有存储的空间,如果一个类定义了n个对象的话,那么就有n个大小相等的空间来存放这n个对象的数据成员,但是不同的对象都调用同一个代码段。
那我想问一句,当不同对象的成员函数引用数据成员时,怎么能够保证引用的是所指定的对象的数据成员呢?
例如:设计一个长方体类

#include<iostream>
using namespace std;
class Box
{
public:
	Box(int length = 0, int width = 0, int height = 0) 
		:_length(length)
		,_width(width)
		, _height(height){}
	int volume()
	{
		return _length*_width*_height;
	}
 
private:
	int _length;
	int _width;
	int _height;
};
int main()
{
	Box a(3,2,4);
	Box b(4,5,7);
	Box c(7,8,9);
	a.volume();
	b.volume();
	c.volume();
	return 0;
}


**该程序定义了三个长方体对象a,b,c,调用volume是求取长方体的体积。 a.volume()是引用a中的数据成员_length,_width,_height; b.volume()是引用b中的数据成员_length,_width,_height; c.volume()是引用c中的数据成员_length,_width,_height;**

**因为所以对象都调用同一个函数volume,那么系统是怎样使volume分别引用a,b或者c中的数据成员呢???**

因为在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,this指针。它是指向本类对象的一个指针,它的值是当前被调用的成员函数所在的对象的起始地址。当调用a.volume()时编译器就把对象a的起始地址传递给this指针。于是在成员函数引用成员变量时,就按照this的指向地址找到a的成员变量。


就volume要计算_length*_width*_height的值,实际上是执行(this->_length) * (this->_width) *(this->height),因为现在this指向的是a的地址,所以就相当于执行了(a._length) * (a._width)(a._height).



this指针式是隐式调用的,它作为参数被传递给类的成员函数。本来成员函数volum的定义如下:

int volume ()
{
	return _length*_width*_height;
}

在c++内部会被处理成

int volum (Box *this)
{
	return (this->_length)
		  *(this->_width)
		  *(this->_height)
}

类内部处理会在成员函数的形参列表中增加一个this指针,在调用成员函数时实际上是a.volume(&a).即:将a的地址赋给this指针,然后按照this指针的指向去引用指定成员。

注意:
this指针是隐式的,是编译系统自动实现的,不可以显示的在形参中添加this指针,也不必将a的地址传给this。可以再成员函数内显示的使用this指针。



并不是所有的成员函数都有this指针,比如像构造函数,静态成员函数就没有this指针。因为构造函数只在创建对象的时候调用一次,静态成员函数是属于类的不属于对象,属于类的方法,所以没有this指针。


总结:通过上面的分析可以看到,面向对象这种方式的底层还是基于面向过程实现的,只不过这些工作都被编译系统做了,我们只需要关心类的设计即可。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值