在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 this。this在非静态成员中有意义,作为右值可以直接在编译时确定其存在,运行时无所谓创建。
既然this指针并不影响sizeof计算结果,那么this指针存放在何处?堆,栈,全局变量,还是其他?
答:this指针无需显式储存内存中。只要存储对象的内存位置确定,对应的this指针就被确定了。
#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,p3的this指针都为空。
p->func();//成功,func代码区,num在静态区,不需要this指针访问,所以成功
p2->func();//成功,
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指针
Copyright 2011-2020 © MallocFree. All rights reserved.