引题
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对象指针调用成员函数时,一旦访问此对象的成员变量,则程序崩溃