1. 程式人生 > >C++函式呼叫之靜態成員函式

C++函式呼叫之靜態成員函式

首先,定義如下類A:

class A
{
private:
    static int val_s;
public:
    static int getVal(){cout << "call getVal in A..." << endl;return val_s;}
};

我們可以看到,上述類的定義中包含靜態成員變數val_s靜態成員函式getVal() 。

對於靜態的成員變數,一般將其宣告為non-public,也就意味著在類外如果需要存取該成員變數的話,我們需要提供成員函式介面。

另一方面,靜態成員變數是獨立於類的物件的,是所有的類的物件共享的部分,也就意味著,如果有一個這樣的函式來操作靜態成員變數的話,那麼這個函式是沒有隱含的this指標的,這與一般的成員函式是不一樣的(一般的成員函式是有this指標的),於是static成員函式應運而生。

值得注意的是,這樣的static成員函式必須滿足如下的要求:

1  不能操作非staitc的成員變數

2  不能宣告為const  ,  volatile 或者是 virtual。

3  不需要經由類的物件來呼叫。(雖然使用類的物件來呼叫也是合法的)。

#include <bits/stdc++.h>
using namespace std;

class A
{
private:
    static int val_s;
public:
    static int getVal(){cout << "call getVal in A..." << endl;return val_s;}
};

int A::val_s = 4;

int main(void)
{
    cout << ((A *)0)->getVal() << endl;  //構造一個臨時的物件來呼叫static函式
    A a;
    cout << a.getVal() << endl;   //通過類的物件來訪問
    cout << A::getVal() << endl;  //通過類的作用域來訪問
    return 0;
}
實際上,編譯器在面對靜態成員函式的時候,是將該成員函式視為全域性函式來呼叫的,就像編譯器在處理non-member成員函式一樣的。(這裡同樣使用了name mabgling將該成員函式的宣告改為與全域性的非成員函式一樣,獨一無二的)。