你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C++ ——this指针的理解和作用

[复制链接]
gaosmile 发布时间:2020-9-8 21:25

! \1 F# {: J0 h* M1 p& q1 `! f( a  i/ |, k

& ?' t$ l* C; F4 v- L& R4 k) R+ e
C++ 程序到 C 程序的翻译

& w1 e. S# ]' N6 v" O

4 L) F: O' r& B; d6 D- U7 ^/ E9 ]% c
要想理解 C++ 的 this 指针,我们可以先把下面的 C++ 代码转换成 C 代码:
; o) z. p  T" a& ]& v3 t+ C
微信图片_20200908212121.jpg 0 j3 _9 k1 U1 H& J# M0 Z4 b
C 语言是没有类定义 class 关键词,但是有跟 class 类似的定义,那就是 struct 结构体。/ ^9 l7 C: c" ^' n

& h" W5 X7 k, L
m_price 变量是 Car 类的成员变量,那么我们可以把 Car 类和成员变量翻译成如下的 C 代码:
5 d; |  `  Q6 g" T$ y6 o, b- v
微信图片_20200908212124.jpg 9 V" _8 n/ u6 d* M% _6 A' H
SetPrice 函数是 Car 类的成员函数,但是 C 程序里是没有成员函数这种概念的,所以只能把成员函数翻译成全局的函数:! T5 o  i( X1 h( X: l* v9 o
微信图片_20200908212127.jpg
* G7 U5 o/ r" b, r- j* j
为什么要加个 this 的指针呢?我们继续往下看。在这里我们把上面 C++ 程序的 main 函数翻译 C 程序,是这样的:  I. e1 R$ Q4 \7 u. t
微信图片_20200908212130.png
% _. L+ i" W& Q) K% v' D* J
所以最终把上述的 C++ 程序 转换成 C 程序的代码如下:
  V+ U$ G- x$ ^% m+ D

( N( S0 @/ B  g
微信图片_20200908212132.jpg
6 V+ {2 J( R6 k; j2 C
所以加 SetPrice 函数的第一个参数 this 指针的作用,就是为了给结构体 Car 域里的变量赋值。0 u& j# U5 {3 h* z0 E5 b
+ [9 t7 q. _/ h% D4 i) m4 }
% s' E2 p+ Y$ Y/ L# \/ {. b
this 指针的作用
" ~& Q. j- h! Q) _
3 l2 E: q% P: j  x$ R
其作用就是指向成员函数所作用的对象,所以非静态成员函数中可以直接使用 this 来代表指向该函数作用的对象的指针。
) V$ K, B/ [) L; t
下面的例子可以很好的说明 this 的作用:% O' ]2 z! @9 Y6 D& Q) ?

% [# c2 C. R* e
微信图片_20200908212136.jpg
; C% ]4 R6 [/ }" O4 Q. ]
输出结果:20000
/ Q8 l( ~% j  I5 ~7 t# ]# A7 x& |20000

( c3 N  s3 u- I) p1 W0 H
接下来我们看下面的代码,你觉得输出结果是什么呢?会出错吗?" B$ [  L3 E( t3 w
微信图片_20200908212140.jpg
) \' p' H# G6 J4 J( a
答案是正常输出 hello,你可能会好奇明明 p 指针是空的,不应该是会程序奔溃吗?别着急,我们先把上面的代码转换 C 程序,就能理解为什么能正常运行了。
. \; T, |# F2 g/ N
微信图片_20200908212144.jpg 5 T" ]; U. R. R( `: d  o
所以,实际上每个成员函数的第一个参数默认都有个指向对象的 this 指针,上述情况下如果 this 指针指向的对象是空,相当于成员函数的第一个参数是 NULL,那么只要成员函数没有使用到成员变量,是可以正常执行。: @2 |* m0 k6 m  F
那么下面这份代码执行时,就会奔溃了,因为 this 指针是空的,使用了空的指针指向了成员变量 i,程序就会奔溃。  a& l! h' p# `5 h$ P0 B. S1 I$ v. {0 c
微信图片_20200908212150.jpg ( O! }5 p1 Z  o6 ~0 S  a% ?
. B' [: y1 A1 c( e( F9 f

/ g' O$ g  B& ^8 w. R3 P9 p* s; I
this 指针和静态成员函数

) Y2 I/ p2 ~! i

! T4 D+ m/ G' n  @
静态成员函数是不能使用 this 指针,因为静态成员函数相当于是共享的变量,不属于某个对象的变量。
* K/ b; k, B+ ~) s4 r* r( E

) D: W) B; r/ l' O# k( z
! h7 @  m$ ]6 f5 w# @" W
小结

. T7 v/ e! ]# k. _- ]9 M2 ]& ?

5 Z! U# h) ~  w1 f0 ]
  • 通过将 C++ 程序翻译成 C 程序的方式,来理解 this 指针,其作用就是指向非静态成员函数所作用的对象,每个成员函数的第一个参数实际上都是有个默认 this 指针参数;

    4 E% s. q6 [$ Z. @" a
$ _3 D$ F: j+ P$ ^! l- m: A
  • 静态成员函数是无法使用 this 指针。
    : k6 |, I2 k8 c( E

8 P# e! P  N5 V
赞 收藏 评论0 发布时间:2020-9-8 21:25

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版