C++_成员函数与函数指针

问题:

刷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 };

 

错误的原因,其实是sort找不到自己定义的cmp函数,参数不匹配。下面来慢慢说明 

一、补充C++同一个类的成员函数之间互相调用的规则:

1.c++同一个类的非静态成员函数之间可以直接嵌套调用;

2.c++同一个类的静态成员函数之间可以直接嵌套调用;

3.c++的非静态成员函数可以直接嵌套调用静态成员函数;

4.c++的静态成员函数不可以直接嵌套调用非静态成员函数。

一个类里面的函数可以随便互相调用。但有一个限制:静态函数只能操作静态变量和调用静态函数。

二、关于sort 

 

 std::sort 中的比较函数是一个普通函数,它再次调用普通成员函数会报错。但是把cmp函数改为static bool cmp 静态成员函数或者放为全局函数(class外)这是不依赖于具体对象的,是可以独立访问的,无需实例化就可以访问。那么为啥普通函数调用普通成员函数会出错?接着看下面。。

三、普通成员函数指针与普通函数指针

普通成员函数指针会隐藏一个this指针,意味着cmp函数表面看有两个参数,实际上有三个参数。但是std:::sort的比较函数是有两个指针,这就报错了。如果把cmp成员函数变为静态函数或者全局函数,这就不会有this指针,就不会出错。

四、小结

函数指针与普通成员函数指针是有区别的,差个this指针,但静态成员函数指针和普通函数指针没有区别。

补充:成员函数与普通函数的区别  

    函数指针

如有错误,欢迎指正!

posted @ 2021-02-04 22:15  Uitachi  阅读(165)  评论(0编辑  收藏  举报