参数传递
1、传值参数(实参初始化形参)
- 普通形参(int,char.....)
- 指针形参(int * ,char *.....)
2、传引用参数(引用是实参的别名)
- 使用引用避免拷贝(尤其是比较大的类或者是容器对象)
当不需要修改对象时,将其声明为常量引用。 bool isShorter(const string &str1, const string &str2);
- 使用引用形参返回额外信息(当函数需要返回多个值的时候,引用为我们一次返回多个结果提供了途径)
void find_char(const string &s, char c, int &cnt);
3、const 形参和实参
- void fun(const int i);函数内部可以读取i,但是不能向i写入值。调用fun函数时,可以传入const int 类型的值,也可以传入int 类型的值。
- 指针或引用形参与const
int i = 23;
const int *cp = &i;//正确,但是不能通过*cp来改变i的值
const int &r = i;//正确,但是不能通过r来改变i的值
const int &r2 = 24;//正确,允许一个常量引用绑定一个字面值
int *p = cp;//错误,p和cp的类型不同
int &r3 = r;//错误,r3和r的类型不同
int &r4 = 24;//错误,非常量引用不能绑定一个字面值
- 尽量使用常量引用(如果形参是普通引用,则不能传递字面值和const对象)
4、数组形参
- 不能以值传递的方式传递数组,但是我们可以把形参写成类似数组的形式
void print(const int *);
void print(const int []);
void print(const int[10]);//指期望数组含有10个元素
我们把三个函数的形参都定义为指向const 的指针。当函数不需要对数组元素进行写操作的时候,数组形参应该是指向const指针。只有当函数确实要改变元素值的时候,才把形参定义为非常量指针。- 数组引用形参
void print (int (&arr)[10] );//arr是具有10个整数的整型数组的引用
void print (int &arr[10] );//arr声明为引用的数组
- 传递多维数组
当将多维数组传递给函数的时候,真正传递的是指向数组首元素的指针。
int *matrix[10];//10个指针构成的数组
int (*matrix) [10];//指向含有10个整数的数组的指针
void print(int matrix[][10], int rowSize);//matrix看起来是一个二维数组,实际上形参是指向含有10个整数的数组的指针。
- main函数中的参数(命令行选项)
int main(int argc, char *argv[])
/*
第一个形参argc表示数组中字符串的数量。
第二个形参argv是一个数组,argv指向char*。
当实参传递给main函数之后,argv的第一个元素指向程序的名字或者是一个空字符串,
接下来的元素依次传递命令行提供的实参。最后一个指针之后的元素值保证为0;
*/
/*
例如:如果在命令行中输入, prog -d -o file data
这些命令行通过两个形参传递给main函数。
argv[0] = "prog";
argv[1] = "-d";
argv[2] = "-o";
argv[3] = "file";
argv[4] = "data";
argv[5] = 0;
*/
当使用argv中的实参时,可选的实参时从argv[1]开始的。argv[0]保存程序的名字。5、含有可变形参的函数
为了编写能够处理不同数量实参的函数,C++11提供了两种主要的方法:
- 如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型。
- 如果实参的类型不同,可以编写一个特殊的函数,也就是所谓的可变参数模板。
C++还有一种特殊的形参类型,即省略符,可以用它传递可变数量的实参。(这种功能一般只用于与C函数交互的接口程序)
void fun(parm_list, ...);
void fun(...);