C++之this指针

    xiaoxiao2021-03-25  69

    首先来看一个案例: 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获得),也可以直接使用的。

    转载请注明原文地址: https://ju.6miu.com/read-39344.html

    最新回复(0)