一、this指针的理解
this指针是一个特殊的指针,指向一个类的具体实例,即一个类的对象。在类中,通过this指针可以访问类的成员变量及成员函数。但this指针并不是对象本身的一部分,不会影响sizeof()操作符的结果。
关于this指针有一个比较经典的举例:当你进去一个房间后,你能看到房子里的电视、冰箱和沙发,但是你却看不见整个房子了。同样的,对于一个类的实例来说,你可以看到他的成员变量,成员函数,而this指针则指向实例本身。
二、this指针的使用
1、this指针是一种特殊的指针变量,不能通过&this来获取this指针的地址。对于普通的指针变量,是用取地址符(&)是可以获取存储该指针变量的地址的,但是对于this指针,将提示:表达式必须是左值或者函数指示符。
2、this指针的作用域仅在类本身的内部,在类的外部this指针将不可访问。有人说,this指针是在类的成员函数的函数体内创建的,在成员函数开始执行前创建,在成员函数执行完成之后清除。也有人认为,this指针在整个类的内部应该都是一直可访问的。
3、当成员函数的参数名与类的成员变量名相同,而要使用该参数给类的成员变量赋值时,需要显示的使用this指针。如:
class TestClass
{
public:
TestClass();
~TestClass();
public:
void SetTest(int test)
{
this->test = test;
}
private:
int test;
};
上述代码的SetTest中,显示调用了this指针给成员变量test赋值。
4、类的成员函数的第一个参数通常是this指针。ugg在博客 深入探讨this指针中(http://blog.csdn.net/ugg/article/details/606396) 提到:如果参数是确定的,this通过ecx传递给被调用者,否则,this在所有参数之后压栈。即:如果类的成员函数是确定,那么this的存储位置应该在寄存器中,如果参数不是固定的,则this保存在栈中。
5、const 函数中变量不能修改的原因:
public:
void SetTest (int test) const
{
this->test = test;
}
private:
int test;
上边的函数不能通过编译,系统将提示表达式必须是可修改的左值,原因在于,此时函数的定义等价于
<span style="white-space:pre"> </span>void SetTest(const TestClass* this, int test)
{
this->test = test;
}
由于this此时是一个指向const变量的指针,因此,该this指针指向的对象的内容不能改变(使用mutable声明的变量除外)。