每次函数调用时都会重新创建它的形参,并传入实参对形参初始化。如果形参是引用类型,它将绑定到对应的实参上;否则将实参的值拷贝给形参。
传值参数
将实参的值拷贝赋给形参,函数对形参的操作不影响实参。类似:
int n = 10;
int i = n;
i = 42;
//形参类似 i,实参类似 n;对 i 的操作不影响 n 的值
指针形参,也是将实参的值拷贝赋给形参,形参指针与实参是两个指针,由于指针的值是地址,所以指向的是同一个地址。
传引用参数
传引用相当于将实参另起了个名字,函数对引用的操作既是对实参的操作。
- 传引用避免拷贝,有些类型太大或不支持拷贝,函数只能通过传引用访问。
- 传引用可以避开函数只能返回一个值的问题。
const形参和实参
当const是形参时,注意顶层const。
//当形参有顶层const时,传给它常量对象或非常量对象都是可以的
void fcn(const int i){/*fcn能够读取i,但是不能向i写值*/}
调用fcn函数时,既可以传入const int也可以传入int,忽略掉形参的顶层const可能产生意想不到的结果。
c++中允许定义若干具有相同名字的函数,前提是不同函数的形参列表有明显区别。
void fcn(const int i){/* fcn能够读取i,但不能向i写值 */}
void fcn(int i){/*...*/}//错误:重复定义了fcn(int)
数组形参
数组不可拷贝,使用时转化为指针。所以函数传递数组时实际上是传递指针。
管理数组形参的三种常用技术:
- 数组本身含有一个结束标志,例如C语言的字符串数组。
void print(const char *cp)
{
if(cp) //若cp不是一个空指针
while(*cp) //只要指针所指的字符不是空字符
cout<<*cp++; //输出当前字符并将指针向前移动一位
}
- 使用标准库规范
void print (const int *begin,const int *end)
{
while(begin!=end)
cout<<*begin++<<endl;
}
int main()
{
int j[2] = {0,2};
print(begin(j),end(j));
}
- 显示传递数组大小