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

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

时间: 2024-10-26 14:48:02

解析this指针的相关文章

底层解析C指针(二)

上一篇主要讨论了C指针的本质,但并没有解释指针的类型问题,这次我们重点来讨论指针的类型与指针内存分配之间的关系. 对比以下两个指针 int *p; char *p; 单纯从上面看这两个指针有何区别? 很多读者第一反应就是其类型不同,确实没错,但是我们现在需要从底层出发,搞清楚指针类型的意义. 其实单纯从上面来看,两个指针是没有任何区别的,其内存的大小完全相同. 但是由于指针有++和--操作,导致指针的偏移量大小到底多大,这个就需要由类型决定.因此类型仅仅只决定指针移动时偏移的大小. 下面我们来彻

转: 浅谈C/C++中的指针和数组(二)

转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组的一些区别,然而在某些情况下,指针和数组是等同的,下面讨论一下什么时候指针和数组是相同的. C语言标准对此作了说明: 规则1:表达式中的数组名被编译器当做一个指向该数组第一个元素的指针: 注:下面几种情况例外 1)数组名作为sizeof的操作数 2)使用&取数组的地址 规则2:下标总是与指针的偏移量

浅谈C中的数组和指针(二)

原文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 在原文基础上增加自己的理解作为修改 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组的一些区别,然而在某些情况下,指针和数组是等同的,下面讨论一下什么时候指针和数组是相同的. C语言标准对此作了说明: 规则1:表达式中的数组名被编译器当做一个指向该数组第一个元素的指针: 注:下面几种情况例外 1)数组名作为sizeof的操作数 2)使用&

笔试真题解析 ALBB-2015 算法project师实习生机试

1.用十进制计算30!(30的阶乘),将结果转换成3进制进行表示的话,该进制下的结果末尾会有____个0. [解析] 计算N.下3进制结果末尾有多少个0,事实上就是计算3进制中的3被进位多少次,仅仅要将N!因式分解成3^m*other.m就是答案.技巧性的解法就是m=N/3+N/(3^2)+N/(3^3)....+N(3^k) (k<=N/3) -- N=30:N/3+N/9+N/27=14. 2.小赵和小钱二人分别从寝室和图书馆同一时候出发.相向而行.过了一段时间后二人在中途相遇.小赵继续向图

php解析xml,并将xml转换为层级数组

1)xml_parser_create([ string $encoding ] ):建立一个新的xml解析器并返回可被其他xml函数使用的资源句柄, 参数$encoding: php4,中用来只指定要被解析的xml输入的字符编码方式: php5,自动侦测输入xml的编码,encoding仅用来指定解析后输出数据的编码 默认:输入编码=输出编码 php5.0.2+默认编码utf-8:之前版本,ISO-8859-1 2)bool xml_parser_set_option(resource $pa

常量指针和指针常量的区别详解

引用地址 http://blog.csdn.net/beyond0525/article/details/7409305 在C/C++中关键字const用来定义一个只读的变量或者对象,有如下优点    (1)便于类型检查,如函数的函数 fun(const int a) a的值不允许变,这样便于保护实参.    (2)功能类似与宏定义,方便参数的修改和调整.如 const int max = 100:    (3)节省空间,如果再定义a = max,b=max...就不用在为max分配空间了,而用

C++中引用与指针的区别

请说出C++中引用和指针的区别.(华为.腾讯.阿里等) 参考答案: (1)当引用被创建时,它必须被初始化.而指针则可以在任何时候被初始化. (2)一旦一个引用被初始化为指向一个对象,它就不能被改变为对另一个对象的引用.而指针则可以在任何时候指向另一个对象. (3)不可能有NULL引用.必须确保引用是和一块合法的存储单元关联. 进一步解析: 指针和引用都是 C++ 中的基本语法成份,它们既有联系,也有不同之处. 它们都是地址的概念,其中指针指向一块内存,它的内容是所指内存的地址:而引用是某块内存的

Android开发之XML的创建和解析

参考:http://blog.csdn.net/pi9nc/article/details/9320413 XML文件的解析,代码: 1 public void click(View v) { 2 InputStream is = getClassLoader().getResourceAsStream("weather.xml"); 3 //获取到XMLPullParse接口的对象 4 XmlPullParser xpp = Xml.newPullParser(); 5 try {

Pull生成&amp;解析

开篇注意,由于解析有可能有大文件非常耗时,建议另开一个线程解析也可以不开具体视情况而定 Pull生成 1.通过xml获得序列化的实例 XmlSerializer nxs = Xml.newSerializer(); 2.设置文件输出路径以及输出格式 nxs.setOutput(os, encoding);     注释:os是文件流,encoding是编码格式 3.文档开始标签文档的读取的编码格式,以及是否是独立的文档 nxs.startDocument(encoding, standalone