1. 程式人生 > >靜態成員&&靜態成員函式

靜態成員&&靜態成員函式

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

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

首先上程式碼:

class Solution {
public:
    bool cmp(int a,int b)
    {
        string A = to_string(a) + to_string(b);
        string B = to_string(b) + to_string(a)
; return A < B; } string PrintMinNumber(vector<int> numbers) { //關鍵是定製排序規則cmp string result; sort(numbers.begin(),numbers.end(),cmp); for(int i = 0; i < numbers.size();i++) { result += to_string(numbers[i]); } return
result; } };

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

當我將cmp函式改為:

    static bool cmp(int a,int b)
    {
        string A = to_string(a) + to_string(b);
        string B = to_string(b) + to_string(a);
        return
A < B; }

就沒問題了。

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

    bool cmp(Solution* this,int a,int b)

形參有三個引數。

這裡複習一下普通成員靜態成員的區別。
靜態成員屬於類本身,不屬於具體類物件,在類載入時分配記憶體空間,程式結束時才消失。可以類名直接訪問。
普通成員屬於類物件,在類物件建立時(類例項)才會分配記憶體,即動態載入記憶體,不用時消失。通過類物件去訪問。
:靜態成員不能去訪問普通成員,因為靜態成員存在於普通成員之前,我們不能去訪問一個記憶體中不存在的東西。

簡單總結:

靜態成員變數性質:
1.只能被初始化一次,下次執行該語句時自動跳過。
2.屬於類,而非具體物件。

靜態成員函式性質:
1.不包含指向具體物件的this指標;
2.不可以直接呼叫普通成員(可通過具體物件呼叫其對應的成員)。
3.類載入時分配記憶體空間屬於類而非具體物件。