刷LeetCode过程中,代码及报错如下:
1 class Solution { 2 public: 3 //按绝对值从大到小进行排列 4 bool cmp(int a,int b){ 5 return abs(a) > abs(b); 6 } 7 int largestSumAfterKNegations(vector<int>& A, int k) { 8 int sum = 0; 9 sort(A.begin(),A.end(),cmp); 10 //把负数变正数 11 for(int i = 0;i < A.size();i++){ 12 if(A[i] < 0 && k >0){ 13 A[i] = -A[i]; 14 k--; 15 } 16 } 17 //最后反复变值最小的正数 18 while(k--) { 19 A[A.size()-1] *= -1; 20 } 21 for(int i = 0;i < A.size();i++){ 22 sum += A[i]; 23 } 24 return sum; 25 } 26 };
1.c++同一个类的非静态成员函数之间可以直接嵌套调用;
2.c++同一个类的静态成员函数之间可以直接嵌套调用;
3.c++的非静态成员函数可以直接嵌套调用静态成员函数;
4.c++的静态成员函数不可以直接嵌套调用非静态成员函数。
一个类里面的函数可以随便互相调用。但有一个限制:静态函数只能操作静态变量和调用静态函数。
std::sort 中的比较函数是一个普通函数,它再次调用普通成员函数会报错。但是把cmp函数改为static bool cmp 静态成员函数或者放为全局函数(class外)这是不依赖于具体对象的,是可以独立访问的,无需实例化就可以访问。那么为啥普通函数调用普通成员函数会出错?接着看下面。。
普通成员函数指针会隐藏一个this指针,意味着cmp函数表面看有两个参数,实际上有三个参数。但是std:::sort的比较函数是有两个指针,这就报错了。如果把cmp成员函数变为静态函数或者全局函数,这就不会有this指针,就不会出错。
函数指针与普通成员函数指针是有区别的,差个this指针,但静态成员函数指针和普通函数指针没有区别。
如有错误,欢迎指正!
原文:https://www.cnblogs.com/fresh-coder/p/14375252.html