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 指標,所以它無法訪問非靜態的成員函...