在類中,static 除了可以宣告靜態成員變數,還可以宣告靜態成員函式。普通成員函式可以訪問所有成員(包括成員變數和成員函式),靜態成員函式只能訪問靜態成員。
編譯器在編譯乙個普通成員函式時,會隱式地增加乙個形參 this,並把當前物件的位址賦值給 this,所以普通成員函式只能在建立物件後通過物件來呼叫,因為它需要當前物件的位址(this指標就是當前物件的位址)。而靜態成員函式可以通過類來直接呼叫,編譯器不會為它增加形參 this,它不需要當前物件的位址,所以不管有沒有建立物件,都可以呼叫靜態成員函式。
普通成員變數占用物件的記憶體,靜態成員函式沒有 this 指標,不知道指向哪個物件,無法訪問物件的成員變數,也就是說靜態成員函式不能訪問普通成員變數,只能訪問靜態成員變數。
普通成員函式必須通過物件才能呼叫,而靜態成員函式沒有 this 指標,無法在函式體內部訪問某個物件,所以不能呼叫普通成員函式,只能呼叫靜態成員函式。
靜態成員函式與普通成員函式的根本區別在於:普通成員函式有 this 指標,可以訪問類中的任意成員;而靜態成員函式沒有 this 指標,只能訪問靜態成員(包括靜態成員變數和靜態成員函式)。
#include
using namespace std;
class student
;int student:
:m_total =0;
float student:
:m_points =
0.0;
student:
:student
(char
*name,
int age,
float score)
:m_name
(name)
,m_age
(age)
,m_score
(score)
void student:
:show()
//定義靜態成員函式
int student:
:gettotal()
float student:
:getpoints()
intmain()
執行結果:
小明的年齡是15,成績是90.6
李磊的年齡是16,成績是80.5
張華的年齡是16,成績是99
王康的年齡是14,成績是60.8
當前共有4名學生,總成績是330.9,平均分是82.725
總人數 m_total 和總成績 m_points 由各個物件累加得到,必須宣告為 static 才能共享;gettotal
()、getpoints
() 分別用來獲取總人數和總成績,為了訪問 static 成員變數,我們將這兩個函式也宣告為 static。
在c++中,靜態成員函式的主要目的是訪問靜態成員。gettotal
()、getpoints
() 當然也可以宣告為普通成員函式,但是它們都只對靜態成員進行操作,加上 static 語義更加明確。
和靜態成員變數類似,靜態成員函式在宣告時要加 static,在定義時不能加 static。靜態成員函式可以通過類來呼叫(一般都是這樣做),也可以通過物件來呼叫,上例僅僅演示了如何通過類來呼叫。
C 靜態成員變數和靜態成員函式詳解
類的靜態成員有兩種 靜態成員變數和靜態成員函式。靜態成員變數就是在定義時前面加了 static 關鍵字的成員變數 靜態成員函式就是在宣告時前面加了 static 關鍵字的成員函式。下面的 crectangle 類就有兩個靜態成員變數和乙個靜態成員函式。class crectangle 普通成員變數每...
靜態成員 靜態成員函式
reference to non static member function must be called sort numbers.begin numbers.end cmp 做演算法題的時候遇到的乙個問題,和成員函式相關,這裡記錄一下備忘。首先上 class solution string p...
C 類靜態成員與類靜態成員函式詳解
static關鍵字至少有下列n個作用 1 函式體內static變數的作用範圍為該函式體,不同於auto變數,該變數的記憶體只被分配一次,因此其值在下次呼叫時仍維持上次的值 2 在模組內的static全域性變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問 3 在模組內的static函式只可被這...