靜態成員 靜態成員函式

2021-09-03 05:13:59 字數 1241 閱讀 2663

reference to non-static member function must be called sort(numbers.begin(),numbers.end(),cmp);

做演算法題的時候遇到的乙個問題,和成員函式相關,這裡記錄一下備忘。

首先上**:

class

solution

string printminnumber

(vector numbers)

return result;}}

;

問題出在sort(numbers.begin(),numbers.end(),cmp);這裡,說你引用(呼叫)了非靜態函式,但你不是通過類物件來呼叫的。問題的**就是sort()函式的第三個謂詞引數cmp。為什麼會是這樣的呢?

當我將cmp函式改為:

static bool cmp

(int a,int b)

就沒問題了。

實際原因是函式引數不匹配的原因。因為每乙個普通的成員函式都有乙個隱含的this指標引數。cmp作為sort()函式的謂詞被呼叫時,傳入的是兩個引數,而作為類solution的普通成員函式,實際上是:

bool cmp

(solution*

this

,int a,int b)

形參有三個引數。

這裡複習一下普通成員靜態成員的區別。

靜態成員屬於類本身,不屬於具體類物件,在類載入時分配記憶體空間,程式結束時才消失。可以類名直接訪問。

普通成員屬於類物件,在類物件建立時(類例項)才會分配記憶體,即動態載入記憶體,不用時消失。通過類物件去訪問。

:靜態成員函式不能去訪問普通成員,因為靜態成員函式存在於普通成員之前,我們不能去訪問乙個記憶體中不存在的東西。

靜態成員變數性質:

1.只能被初始化一次,下次執行該語句時自動跳過。

2.屬於類,而非具體物件。

靜態成員函式性質:

1.不包含指向具體物件的this指標;

2.不可以直接呼叫普通成員(可通過具體物件呼叫其對應的成員)。

3.類載入時分配記憶體空間屬於類而非具體物件。

靜態成員和靜態成員函式

靜態成員和靜態成員函式 普通成員變數每個物件有各自的乙份,而靜態成員變數一共就乙份,為所有物件共享。靜態成員物件不需要通過物件就能訪問 class crectangle crectangle crectangle int i,int j crectangle crectangle int crect...

靜態成員和靜態成員函式

靜態成員函式的特點 1.static資料成員在類內的內部宣告,但只能在類的外部定義,在類的外部不能指定static,在類的定義時候驚醒初始化 2.static資料成員只能在課的外部進行初始化 特例 當整形const static資料成員被常量表示式初始化,就可以在類內進行初始化,但還需要在外部進行定...

靜態成員函式 靜態成員變數

靜態的成員函式,同靜態資料成員類似,它也是屬於類,而不是屬於某乙個物件的。靜態成員函式不能訪問非靜態的資料成員,它只能訪問靜態資料成員,也只能呼叫其它的靜態成員函式。原因是 當前物件的位址 this 是被隱含地傳遞到被呼叫的函式的。但乙個靜態成員函式沒有 this 指標,所以它無法訪問非靜態的成員函...