文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++ 函数的介绍

2024-04-02 19:55

关注

一、基础

函数:封装了一段代码,可以在一次执行过程中被反复调用,包含函数头和函数体;

函数头:

函数体:一个语句块(block),包含具体的计算逻辑;

函数的声明与定义:

函数调用:

二、参数

对于非模板函数来说,其每个形参都有确定的类型,但形参可以没有名称;

实参到形参的拷贝顺序是不确定的;

函数的形参的传递一般分为:传值、传址、传引用;

变长参数的定义:

1、使用initializer_list传递


#include <initializer_list>
void fun(std::initializer_list<int> a){}

int main
{
 fun({1, 2, 3, 4})
}

注意:该方法只能传递类型相同的变长参数;

函数的缺省实参注意点:

1、如果某个形参具有缺省参数,那么它右侧的形参都必须具有缺省实参;


void fun(int x=1, int y=2){} // 这里y必须给定缺省值


2、具有缺省实参的函数调用时,传入实参按照从左到右的顺序进行匹配;

3、在一个翻译单元中,每个形参的缺省实参只能定义一次;

4、缺省实参为对象时,实参的缺省值会随对象值的变化而变化;

main函数的版本:


int main(int argc, char *argv[]) {}

argc是非负数,表述传入参数个数,argv是一个指针指向传输参数的数组头。

三、返回类型

返回类型的几种书写方式:

经典方法:位于函数头的前部,也是最常规的写法;

C++11引入的方式:位于函数头的尾部;


auto fun(int x) -> int
{
 return x*2;
}

C++14引入的方式:返回类型的自动推导;


auto fun(int a)
{
 return a;  // 会根据return语句进行推导
}

四、函数重载与解析

函数重载:使用相同的函数名定义多个函数,每个函数具有不同的参数列表;

注意:不能基于不同的返回类型进行重载;

名称查找:

重载解析:在名称查找的基础上进一步选择合适的调用函数;

五、内联函数

定义:将比较简单的函数逻辑展开到调用函数的部分,避免栈帧销毁,提升性能;

关键字:inline,如果一个函数在多个翻译单元展开,加入这个关键字可以避免重复定义;

1.constexpr函数

定义:之前有介绍常量表达式时用到了该关键字,现在对于函数也可以用该关键字;

作用:使得函数在编译器被执行,当然在有变量情况下也可在运行期执行;


constexpr int fun(int x){
    // int y; std::cin >> y;  会报错,该语句需要用户传入参数,只能在运行期执行
 return x * 2;
}

int main
{
 constexpr int x = fun(2);  // 编译器会翻译成 move eax 4, 去掉constexpr也可以
 return x;
}

注意:constexpr函数中的语句必须是可以在编译器执行的语句;

拓展:关键字consteval(C++20引入),函数只能在编译器执行;

六、函数指针

作用:可以用于高阶函数中,将函数指针作为参数;

代码案例:


int add(x) { return x + 1};
using T = int(int);
int fun(K* F, int x)
{
 int tmp = (*F)(x);
 return tmp * 2;
}

int main
{
 std::cout << fun(&add, 50) << std::endl;
}

说明:这就是用函数指针定义的一个高阶函数,在之后的很多高阶函数、泛型算法中也是这样的用法;

注意:当函数对象进行赋值或者返回值时,返回的是一个函数指针类型的对象;

七、思考

1、我们常常会见到如下代码,是由什么作用?


extern "C" 
int fun(int x, int y)
{
    return x + y;
}

C语言对于函数是不能重载的,当用C调用C++程序时,往往找不到C++编译后的函数名,可通过如上代码定义一个函数为C类型函数;

2、可以用别名定义一个函数类型吗?


using X = int[3];
X a;    // 这是定义了一个数组,同int a[3]

using X = int(int);
X fun;    // 这是定义了一个int返回类型的函数

函数也是有类型的,可以用别名定义,并且函数类型不包含形参名称,并且只能声明,不能定义;

总结:

本篇主要介绍了函数的基础概念以及一些特殊的函数方法和类型。重点需要注意的就是函数重载以及函数指针,这个在后续的模板以及泛型编程都会用到;下一篇将讨论C++中的内存,也是最重要的一个部分。

到此这篇关于C++ 函数的介绍的文章就介绍到这了,更多相关C++函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯