在類中,static 除了可以宣告靜態成員變數,還可以宣告靜態成員函式。普通成員函式可以訪問所有成員(包括成員變數和成員函式),靜態成員函式只能訪問靜態成員。
編譯器在編譯乙個普通成員函式時,會隱式地增加乙個形參 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修飾類中的資料成員,被稱為靜態資料成員。他並不依賴於物件的例項化,而依賴於類。所以靜態資料成員不在建構函式中初始化,它單獨進行初始化 就算物件沒有例項化,他也存在。而普通資料成員依賴於物件的例項化,若物件沒有例項化,它就不存在。假設有乙個tank類 class tank 若物件還沒有例...
C static靜態成員
class a a void fun 普通成員函式 static void printnum 靜態成員函式 private int m a 普通成員變數 int m b 普通成員變數 static int num 靜態成員變數 靜態成員必須在定義類的檔案中對靜態成員變數進行初始化,否則會編譯出錯。i...
C static 靜態成員
靜態成員包括靜態資料成員和靜態成員函式,提供了同類物件間資料成員的共享機制 靜態成員不是某個物件的成員,是類所有物件的共享成員,只建立乙個成員副本 定義格式 static 型別 成員名 引用格式 類名 靜態成員 初始化格式 型別 類名 靜態資料成員 初始化值 靜態資料成員為同類所有物件所共享,不能使...