这几天工作中,看到很多成员函数都用来初始化一些函数指针,当然为了达到这个目的,类的设计者将这类函数都定义为static函数。因为static成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。
在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员。如果静态成员函数中要引用非静态成员时,可通过对象来引用。这句话很好理解,因为对象是一个实实在在的东西,通过对象来引用非static数据成员,该数据成员只属于他的对象,不会是别的对象。但是如果直接使用,static成员函数并不知道一个非static数据成员到底是从哪里来,属于那个对象(一个类可以有多个对象,当然对于sington的实现例外),所以static成员函数中不能直接操作类中的非static数据成员。
还有一种方法,就是使用一个静态类指针作为类成员,通过在类创建时初始化该静态指针,如pThis=this,然后在static成员函数中通过该静态指针就可以访问所有成员变量和成员函数了。当然这样做的弊端就是当类有多个对象时,pThis如果是在构造函数中初始化的,那么它总是指向最后一个对象,结果就很难预料了。
一个简单的例子:
class CSearchDlg
{
public:
CSearchDlg();
~CSearchDlg();
...
static int OnEditSetFocus(CUIWidget *);
...
protected:
CEdit *m_Edit;
static CSearchDlg *m_pThis;
};
CSearchDlg* CSearchDlg::m_pThis = NULL;
int CSearchDlg ::OnEditSetFocus(CUIWidget *w)
{
...
m_pThis->m_Edit->SetText(m_Text);
...
}