首页 > 编程笔记 > C++笔记 阅读:14

C++ this指针的用法(附带实例)

对于 C++ 类的非静态成员,每个对象都有自己的一份拷贝,即每个对象的成员变量都是独有的,但成员函数却是所有对象共享的。那么,调用共享成员函数时该如何找到对应的成员变量呢?当然是通过类中隐藏的 this 指针

例如:
class CBook  // 定义CBook类
{
public:
    int m_Pages;  // 定义成员变量m_Pages
    void OutputPages()  // 定义成员函数OutputPages()
    {
        cout << m_Pages << endl;
    }
};

int main(int argc, char* argv[])
{
    CBook vbBook, vcBook;  // 定义两个CBook类对象vbBook和vcBook
    vbBook.m_Pages = 512;  // 设置vbBook对象的成员变量
    vcBook.m_Pages = 570;  // 设置vcBook对象的成员变量
    vbBook.OutputPages();  // 调用OutputPages()函数,输出vbBook对象的成员变量
    vcBook.OutputPages();  // 调用OutputPages()函数,输出vcBook对象的成员变量
    return 0;
}
程序运行结果为:

512
570

类的非静态成员函数中隐含着一个 this 指针,指向被调用对象。vbBook 对象调用 OutputPages() 时,this 指针指向 vbBook 对象;vcBook 对象调用 OutputPages() 时,this 指针指向 vcBook 对象。因此,不同对象调用 OutputPages() 成员函数时可通过 this 指针区分成员变量。

在 OutputPages() 成员函数中,用户可以显式地使用 this 指针访问成员变量。例如:
void OutputPages()
{
    cout << this->m_Pages << endl;  // 使用this指针访问成员变量m_Pages
}
实际上,编译器为了实现 this 指针,在成员函数中自动添加了 this 指针对成员变量的方法,类似于上面的 OutputPages() 方法。

此外,为了将 this 指针指向当前调用对象,并在成员函数中使用,在每个成员函数中都隐含一个 this 指针作为函数参数,并在函数调用时将对象自身的地址隐含作为实际参数传递。

例如,以 OutputPages() 成员函数为例,编译器将其定义为:
void OutputPages(CBook *this)
{
    cout << this->m_Pages << endl;  // 隐含添加this指针
}
在对象调用成员函数时,传递对象的地址到成员函数中。以“vc.OutputPages();”语句为例,编译器将其解释为“vbBook.OutputPages(&vbBook);”,这就使 this 指针合法了,并能够在成员函数中使用。

相关文章