今天在刷LeetCode一道水題的時候,遇到了報錯:reference to non-static member function must be called
代碼如下:
class Solution {
public:
static bool cmp(int a,int b)//問題出在這個函數
{
return a<b;
}
vector<int> sortedSquares(vector<int>& A)
{
vector<int> ans(A.size(),0);
for (int i=0;i<A.size();i++)
{
ans[i]=A[i]*A[i];
}
sort(ans.begin(),ans.end(),cmp);//報錯位置,說非靜態成員函數必須要通過類調用
return ans;
}
};
百度了之後,告訴我類裏面函數不加static定義爲靜態成員函數就會隱含變量this指針,與sort函數所調用cmp所需變量不同,故報錯,所以這裏加上static就解決了問題。
靜態成員函數:
無論靜態函數還是非靜態函數,都是屬於類的(這一點與數據成員的靜態非靜態不同),對象並不擁有函數的拷貝.兩者的區別在於:非靜態的函數由類對象(加.或指針加->;)調用,這時將向函數傳遞this指針.而靜態函數由類名(::)(或對象名.)調用,但靜態函數不傳遞this指針,不識別對象個體,所以通常用來對類的靜態數據成員操作.
程序最終都將在內存中執行,變量只有在內存中佔有一席之地時才能被訪問。
類的靜態成員(變量和方法)屬於類本身,在類加載的時候就會分配內存,可以通過類名直接去訪問;非靜態成員(變量和方法)屬於類的對象,所以只有在類的對象產生(創建類的實例)時纔會分配內存,然後通過類的對象(實例)去訪問。
意思就是靜態成員函數屬於類但不屬於對象,可以被多個對象共享,優先於對象生成。