zoukankan      html  css  js  c++  java
  • 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指针,但静态成员函数指针和普通函数指针没有区别。

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

        函数指针

    如有错误,欢迎指正!

  • 相关阅读:
    3: Flink 运行命令 设置port
    4: docker 安装flink 1.14
    6: Docker Compose简单知识
    十二 docker 安装kafka
    十三 查看kafka版本
    2: Windows安装1.9.3 flink && first demo project
    5: win10 使用IDEA调试编译flink 1.14
    1: Windows上安装Flink
    Chrome 96 新功能
    js map遍历与promise一起使用会出现的问题,以及解决方案
  • 原文地址:https://www.cnblogs.com/fresh-coder/p/14375252.html
Copyright © 2011-2022 走看看