标题:this指针


题目1:

If the class name is X, what is the type of its “this” pointer (in a nonstatic, non-const member function)?B
A. const X* const
B. X* const
C. X*
D. X&

C++中,一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。

 

比如,对于一个类rectangle,本来它的成员函数area()的定义如下:

int rectangle::area( )

{

    return (height*width);

}

C++把它处理为

int rectangle::area(rectangle *const this)

{

    return (this->height * this->width);

}

 

void Date::setMonth(int mn)

{

  month=mn;

  this->month=mn;

  (*this).month=mn;

  //这三句是等价的

}

 

this只能在成员函数中使用。全局函数,静态函数,静态成员都不能使用this。实际上,成员函数默认第一个参数为T*const register thisthis在非静态成员中有意义,作为右值可以直接在编译时确定其存在,运行时无所谓创建。

 

题目2:

既然this指针并不影响sizeof计算结果,那么this指针存放在何处?堆,栈,全局变量,还是其他?

:this指针无需显式储存内存中。只要存储对象的内存位置确定,对应的this指针就被确定了。

题目3:

考察下面的代码,代码会在什么地方崩溃?

#include <stdio.h>

class A

{

public:

   static void func()

   {

     num++;

     printf("%d\n",num);

   }

private:

   static int num;

};

int A::num=0;

 

class B

{

public:

   void func()

   {

     printf("hello world\n");

   }

};

 

class C

{

public:

   void func()

   {

     num++;

   }

private:

   int num;

};

 

 

int _tmain(int argc, _TCHAR* argv[])

{

   A *p = NULL;

   B *p2 = NULL;

   C *p3 = NULL;

  //p,p2,p3this指针都为空。

 

   p->func();//成功,func代码区,num在静态区,不需要this指针访问,所以成功

   p2->func();//成功,func在代码区,访问func不需要this指针

   p3->func();//执行到此处会崩溃,func在代码区,但func所访问的数据成员this->num需要存储在堆或者栈上但未分配内存(注意此时this指针为空,this->num即为null->num)所以失败。

 

   return 0;

}

答:会在执行p3->func()的时候程序会崩溃。

因为没有创建对象,this指针为空,通过this指针访问num会崩溃。this->num即为null->num.

但如果为num加上static,就没问题了。

因为加上static就不关this指针什么事儿了

访问static变量或者代码,不需要this指针



看文字不过瘾?点击我,进入腾讯课堂视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注