1.非引用形参
非引用形参表示对对应实参的局部副本,对这类形参的修改仅仅改变了局部副本的值,一旦函数执行完成,这些局部变量的值也就没有了。
1.1 指针形参
该类形参的任何改变也仅仅作用于局部副本,如果函数将新指针值赋给形参,主调函数使用的实参指针的值没有改变。
1.2const形参
如果函数使用非引用的非const 形参,则即可给该函数传递const 实参,也可以传递非const 的实参。
如果函数使用非引用的const 形参,也是既可以给该函数传递const 实参,也可以传递非const 的实参,但是不可以改变实参的局部副本。
注意:尽管函数的形参是const,但编译器却将const 形参被声明为普通类型,如下
void fcn(const int i)就是void fcn(int i)
2.引用形参
作用有以下点:
2.1 使用引用形参可以返回额外的信息
函数只能返回单个值,通过传递引用形参可以改变实参的值,所以对应修改的值进行了改变。
2.2 利用const 引用避免复制
形参作为引用,可以避免被复制,而且形参为const 引用,则函数体不能通过该引用来修改实参。
应该将不需要修改的引用形参定义为const 引用,因为非const 引用形参只能与完全相同类型的非const 对象关联,所以普通的非const 引用形参既不能用const对象初始化,也不能用字面值或者产生右值的表达式实参初始化。
3. 数组形参
因为数组不能复制,所以无法编写使用数组类型形参的函数,但是可以仍可将函数的形参写成数组的形式,如下定义的三种形式是等价的。
void getValue(int*){}
void getValue(int[]){}
void getValue(int[10]){}
注意:当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组元素的类型是否匹配,而不会检查数组的长度。
在传递数组时,实参是指向数组第一个元素的指针,形参复制的是这个指针的值,而不是数组元素本身。
通过引用传递数组,编译器检查数组实参的大小与形参的大小是否匹配。
4. 含可变形参的函数
在无法列举出传递给函数的所有实参的类型和数目时,可以使用省略符形参。省略符暂停了类型检查机制。它们的出现告诉编译器,当调用函数时,可以有0个或多个实参,而实参的类型未知。