C static靜態成員函式

2021-10-03 20:04:18 字數 1636 閱讀 6072

在類中,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 型別 成員名 引用格式 類名 靜態成員 初始化格式 型別 類名 靜態資料成員 初始化值 靜態資料成員為同類所有物件所共享,不能使...