0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++基础知识之函数2

jf_78858299 来源:QStack 作者:月下西楼 2023-04-03 10:34 次阅读

内联函数

C++中,我们可以使用inline关键字来定义内联函数。内联函数是一种特殊的函数,它在编译时会被直接嵌入到调用它的代码中,从而避免了函数调用的开销,提高了程序的执行效率。内联函数的定义通常比较短小,否则它的嵌入代码会导致程序的体积增大,从而降低程序的性能。另外,内联函数的使用也不是万能的,它只适用于一些简单的函数,对于复杂的函数,我们还是应该使用普通的函数。

使用和定义

在C++中,我们可以使用inline关键字来定义内联函数。内联函数的定义通常放在头文件中,以便在多个源文件中使用。下面是一个简单的内联函数的例子:

inline int max(int a, int b) {
    return a > b ? a : b;
}

在上面的例子中,max函数是一个内联函数,它的定义前面有inline关键字。当我们在程序中调用max函数时,编译器会将其直接嵌入到调用它的代码中,从而避免了函数调用的开销。

优点

  • 提高程序的执行效率。由于内联函数在编译时会被直接嵌入到调用它的代码中,从而避免了函数调用的开销,因此可以提高程序的执行效率。
  • 可以避免一些函数调用带来的问题。例如,函数调用会导致一些寄存器的值被保存和恢复,从而影响程序的执行效率。而内联函数的嵌入代码可以避免这些问题。

缺点

  • 可能会导致代码体积增大。由于内联函数的嵌入代码会被直接嵌入到调用它的代码中,因此可能会导致代码体积增大,从而降低程序的性能。
  • 可能会导致代码重复,效率降低。由于内联函数的嵌入代码会被直接嵌入到调用它的代码中,因此可能会导致代码重复,可能会导致编译时间增加。

constexpr函数

在C++11中,我们可以使用constexpr关键字来定义constexpr函数。constexpr函数是一种特殊的函数,它在编译时就能够计算出结果,从而可以用于一些需要在编译时确定的场合。

❝需要注意的是,constexpr函数的定义和使用有一些限制,例如它的返回值类型必须是字面值类型,它的参数和函数体必须是常量表达式等等。

constexpr函数的定义和使用

在C++11中,我们可以使用constexpr关键字来定义constexpr函数。下面是一个简单的constexpr函数的例子:

constexpr int factorial(int n) {
    return n <= 1 ? 1 : n * factorial(n - 1);
}

在上面的例子中,factorial函数是一个constexpr函数,它的定义前面有constexpr关键字。当我们在程序中调用factorial函数时,编译器会在编译时就计算出结果,从而可以用于一些需要在编译时确定的场合。

优点

  • 在编译时就能够计算出结果,从而可以用于一些需要在编译时确定的场合,可以提高程序的执行效率。
  • 由于constexpr函数的定义通常比较简单,因此可以在头文件中定义,从而方便其他文件的使用。

缺点

  • 定义和使用有一些限制。由于constexpr函数的定义和使用有一些限制,因此不能在所有的场合都使用constexpr函数。
  • 函数通常需要在编译时计算出结果,因此可能会增加代码量。 为什么会增加代码量呢,例如,在下面的代码中,我们定义了一个constexpr函数factorial,它的定义比较简单,但是在编译时会生成一些额外的代码:
constexpr int factorial(int n) {
    return n <= 1 ? 1 : n * factorial(n - 1);
}

int main() {
    std::cout << factorial(5) << std::endl;
    return 0;
}

在上面的代码中,编译器会在编译时生成一些额外的代码,用于计算factorial(5)的结果。这些额外的代码可能会增加程序的代码量,从而影响程序的可读性和维护性。因此,在使用constexpr函数时,需要权衡代码量和执行效率之间的关系,选择合适的方案。

函数指针

在C++中,函数指针是一种指向函数的指针,它可以用于调用函数或者作为函数的参数和返回值。函数指针的类型由函数的返回值类型和参数类型决定,例如,下面是一个函数指针的定义:

int (*p)(int, int);

在上面的代码中,我们定义了一个函数指针p,它指向一个返回值类型为int,参数类型为int和int的函数。

函数指针的使用

函数指针可以用于调用函数或者作为函数的参数和返回值。例如,下面是一个使用函数指针的例子:

int add(int a, int b) {
    return a + b;
}

int sub(int a, int b) {
    return a - b;
}

int calc(int (*p)(int, int), int a, int b) {
    return p(a, b);
}

int main() {
    int a = 1, b = 2;
    int c = calc(add, a, b);
    int d = calc(sub, a, b);
    std::cout << c << std::endl; // 输出 3
    std::cout << d << std::endl; // 输出 -1
    return 0;
}

在上面的代码中,我们定义了两个函数add和sub,它们分别用于求两个整数的和和差。然后,我们定义了一个函数calc,它有三个参数:一个函数指针p,两个整数a和b。calc函数的作用是调用函数指针p,并将a和b作为参数传递给它。在main函数中,我们使用calc函数来计算两个整数的和和差,并输出结果。

除了回调函数,函数指针还可以用于实现函数对象和函数指针数组。函数对象是一种类对象,它重载了函数调用运算符operator(),从而可以像函数一样被调用。函数指针数组是一种数组,它的元素是函数指针,可以用于实现多态和动态调用等功能。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    22

    文章

    2108

    浏览量

    73644
  • 代码
    +关注

    关注

    30

    文章

    4788

    浏览量

    68601
  • 内联函数
    +关注

    关注

    0

    文章

    10

    浏览量

    2212
收藏 人收藏

    评论

    相关推荐

    C++文件操作

    C++文件操作
    的头像 发表于 07-21 10:52 1115次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>文件操作

    学51单片机C51基础知识

    带您从零学51单片机C51基础知识 C51基础知识1 单片机的汇编(ASM)和C语言优缺点
    发表于 02-10 14:30 109次下载

    C++C/C++程序设计教程_C/C++概述

    C++基础知识,简要介绍了C++的一些简单知识,概念,函数
    发表于 12-25 10:15 0次下载

    C++语言基础知识讲解

    C++语言基础知识讲解,喜欢的朋友可以下载来学习。
    发表于 01-14 15:30 21次下载

    Visual C++教程之C++基础知识介绍

    本文档的主要内容详细介绍的是Visual C++教程之C++基础知识介绍主要内容包括了:1 类和对象,2 类的成员及特性,3 继承和派生类
    发表于 02-15 15:59 9次下载
    Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的<b class='flag-5'>基础知识</b>介绍

    C++程序设计教程之基础知识资料概述

    本文档详细介绍的是C++程序设计教程之基础知识资料概述主要内容包括了:1.程序设计语言 ,2.C++前史 ,3.C++,4.C++编程流程,
    发表于 02-28 11:11 13次下载
    <b class='flag-5'>C++</b>程序设计教程之<b class='flag-5'>基础知识</b>资料概述

    C++程序设计的基础知识初步了解C++的资料免费下载

    本文档的主要内容详细介绍的是C++程序设计的基础知识初步了解C++的资料免费下载包括了:1 认识C++,2
    发表于 06-10 08:00 25次下载
    <b class='flag-5'>C++</b>程序设计的<b class='flag-5'>基础知识</b>初步了解<b class='flag-5'>C++</b>的资料免费下载

    C++函数模板的概念及意义

    一、函数模板的引出:1、c++中有几种交换变量的方法:(1)定义宏代码块(2)定义函数代码版本一:#include <iostream>#include <string>using n
    的头像 发表于 12-24 15:58 868次阅读

    C++重载函数学习总结

    函数重载是c++c的一个重要升级;函数重载通过参数列表区分不同的同名函数;extern关键字能够实现c
    的头像 发表于 12-24 17:10 798次阅读

    C++核心编程基础知识大全免费下载

    C++核心编程基础知识大全免费下载
    发表于 12-03 18:06 2次下载

    C/C++基础知识汇总

    这是一篇五万字的C/C++知识点总结,包括答案。
    的头像 发表于 06-12 15:10 2397次阅读

    C++基础知识

    C++基础知识
    的头像 发表于 01-12 11:00 1402次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>基础知识</b>

    深度解析C++中的虚函数

    函数作为C++的重要特性,让人又爱又怕,爱它功能强大,但又怕驾驭不好,让它反咬一口,今天我们用CPU的角度,撕掉语法的伪装,重新认识一下虚函数。 虚函数
    的头像 发表于 02-15 11:14 838次阅读
    深度解析<b class='flag-5'>C++</b>中的虚<b class='flag-5'>函数</b>

    C++基础知识函数1

    函数C++ 中的一个重要概念,它可以让我们将一段代码封装起来,然后在需要的时候调用它。C++ 中的函数有以下几个特点: * 函数
    的头像 发表于 04-03 10:34 577次阅读

    C++语言基础知识

    电子发烧友网站提供《C++语言基础知识.pdf》资料免费下载
    发表于 07-19 10:58 7次下载