浅谈this指针


先给出知码开门上到一道练习题:

定义一个Circle类,有数据成员radius(半径)、成员函数getCircumference()计算圆的周长,成员函数getArea()计算圆的面积。在主函数中定义圆对象,通过调用成员函数计算圆的周长和面积。提示:圆周率取值3.14。

后置代码:


当时给出了这样的代码,但是在debug发现了一个问题。

给出的代码(纠正也在这上面,通过注释写出)



Xcode控制台输入输出:

6
半径为6的圆的周长为:0,面积为:0


更正之后的输入输出:


6
半径为6的圆的周长为:37.68,面积为:113.04


没想到少了一个this指针,结果竟然完全不正确。仔细回想,如果不加this指针,则是将自身的值重新赋给自身,自然没有任何意义(不明白为什么Xcode既不报Warning也不报Error)。

但是反过来,这个传说中的this指针又究竟是什么呢?

biaocheng.net给出了这样的解释:
this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。

我们在刚刚的代码中加入一个操作print_this,源代码如下:


我们在刚刚的代码中,将main函数替换为下面的代码,创建两个不同的对象并观察运行情况。



程序在Xcode上的打印结果:

0x7fff5fbff718 
0x7fff5fbff710 
Program ended with exit code: 0


可以看到,this指针用于指向当前对象,对于不同的对象,所指向的地址并不相同。

biaocheng.net给出了对this指针本质的理解:
this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。

this 作为隐式形参,本质上是成员函数的局部变量,所以只能用在成员函数的内部,并且只有在通过对象调用成员函数时才给 this 赋值。

补充几点说明:

  • this 是 const 指针,它的值是不能被修改的,一切企图修改该指针的操作,如赋值、递增、递减等都是不允许的。
  • this 只能在成员函数内部使用,用在其他地方没有意义,也是非法的。
  • 只有当对象被创建后 this 才有意义,因此不能在 static 成员函数中使用。
参考文献:http://c.biancheng.net/cpp/biancheng/view/201.html



没有评论:

感谢每一条善意的建言和理性的讨论!

特殊时期开启审核制度敬请谅解。
挑衅和引战会被删除并永久拉黑。

Blogger 提供支持.