示例
这个debug是我在做力扣179——最大数时遇到的,如果这道题小伙伴们没有思路的话,可以看我的博客力扣179:最大数【C++】,有写这道题的解法。
以下为当时遇到问题时的程序段:
class Solution {
public:
bool compare(string a,string b){//排序规则
return a+b>b+a;
}
string largestNumber(vector<int>& nums) {
string str;
vector<string>str_nums;
for(int i:nums){
str_nums.push_back(to_string(i));
}
sort(str_nums.begin(),str_nums.end(),compare);//问题所在
if(str_nums[0]=="0"){
return "0";
}
for(string j:str_nums){
str+=j;
}
return str;
}
};
分析
我们在学类的时候,应该知道类中对象都有自己成员变量数据的拷贝。对于每个非静态的成员函数,都有一个implicit parameter(Solution* this),因此非静态成员函数的调用必须获得this指针。这就要求非静态成员函数必须被绑定到一个类的对象或者指针上,才能得到被调用对象的this指针,然后才能调用指针所指的成员函数。
我所写的代码中,sort(str_nums.begin(),str_nums.end(),compare);
,这里的实参compare所对应的只是一个普通指针,而不是this指针,compare函数作为非静态成员函数,没有获得this指针,因此是无法调用的。
而静态成员函数因为是共有的,不依赖于对象的创建,也就不需要this指针,只需要普通函数指针即可,因此把compare函数改为静态成员函数即可解决。
另一种不是很建议的解决方式是,将compare函数写在类外,作为普通全局函数实现。这样一来可读性较差,二来对于LeetCode平台的刷题来说,并不是一种好的写法,因此还是建议采用改为静态成员函数的方式。
结论
对于静态成员函数和普通函数的调用,不需要this指针;
对于非静态成员函数的调用,需要this指针,即依赖于类对象的创建。