目录
1. 原型句法
2. 函数分类
3. 函数参数之按值传递
4. 数组作为函数参数
在C++中,要使用函数,必须要有这三个方面:
- 函数原型,函数原型描述了函数到编译器的接口,函数原型一般放在include文件中。函数原型告诉编译器需要提供什么样的形参,如果程序没有提供这样的形参,原型将让编译器能够捕获这种错误。
- 函数定义。
- 调用函数,函数调用是一个语句。
可能很多初学者会问,有了函数定义为什么需要函数原型?
C++允许一个程序放在多个文件中单独编译,然后再将它们组合起来。在这种情况下,编译器在编译main()函数时,可能无法访问函数定义的代码。
总的来说,函数原型有3个作用:
- 使编译器能正确处理函数返回值;
- 使编译器能检查使用的参数数目是否正确;
- 使编译器能检查使用的参数类型是否正确;
避免使用函数原型的唯一方法是在main()函数之前定义它。但C++的编程风格是将main()函数放在最前面,因为它通常提供了程序的整体风格。
1. 原型句法
- 原型句法是一条语句,因此必须以分号结束;
- 获得原型最简单的方法是复制函数定义中的函数头,并添加分号;
- 函数原型不要求提供变量名,有类型列表即可。参数列表可以包括变量名,也可以不包括变量名,原型中的变量名相当于占位符,不必与函数定义中的变量名相同。在函数定义中形参变量名一般用_a, _b, _c形式的命名方式。
C++占位符相关知识:
(1)auto:在C++11及以后,auto可以为类型占位符,由编译器推导类型。如:
auto x=2; //x被推导为int类型
(2)格式化输出时,占位符用于指定变量插入的位置和格式,如:
printf("Number: %d, string: %s", 2, "hello");
2. 函数分类
函数分为两类:
- 没有返回值的函数,称为void函数,通用格式为:
void functionName(paralist)
{statements;return;//optional
}
- 有返回值的函数,通用格式为:
typeName functionName(paralist)
{statements;return value;//optional
}
对于有返回值的函数,必须使用返回语句,以便将返回值传递给调用函数。C++对于返回值的类型有一定的限制,不能是数组,但可以是其他任何类型——整型,浮点型,指针,甚至可以是结构体和对象。(虽然C++不能直接返回数组,但可以将数组作为结构体或对象的组成部分来返回)
返回语句也可以是一个表达式。
3. 函数参数之按值传递
按值传递的函数参数,形参使用的是实参数据的拷贝,在函数中改变形参的值不会改变实参的值。
在函数中声明的变量(包括形参)都是该函数私有的。在函数被调用时,计算机将为这些变量分配内存,函数调用结束后,这些变量所占用的内存被释放,这样的变量被称为局部变量,因为它们被限制在函数中,也被称为自动变量,因为它们的内存在程序执行过程中自动分配和自动释放的,不需要人为干预。
4. 数组作为函数参数
将数据作为函数参数时,需要将数组的大小一并传递,因为数组名只代表了数组的首地址,如果不传递数组长度,函数就无法数组的长度。以下实例可以更好的了解数组作为函数参数时为何一定要把长度也传递给函数。
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int sum_arr(int arr[], int n);
int main()
{int cookies[6] = { 1,2,4,6,8,10 };cout << "size of cookers: " << sizeof(cookies) << endl;cout << "size of cookers[0]: " << sizeof(cookies[0]) << endl;cout << "size of &cookers[0]: " << sizeof(&cookies[0]) << endl;int sum = sum_arr(cookies, 6);cout << "sum: " << sum << endl;return 0;
}int sum_arr(int arr[], int n)
{int total = 0;cout << "size of arr: " << sizeof(arr) << endl;for (int i = 0; i < n; i++){total = total + arr[i];}return total;
}
以下为输出结果,cookies=24表示数组所占的字节数为24,cookies[0]=4表示第一个元素所占的字节数为4,因为数组总共有6个元素,所以没有问题。 &cookies[0]表示的是数组的首地址,大小为8个字节,传递给函数时使用的是数组名,在函数中输出arr的大小也是8个字节,说明数组名作为函数参数时只传递数组的地址(首地址),不会传递整个数组所有的元素值。
将实例代码中的函数调用换成如下参数:
int sum = sum_arr(cookies+2, 3);
表示传递的是数组第3个元素的地址,并且设置了数组的长度为3,即只求第3,4,5三个元素的和,所以结果应该是18,程序运行结果如下: