C++ this 指针的理解和作用
01 C++ 程序到 C 程序的翻译
要想理解 C++ 的 this 指针,我们先把下面的 C++ 代码转换成 C 的代码
C 语言是没有类定义的class
关键词,但是有跟class
类似的定义,那就是结构体struct
。
m_price
变量是Car
类的成员变量,那么我们可以把Car
类和成员变量翻译成如下的 C 代码:
SetPrice
函数是Car
类的成员函数,但是 C 程序里是没有成员函数这种概念的,所以只能把成员函数翻译成全局的函数:
为什么要加个 this 的指针呢?我们继续往下看。
在这里我们把上面main
函数下面的 C++ 程序翻译 C 程序是这样的:
所以最终把上述的 C++程序 转换成C 程序的代码如下:
02 this指针的作用
其作用就是指向成员函数所作用的对象,
所以非静态成员函数中可以直接使用 this 来代表指向该函数作用的对象的指针。
输出结果:
接下来我们下面的代码,你觉得输出结果是什么呢?会出错吗?
答案是正常输出hello,你可能会好奇明明 p 指针是空的,不应该是会程序奔溃吗?别着急,我们先把上面的代码转换C程序,就能理解为什么能正常运行了。
所以,实际上每个成员函数的第一个参数默认都有个指向对象的 this 指针,上述情况下如果该指向的对象是空,相当于成员函数的第一个参数是NULL
,那么只要成员函数没有使用到成员变量,也是可以正常执行。
下面这份代码执行时,就会奔溃了,因为this指针是空的,使用了 空的指针指向了成员变量i
,程序就会奔溃。
03 this指针和静态成员函数
静态成员函数是不能使用 this 指针,因为静态成员函数相当于是共享的变量,不属于某个对象的变量。
04 小结
通过将C++程序翻译成C程序的方式,来理解 this 指针,其作用就是指向非静态成员函数所作用的对象,每个成员函数的第一个参数实际上都是有个默认 this 指针参数。
静态成员函数是无法使用this指针,
版权声明: 本文为 InfoQ 作者【小林coding】的原创文章。
原文链接:【http://xie.infoq.cn/article/22f281ae47d54729dfa86cd96】。文章转载请联系作者。
评论