C++函式呼叫之靜態成員函式
阿新 • • 發佈:2019-02-17
首先,定義如下類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 不需要經由類的物件來呼叫。(雖然使用類的物件來呼叫也是合法的)。
實際上,編譯器在面對靜態成員函式的時候,是將該成員函式視為全域性函式來呼叫的,就像編譯器在處理non-member成員函式一樣的。(這裡同樣使用了name mabgling將該成員函式的宣告改為與全域性的非成員函式一樣,獨一無二的)。#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; }