首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于this指针的不解

2012-08-02 
关于this指针的疑惑大家好,好久没摸c++了,今天复习了下,对this指针有点疑惑,求大神解惑this指针是每个对象

关于this指针的疑惑
大家好,好久没摸c++了,今天复习了下,对this指针有点疑惑,求大神解惑


this指针是每个对象都拥有的隐含私有变量
还是一个类本身拥有的隐含私有变量?

也就是说new多个对象,是有多个this指针,还是只有一个?


网上查过一些资料,比较模糊不清,貌似是一个类对应一个this指针,在对象调用非静态成员函数时隐含传入对象的地址,然后通过这个地址调用函数


不知道是否真是这样,

如果是一个类对应一个this指针,即多个对象共同对应一个this指针的话,老感觉在多线程下会出问题,跪求大牛们解惑。。。

[解决办法]
this指针不是对象的,也不是类的。从某个角度来说,它是函数的。当然这里指的是“非静态成员函数”。全局函数跟this没有任何关系,类的静态函数跟this也没有关系。
非静态成员函数靠this指针得知自己是从哪个对象上调用的。
比如,对于:
class A {
int i;
public:
void f() { i = 100; } 
};

那么,对于对象:
A a, b;
当调用a.f()的时候,相当于A::f()所见到的this指针指向了a,即在函数的执行过程中,this == &a;之后再执行b.f()时,A::f()所见的this指针又指向了b。
因为同样的理由,上面那句:
i = 100;
等价于:
this->i = 100;

所以,它是每个非静态成员函数都有的一个隐含参数。因为这个原因,指向非静态成员函数的指针跟指向一般全局函数的指针即使“表面上”参数相同,返回值也相同,它们之间也不能相互转换或赋值,原因就在于非静态成员函数多一个隐含参数:this。

如果你研究过汇编语言和C++编译器实现,会知道在许多平台上,比如在X86-64的处理器上,许多编译器都分配专门的寄存器用来存放成员函数的this指针,也就是调用成员函数时点号左边那个对象的地址。Visual C++中甚至有一种函数调用约定就叫:this_call。

我以前写过的一篇小博客楼主也可以看看:
http://blog.csdn.net/steedhorse/article/details/2661787
[解决办法]
9.3.2 The this pointer [class.this]
1 In the body of a nonstatic (9.3) member function, the keyword this is a non-lvalue expression whose
value is the address of the object for which the function is called. The type of this in a member function
of a class X is X*. If the member function is declared const, the type of this is const X*, if the member
function is declared volatile, the type of this is volatile X*, and if the member function is
declared const volatile, the type of this is const volatile X*.

表示标准上说得很清楚,this 只是一个关键字. this是一个非左值指针.不是一个指针变量,不属于类的成员. 虽然只可以在nonstatic成员函数里面用,但是也没有理由说属于函数.

[解决办法]
个人认为this指针既不从属于类又不从属于对象,看一下代码
#include <iostream>
using namespace std;

class Test
{
public:
Test()
{
cout << "Test()" << endl;
cout << Test::this << endl;//error!
}
int a;
static int b;
};

int main()
{
Test tArr[3];
cout << tArr << "\t" << tArr+1 << endl;//output 0012FF74 0012FF78
return 0;
}
//本人认为this指针完全是编译器转换后的结果,我同意上面楼主说的从属于“类的非静态成员变量”(暂时这么称),因为本质上C++的函数调用(不管是成员函数还是其他函数)均会被编译器转换成fun(arg1,arg2...)方式,如:class Test obj; obj.fun() /pObj->fun()均会被转换成fun(this)函数调用方式,this 类型为const Test*,值为&obj/pObj,this指针一般作为函数的第一个参数或最后一个参数传入,当然这可能和调用方式有关!,如果你在Test中加上static Test* p = this; 将看到编译出错:
'this' : can only be referenced inside non-static member functions,因为这样会造成静态成员变量未初始化,去掉static仍然报这个错误,这进一步证明this不是从属于类和对象的,它完全是编译器转换的结果,只不过this提供给你用,本质上你真正使用它时也是在程序运行时,因为只有程序运行他才会有真正的值(编译器加入部分代码:如将对象地址转化成传递给this)
[解决办法]
this 指针就是函数的一个参数. 不属于任何人.


int f(void* x)
{
...
}

这里面 x 是一样的. 从来就没有听说过有问 x 是属于谁的的问题, 因为你可以传递任何东西给它, 你传递给它的东西可以是属于某个对象, 属于全局变量, 或者是一个常数. 你能说 x 是属于谁的?

this 可以简单的理解为:

struct A
{
void f();
}

编译器生成一个函数 void A_f(A* this);
对于调用的时候, A a;
a.f() 编译就把它转化成 A_f(&a);

对于
((A*)0)->f(); 就会生成 A_f(0);

[解决办法]
this指针,用起来是指针,其实不是什么指针,只是编译器用到的一个符号,可以看作是指针.但这个指针不需要地址空间来存它,看起来像
int a[10]
里的a,可以当指针用,但又不是一个int *p中的p那样需要用一个空间来存放,因为它在编译过程已被转换成一个偏移量了.
你可以这么去理解,this是属于那个对象实体的,是一个标识,标识的是对象所在内存空间的首地址.可以通过偏移量来得到成员变量,也可以通过函数名来得到具体的函数.

热点排行