一、非引用传递:
用实参的副本初始化形参,函数没有访问调用所传递的实参本身,修改形参时不会影响到实参的值。
1、非引用形参(值传递,实参的局部副本):
普通的非引用类型的参数通过复制对应的实参实现初始化。当用实参副本初始化形参时,函数不会方位实参本身,所以不会修改实参的值。
int gcd(int v1, int v2)
{
while(v2) {
int temp = v2;
v2 = v1%v2;
v1 = temp;
}
return v1;
}
该函数仅仅修改了函数内的局部参数。
2、指针形参:
形参为指针时,将复制实参指针,调用函数时不会修改指针的值。但如果形参是非const类型的指针,函数可通过指针实现赋值,修改指针所指对象的值。
void reset(int *ip) //形参为ip
{
// *ip = 0; // changes the value of the object to which ip points 通过指针修改了指针所指对象的值
ip = 0; // changes only the local value of ip ; the arguments is unchanged 修该了形参的值,对实参(ip的指向)没有影响
}
reset函数仅能指向非const对象,即仅能将int *类型的实参传递给reset函数。
void use_ptr(const int *p)
{
}
我们既可以用int *,也可以用const int *类型的实参调用use_ptr函数.
3、const形参
(调用函数时,如果函数使用非引用的非const形参,既可以给函数传递const实参也可传递非const的实参)
如果将形参定义为非引用的const类型:
void fcn(const int i )
{
}
则在函数中,不可以改变实参的局部副本。
(由于实参仍然是以副本的形式传递,因此传递给fcn的既可以是const对象,也可以是非const对象)
以上为复制实参,传递给形参。
对于大部分的类类型或者大型数组,复制实参的效率太低,而且某些类类型是无法复制的。