解析this指针

解析this指针要想明白为什么有this指针,我们先来看一看数据成员与成员函数之间的关系  每个对象中的数据成员都占有存储空间,如果一个类定义了n个对象的话,那么就有n个大小相等的空间来存放这n个对象的数据成员,但是不同的对象都调用同一个代码段。  那么问题来了!!!  当不同对象的成员函数引用数据成员时,怎么能够保证引用的是所指定的对象的数据成员呢?例如:设计一个长方体类

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

要想明白为什么有this指针,我们先来看一看数据成员与成员函数之间的关系
解析this指针
解析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();
	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.net/145325.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数学速算法_小学数学速算技巧全收录,寒假全面提升!

    数学速算法_小学数学速算技巧全收录,寒假全面提升!小编说:关注“学习方法报”免费获取更多学习干货,助你快速提分。想订阅报纸的各位童鞋请点击底部菜单——“微商城”查询答案的各位童鞋请点击底部菜单——“答案查询”——“小学答案”很多同学反映,自己的数学计算能力弱,每次数学考试,很多时间都花费在了计算上面,希望我能帮助他解决这个问题。所以今天我们就来和大家分享小学数学中的实用的速算技巧,同学们只要掌握了这个方法,计算问题一定会有一个大的提高!…

    2022年6月29日
    45
  • 关于java中堆内存与栈内存的详细分析[通俗易懂]

    本文由java零基础入门栏目为大家推荐,文中详细分析了什么栈内存与堆内存,并为大家介绍了二者的区别,希望可以帮助到大家。堆内存用于存储Java中的对象和数组,栈内存主要是用来执行程序用的。

    2022年1月17日
    38
  • CGLIB代理使用与原理详解

    CGLIB代理使用与原理详解JDK中提供的生成动态代理类的机制有个鲜明的特点是:某个类必须有实现的接口,而生成的代理类也只能代理某个类接口定义的方法。那么如果一个类没有实现接口怎么办呢?这就有CGLIB的诞生了,前面说的JDK的动态代理的实现方式是实现相关的接口成为接口的实现类,那么我们自然可以想到用继承的方式实现相关的代理类。【1】CGLIB简单实现①pom依赖如下&amp;amp;amp;amp;amp;amp;amp;lt;!–https://…

    2022年5月22日
    70
  • 管道(Pipe)/createPipe

    管道(Pipe)/createPipe

    2021年12月9日
    47
  • cdn加速以及前后分离SpringBoot+Vue 配置https及SSL证书「建议收藏」

    cdn加速以及前后分离SpringBoot+Vue 配置https及SSL证书「建议收藏」配置方法同上篇文章一样CDN加速配置,阿里云cdn内配置好以后即可剩下把前端服务器nginx内的证书文件上传以及配置写好即可。后端服务器也同上配置证书下载上传服务器配置好nginx即可。如果都配置好以后,不可以访问时,注意查看前端请求接口是否为https方式。如果为http时,检查是否更新服务器成功,如果成功后还不可以正常访问时,前端修改代码如下:vue.config.js内添加下行代码。index.html下添加代码:https:true完毕!…

    2022年8月19日
    6
  • 【matlab安装】手把手图文并茂安装matlab2021(win10版)

    【matlab安装】手把手图文并茂安装matlab2021(win10版)本文介绍matlab的安装。

    2022年6月18日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号