前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解析this指针

解析this指针

作者头像
全栈程序员站长
发布2022-08-30 08:45:29
1550
发布2022-08-30 08:45:29
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

要想明白为什么有this指针,我们先来看一看数据成员与成员函数之间的关系

解析this指针
解析this指针

每个对象中的数据成员都占有存储空间,如果一个类定义了n个对象的话,那么就有n个大小相等的空间来存放这n个对象的数据成员,但是不同的对象都调用同一个代码段。

那么问题来了!!!

当不同对象的成员函数引用数据成员时,怎么能够保证引用的是所指定的对象的数据成员呢?

例如:设计一个长方体类

代码语言:javascript
复制
#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();
	system("pause");
	return 0;
}

定义了3个长方体对象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指针是隐式使用的,它作为参数被传递给成员函数,本来,成员函数volume的定义如下:

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指针。

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/145325.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档