this指针

作者:jicanmeng

时间:2014年11月30日


先看一个示例程序:

#include <iostream>

class Simple
{
private:
    int m_nID;

public:
    Simple(int nID)
    {
        m_nID = nID;
    }

    void SetID(int nID) { m_nID = nID; }
    int GetID() { return m_nID; }
};

int main()
{
    Simple cSimple(1);
    cSimple.SetID(2);
    std::cout < cSimple.GetID() < std::endl;
    return 0;
}

结果输出为2。

修改一下程序。假设SetID的参数为int m_nID,函数体为m_nID = m_nID;,那么输出结果为1。因为函数的参数和类的成员变量名称相同,函数中的两个m_nID都是函数的参数,导致类的成员变量没有发生变化。

再次修改一下程序,我们将SetID()函数体修改为this->m_nID = m_nID;。如下所示:

#include <iostream>

class Simple
{
private:
    int m_nID;

public:
    Simple(int nID)
    {
        m_nID = nID;
    }

    void SetID(int m_nID) { this->m_nID = m_nID; }
    int GetID() { return m_nID; }
};

int main()
{
    Simple cSimple(1);
    cSimple.SetID(2);
    std::cout < cSimple.GetID() < std::endl;
    return 0;
}

这里的this是一个指针,指向调用SetID()函数的对象本身。在c++中,对于类中的每个成员函数,都会默认有一个this指针,指向调用这个函数时对象本身。

learncpp.com上面是这样描述的:C++ has added a new parameter to the function. The added parameter is a pointer to the class object the class function is working with, and it is always named “this”. The this pointer is a hidden pointer inside every class member function that points to the class object the member function is working with.(当然,这段话不够准确,因为静态成员函数是没有this指针的。)

举例来说,对于上面的SetID(int m_nID)函数,c++编译器会转换为下列格式:SetID(Simple * const this, int m_nID)

我们可以在程序中使用this指针,获取类的对象的成员变量,这样,当函数参数和类的成员变量相同时,我们可以实现我们想要的功能。

参考资料

  1. <<C++实用教程>> 电子工业出版社 郑阿奇 主编 丁有和 编著 P280
  2. The C++ Tutorial:
    http://www.learncpp.com/cpp-tutorial/87-the-hidden-this-pointer/