首页 > 编程语言 > 详细

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

时间:2021-02-04 22:47:16      阅读:66      评论:0      收藏:0      [点我收藏+]

问题:

刷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指针,但静态成员函数指针和普通函数指针没有区别。

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

    函数指针

如有错误,欢迎指正!

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

原文:https://www.cnblogs.com/fresh-coder/p/14375252.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!