vector和其它类型的形参
如果要传递vector,形参设为非引用的vector类型,则会复制vector中的每一个元素,应该设为引用。
数组形参
数组的两个性质:
- 不能被复制。
- 使用数组名时(除了使用sizeof操作符),数组名会自动转为指向其第一个元素的指针。
数组形参的定义
下面三种是等价的,形参类型在编译器看来都是int*。
void a(int*);
void a(int[]);
void a(int[10]);
下面也是可以的:
void a(int arr[10]);
注意,尽管上面假设传进来的数组至少含有10个元素,但是c++没有任何机制强制实现这个假设。
在你设定好数组形参之后,编译器检查传进来的实参时只会看实参是不是指针、指针的类型和数组元素的类型是不是一致,并不会去检查你传进来的数组实参中数组的长度。
传递数组时,实参是指向数组第一个元素的指针,形参复制的是这个指针的值,因此函数操纵的是实参指针的副本,不会修改实参指针的值。
- 如果需要修改数组元素的值,通过指针的解引用来修改。
- 如果不需要修改数组元素的值,则函数形参应定义为指向const对象的指针:
void a(const int*);
通过引用传递数组
多维数组的传递
C++中没有多维数组,所谓多维数组实际指元素为数组的数组。
与一维数组一样,编译器忽略第一维的长度,除了第一维以外的所有维的长度都是元素类型的一部分,必须明确指定:
void a(int (*arr)[10], int row_size);
或
void a(int arr[][10], int row_size);
两种方法都可以,这里arr指向含有10个int的数组,这样的数组有row_size个。
注意:
- 这里的形参是指针。
- 10是第二维的长度。
- 第二种方法中虽然你把形参声明成二维数组的形式,但实际上在编译器看来,它就是个指针。
main:处理命令行选项
形参是字符串数组该怎么写:
// 字符串数组即元素为字符串的数组,而单个字符串又是字符数组
// 所以字符串数组是数组的数组,即二维数组
void a(char* arr[], int row_size);
或
void a(char** arr, int row_size);
- 第一种是说arr是一个数组名,数组元素是char*。
- 第二种是说arr是一个指针,指向char*。
- 在编译器看来非引用数组就是指针,所以上面两种等价。
return语句
- 不带返回值
只能用于返回类型为void的函数。 - 带返回值
- 任何返回类型不是void的函数都必须返回一个值(注:允许主函数main()没有返回值就结束)。
- 返回值的类型必须和函数定义的返回类型相同(或能隐式转换)。
- 在含有return语句的循环后没有提供return语句很危险。
- 要时刻注意函数中的局部变量所占的存储空间会在函数结束时被清除。
函数声明
- 在头文件中提供函数声明
- 在定义函数的.c文件中应该包含声明该函数的头文件
- 默认实参:给形参表中的形参提供默认的初始值
- 如果某个形参具有默认实参,则该形参后面的所有形参都必须有默认实参。
- 调用包含默认实参的函数时,可以为该形参提供实参,也可以不提供。
- 设计时,最可能使用默认实参的形参应该排在最后。