靜態成員&&靜態成員函式
阿新 • • 發佈:2018-12-16
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.類載入時分配記憶體空間屬於類而非具體物件。