AcWing语法基础课笔记 第六章 C++中的函数

简介: 函数让代码变得更加简洁。 ——闫学灿

第六章 C++中的函数


函数让代码变得更加简洁。                      ——闫学灿

函数递归:

2.png1.png3.png

函数基础


一个典型的函数定义包括以下部分:返回类型、函数名字、由0个或多个形参组成的列表以及函数体。


1.1编写函数


我们来编写一个求阶乘的程序。程序如下所示:


int fact(int val)

{

  int ret = 1;

   while (val > 1)

       ret *= val -- ;

   return ret;

}


函数名字是fact,它作用于一个整型参数,返回一个整型值。return语句负责结束fact并返回ret的值。


1.2调用函数


int main()

{

   int j = fact(5);

   cout << "5! is " << j << endl;

   return 0;

}


函数的调用完成两项工作:一是用实参初始化函数对应的形参,二是将控制权转移给被调用函数。此时,主调函数的执行被暂时中断,被调函数开始执行。


1.3形参和实参


实参是形参的初始值。第一个实参初始化第一个形参,第二个实参初始化第二个形参,依次类推。形参和实参的类型和个数必须匹配。


fact(“hello”); // 错误:实参类型不正确


fact(); // 错误:实参数量不足


fact(42, 10, 0); // 错误:实参数量过多


fact(3.14); // 正确:该实参能转换成int类型,等价于fact(3);


形参也可以设置默认值,但所有默认值必须是最后几个。当传入的实参个数少于形参个数时,最后没有被传入值的形参会使用默认值。


1.4函数的形参列表


函数的形参列表可以为空,但是不能省略。


void f1() {/* …. */} // 隐式地定义空形参列表


void f2(void) {/* … */} // 显式地定义空形参列表


形参列表中的形参通常用逗号隔开,其中每个形参都是含有一个声明符的声明。即使两个形参的类型一样,也必须把两个类型都写出来:


int f3(int v1, v2) {/* … */} // 错误


int f4(int v1, int v2) {/* … */} // 正确


1.5函数返回类型


大多数类型都能用作函数的返回类型。一种特殊的返回类型是void,它表示函数不返回任何值。函数的返回类型不能是数组类型或函数类型,但可以是指向数组或者函数的指针。


1.6局部变量、全局变量与静态变量


局部变量只可以在函数内部使用,全局变量可以在所有函数内使用。当局部变量与全局变量重名时,会优先使用局部变量。


2.参数传递


4.png

1.传值参数

当初始化一个非引用类型的变量时,初始值被拷贝给变量。此时,对变量的改动不会影响初始值。


2.2传引用参数


5.png


当函数的形参为引用类型时,对形参的修改会影响实参的值。使用引用的作用:避免拷贝、让函数返回额外信息。


2.3数组形参


在函数中对数组中的值的修改,会影响函数外面的数组。

6.png




一维数组形参的写法:


// 尽管形式不同,但这三个print函数是等价的


void print(int *a) {/* … */}


void print(int a[]) {/* … */}


void print(int a[10]) {/* … */}


7.png



多维数组形参的写法:


// 多维数组中,除了第一维之外,其余维度的大小必须指定


void print(int (*a)[10]) {/* … */}


void print(int a[][10]) {/* … */}


3.返回类型和return语句


return 语句终止当前正在执行的函数并将控制权返回到调用该函数的地方。return语句有两种形式:


return;


return expression;


3.1无返回值函数


没有返回值的return语句只能用在返回类型是void的函数中。返回void的函数不要求非得有return语句,因为在这类函数的最后一句后面会隐式地执行return。


通常情况下,void函数如果想在它的中间位置提前退出,可以使用return语句。return的这种用法有点类似于我们用break语句退出循环。


void swap(int &v1, int &v2)

{

   // 如果两个值相等,则不需要交换,直接退出

   if (v1 == v2)

       return;

   // 如果程序执行到了这里,说明还需要继续完成某些功能

   int tmp = v2;

   v2 = v1;

   v1 = tmp;

   // 此处无须显示的return语句

}


3.2有返回值的函数


8.png



只要函数的返回类型不是void,则该函数内的每条return语句必须返回一个值。return语句返回值的类型必须与函数的返回类型相同,或者能隐式地转换函数的返回类型。


4.函数递归


在一个函数内部,也可以调用函数本身。

9.png




目录
相关文章
|
1月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
48 6
|
1月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
25 0
C++ 多线程之线程管理函数
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
28 3
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
191 1
|
1月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
34 1
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
46 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
2月前
|
存储 算法 编译器
C++ 11新特性之语法甜点4
C++ 11新特性之语法甜点4
28 0
|
2月前
|
安全 C++ 容器
C++ 11新特性之语法甜点3
C++ 11新特性之语法甜点3
36 0
|
2天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
15 2