详解this指针--为什么空的对象指针可以调用成员函数

引题

class A{
public:
    void function()
    {
        cout << "I can run" << endl;
    }
};

int main()
{
    A* pa = NULL;
    pa->function();
    system("pause");
    return 0;
}

这里写图片描述

C++中,空指针是不能够使用的,然而空对象指针有时候却能够调用成员函数。
这就涉及到this指针。

为什么空的对象指针可以调用成员函数却不能调用成员变量?

类的成员函数其实可以认为是一个普通的函数,比如

class A{  
public:  
    void func(int x) { cout<<"hello, A. x="<<x<<endl; }  
};  

//在编译器看来,大概是这个样子:

void A_func(A* this, int x) { cout<<"hello, A. x="<<x<<endl; }  
//类的成员函数
A a;  
a.func(2);  
//被解释成下面这样子
A_func(&a, 2);  

那么当对象指针为空的时候

A *pa = NULL;  
pa->func(2);  
//在编译器看来就好像是 A_func(pa, 2);且pa==NULL  

((A*)NULL)->func(2);  
//在编译器看来就好像是 A_func( ((A*)NULL), 2);  

那么对于类的成员变量时

class A{  
private:  
    int y;  
public:  
    void func(int x) { y = x; }  
};  
//注意此时y是成员变量,编译器会自动给它加上this->,也就是:

void A_func(A* this, int x) { this->y = x; }  

但是!此时程序会崩溃!因为this指针是NULL,而你访问了它的y变量!

总结

什么是this指针

this是一个指针,它时时刻刻指向你这个实例本身。

this指针的特点

1)this只能在成员函数中使用。指向被调用函数所在的类实例的地址全局函数、静态函数都不能使用this,
2)this在成员函数的开始前构造,在成员函数的结束后清除。
3)一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。
4)我们只有获得一个对象后,才能通过对象使用this指针
5)this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递,类编写者不能显式传递。

从这道题得到的结论

1)NULL对象指针可以调用成员函数
2)通过对象调用成员函数,对象的指针会被传入函数中,指针名称为this
3)NULL对象指针调用成员函数时,只要不访问此对象的成员变量,则程序正常运行
4)NULL对象指针调用成员函数时,一旦访问此对象的成员变量,则程序崩溃

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章