美文网首页C语言程序员程序园
c++ 基础(函数指针)

c++ 基础(函数指针)

作者: zidea | 来源:发表于2019-04-29 13:40 被阅读16次
Cplusplus-tutorial-in-hindi.jpg

学习 c++ 的道路是曲折,学多内容让人 confusing,我想原因很多,首先 c++ 是一门接近机器底层的语言,而非对开发人员友好的高级编程语言。这是也是他高效的原因吧。可能还有就是他更多的是操作计算机硬件和内存,如果对于硬件或内存结构并不了解的开发人员这里可能会有许多难理解的内容。

void HelloWorld()
{
    std::cout << "Hello world" << std::endl;
}

int main(int argc, char const *argv[])
{
   
    HelloWorld();
    std::cin.get();
}

这是一个极其普通的函数,运行在控制台输出Hello World。我是 web 前端出身,接触的最多就是 javascript 这样函数是一等公民的动态语言。
函数可以作为指针来使用,我们想一想函数是什么,编译后的函数又是什么。函数在代码组织的最小单元,编译以后一组 CPU 指令集保存在内存某个地方等待执行。所以我们可以用一个指针变量指向一个内存地址。执行这部分内存地址中指令不就等同于调用函数一样吗。
这里 auto 类型定义变量function来接收HelloWorld函数。对函数变量调用和普通函数没有任何区别。

void HelloWorld()
{
    std::cout << "Hello world" << std::endl;
}

int main(int argc, char const *argv[])
{
    auto function = HelloWorld;
    function();
    function();
    // HelloWorld();
    std::cin.get();
}

那么 function 这个变量具体又是什么类型呢,将鼠标移动到function给我们提示functionvoid (*function)()。好既然我们知道了 function 具体是什么类型就可以对上面代码进行适当的修改。

int main(int argc, char const *argv[])
{
    void (*function)() = HelloWorld;

    function();
    function();
    std::cin.get();
}

这样写,运行没有任何问题,不过总是感觉怪怪。我们还是用 typedef 来指定一种类型作为函数指针的类型。

HelloWorldFunc func = HelloWorld;

创建该类型(HelloWorldFunc)函数指针接受函数作为值。这样处理起来符合我们开发的习惯,其实习惯挺重要的。

int main(int argc, char const *argv[])
{
    typedef void (*HelloWorldFunc)();

    HelloWorldFunc func = HelloWorld;
    func();
    func();
    std::cin.get();
}

如果函数有参数例如HelloWorld(int a),我们就需要修改为typedef void (*HelloWorldFunc)(int);

void HelloWorld(int a)
{
    std::cout << "Hello World " << a << std::endl;
}

int main(int argc, char const *argv[])
{
    typedef void (*HelloWorldFunc)(int);

    HelloWorldFunc func = HelloWorld;
    func(1);
    func(2);
    func(3);
    std::cin.get();
}

既然函数指针可以赋值给变量,我们就也可以将函数做参数传入函数进行使用从而实现高阶函数。这部分代码怎么看怎么像 underscore 的方法呢。

void PrintNum(int num)
{
    std::cout << "number: " << num << std::endl;
}

void ForEach(const std::vector<int> &nums, void (*func)(int))
{
    for (int num : nums)
        func(num);
}

int main(int argc, char const *argv[])
{
    std::vector<int> values = {1, 2, 3, 5, 6};
    ForEach(values, PrintNum);
    std::cin.get();
}

相关文章

  • C++函数指针和Swift的函数对象

    C++函数指针和Swift的函数对象 在C++中学习函数指针式非常痛苦的事情,而在Swift里面学习函数指针则是非...

  • c++ 基础(函数指针)

    学习 c++ 的道路是曲折,学多内容让人 confusing,我想原因很多,首先 c++ 是一门接近机器底层的语言...

  • C++学习(1) ---- 基本语法介绍

    C++ 基本语法 C++基础语法说明基本形式NA命名空间NA构造函数和析构函数NA实例化方法NA指针和引用NA静态...

  • 函数指针与返回函数指针的函数

    转载自C++:函数指针 & 返回函数指针的函数 - 简书 (jianshu.com)[https://www.ji...

  • 18/4 lambda表达式

    比较函数指针、函数符和lambda函数 cout_if() 在c++中对于接受函数指针或函数符的函数,可使用匿名函...

  • c++ 指针

    原文地址摘要:这篇文章详细介绍C/C++的函数指针,请先看以下几个主题:使用函数指针定义新的类型、使用函数指针作为...

  • C++ 、java 和 C# 的区别

    一、基础类型 c++: ** java:** C#: 二、指针 1.java 是没有指针这个概念,c++ 和 c#...

  • go - 学习笔记

    基础 函数 指针 结构体 接口 错误 协程 通道 基础 函数 指针 结构体 接口 错误 协程 通道

  • C++函数指针、指针函数、引用函数

    函数指针的声明:返回类型 (*函数名) (形参); 指针函数的声明:返回类型 * 函数名 (形参); 引用函数的声...

  • C语言基础及指针⑤动态内存分配

    接续上篇C语言基础及指针④函数指针 在上一篇我们了解C语言中的函数及函数指针 , 使用函数指针 , 模拟了网络请求...

网友评论

    本文标题:c++ 基础(函数指针)

    本文链接:https://www.haomeiwen.com/subject/fbcenqtx.html