函数:封装了一段代码,可以在一次执行过程中被反复调用,包含函数头和函数体;
函数头:
函数名称(标识符),用于后续的调用;形式参数,代表函数肇庆学院音乐学院的输入参数;返回类型,函数执行完成后返回结果的类型;函数体:一个语句块(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++11220v交流电引入的方式:位于函数头的尾部;
auto fun(int x) -> int{ return x*2;}
c++14引入的方式:返回类型的自动推导;
auto fun(int a){ return a; // 会根据return语句进行推导}
函数重载:使用相同的函数名定义多个函数,每个函数具有不同的参数列表;
注意:不能基于不同的返回类型进行重载;
名称查找:
分为限定查找和非限定查找:有无限定在某个作用域中;非限定查找会进行域的逐级查找——名称隐藏;查找通常只会在已声明的名称集合中进行;重载解析:在名称查找的基础上进一步选择合适的调用函数;
过滤不能被调用的版本:参数个数不对、无法将实参转为形参、实参不满足形参的限制条件;定义:将比较简单的函数逻辑展开到调用函数的部分,避免栈帧销毁,提升性能;
关键字:inline
,如果一个函数在多个翻译单元展开,加入这个关键字可以避免重复定义;
定义:之前有介绍常量表达式时用到了该关键字,现在对于函数也可以用该关键字;
作用:使得函数在编译器被执行,当然在有变量情况下也可在运行期执行;
constexpr int f舟山攻略un(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;}
说明:这就是用函数指针定义的一个高阶函数,在之后的很多高阶函数、泛型算法中也是这样的用法;
注意:当函数对象进行赋值或者返回值时,返回的是一个函数指针类型的对象;
extern "c" int fun(int x, int y){ return x + y;}
c语言对于函数是不能重载的,当用c调用c++程序时,往往找不到c++编译后的函数名,可通过如上代码定义一个函数为c类型函数;
using x = int[3];x a; // 这是定义了一个数组,同int a[3]using x = int(int);x fun; // 这是定义了一个int返回类型的函数
函数也是有类型的,可以用别名定义,并且函数类型不包含形参名称,并且只能声明,不能定义;
总结:
本篇主要介绍了函数的基础概念以及一些特殊的函数方法和类型。重点需要注意的就是函数重载以及鲁迅的伤逝函数指针,这个在后续的模板以及泛型编程都会用到;下一篇将讨论c++中的内存,也是最重要的一个部分。
到此这篇关于c++ 函数的介绍的文章就介绍到这了,更多相关c++函数内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 01:31:22,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/9236fab6b0cfb6d9e588888c6c161c73.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:C++ 函数的介绍.doc
本文 PDF 下载地址:C++ 函数的介绍.pdf
留言与评论(共有 0 条评论) |