C++之this指针

来源:互联网 发布:sql 年月日变成日期 编辑:程序博客网 时间:2024/06/06 19:20

首先来看一个案例:
class Stock
{
private:
int date;
public:
Stock();
~Stock();
const Stock& topval(const Stock& st) const;
}

//比较那个对象的date大,返回那个对象
const Stock& Stock::topval(const Stock& st) const
{
if(st.date > date)
return st; //argument object;
else
return ???; //invoking object;
}

以上我们可以发现不知如何称呼调用该方法的对象。
C++提供了解决此类问题的方法,使用被称为 this 的特殊指针。this用来指向成员函数的对象(this被作为隐藏参数传递给方法)。
实际上,成员函数默认第一个参数为T* const register this。
因此const Stock& topval(const Stock& st) const;原型在编译器看来为:
const Stock& topval(Stock* const register this, const Stock& st) const;
由此可见,this在成员函数的开始前构造的,在成员的结束后清除。这个生命周期同任一个函数的参数是一样的,没有任何区别。
当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。如:
Stock a;
Stock b;
a.topval(b) const;
此处,编译器将会编译成: const Stock& Stock::a.topval(&a, b) const;
编译器通常会对this指针做一些优化的,因此,this指针的传递效率比较高--如vc通常是通过ecx寄存器来传递this参数。
经过以上分析后可以将*this作为调用对象的别名来完成前面的定义:
const Stock& Stock::topval(const Stock& st) const
{
if(st.date > date)
return st; //argument object;
else
return *this; //invoking object;
}

总结
1)this在成员函数的开始执行前构造的,在成员的执行结束后清除。
2)this指针会因编译器不同,而放置的位置不同。可能是栈,也可能是寄存器,甚至全局变量。
3)this是通过函数参数的首参数来传递的。this指针是在调用之前生成的。类实例后的函数,没有这个说法。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。自从类的函数定义完成后,它就在那儿,不会跑的。
4)在C++中,类和结构是只有一个区别的:类的成员默认是private,而结构是public。
this是类的指针,如果换成结构,那this就是结构的指针了。
5)this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们也无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以&this获得),也可以直接使用的。

0 0
原创粉丝点击