牧树

导航

C++ this指针

this指针指向类对象的地址,当类的非静态成员函数中需要调用类的非静态成员变量时,编译器自动把this指针作为隐藏参数传递给成员函数。
如:class Date
{
public:
void set(int i)
{month=i;}
private:
int month;
}
其中,void set(int i)=void set(this,int i)=void set(&Date,int i)
 
一个this指针的题目
 1 class NullPointCall
 2     {
 3     public:
 4         static void call1();
 5         void call2();
 6         void call3(int x);
 7         void call4();
 8     private:
 9         static int m_a;
10         int m_b;
11     };
12 
13 int NullPointCall::m_a=0;
14 
15 void NullPointCall::call1()
16     {
17         cout<<m_a<<endl;
18     }
19 
20 void NullPointCall::call2()
21     {
22         cout<<"call2"<<endl;
23     }
24 
25 void NullPointCall::call3(int x)
26     {
27         cout<<x<<endl;
28     }
29 
30 void NullPointCall::call4()
31     {
32         cout<<m_b<<endl;
33     }
1 int main()
2     {
3         NullPointCall *pNull=NULL;
4         pNull->call1();
5         pNull->call2();
6         pNull->call3(5);
7         pNull->call4();
8         return 0;
9     }

上述代码中,call1(),call2(),call3()都可以正常运行,call4()运行出错。

这是因为call1中使用的是静态成员变量,不需要使用this指针。call2()和call3()中没有使用成员变量,所以也不需要使用this指针。

但是call4()中使用了成员变量m_b,所以编译器编译的代码相当于

1 void NullPointCall::call4(this)
2       {
3              cout<<this->m_b<<endl; 
4       }    

当时pNull为NULL时,this指针也为NULL,所以运行出错

posted on 2012-09-29 23:30  牧树  阅读(224)  评论(1)    收藏  举报