静态成员&&静态成员函数

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.类加载时分配内存空间属于类而非具体对象。

猜你喜欢

转载自blog.csdn.net/qq_27446275/article/details/85028444