一、.非引用形参: 通过复制对应的实参实现初始化。当用实参副本初始化形参时,函数并没有访问调用所传递的实参本身,因此不会修改实参的值。
1.指针形参:此时复制实参指针。与其他非引用类型的形参一样,该类形参的任何改变也仅作用于局部副本。如果函数将新指针赋给形参,主调函数使用的实参指针的值没有改变。如果函数的形参是非const类型的指针,则函数可通过指针实现赋值,修改指针所指向对象的值。
2.const形参
在C语言中,具有const形参或非const形参的函数并无区别,C++为了对C兼用,也保留了这一作法。
3.复制实参的局限性(不适宜情况)
1)当需要在函数中修改实参的值
2)当需要以大型对象作为实参传递时。对实际的应用而言,复制所付出的时间在位空间代价太大;
3)当没有办法实现对象复制
对于上述几情况,有效解决方法是将形参定义为引用或指针类型。
二、引用形参
1定义引用时,必须用与该引用绑定的对象初始化该引用。引用形参完全以相同的方式工作。每次调用函数,引用形参被创建并与相应实参关联,而并非这些对象的副本。
2.使用引用形参返回额外的信息
函数只能返回单个值,但有些时候,函数有不止一个的内容需要返回,可用引用形参的方式。
3.利用const引用避免复制
如果使用引用形参的唯一目的是避免复制实参,则应将形参定义为const引用。普通的非const引用形参在使用时不太灵活。这样的形参既不能用const对象初始化,也不能用字面值或产生右值的表达式实参初始化,只能与完全同类型的非const对象关联。
1.指针形参:此时复制实参指针。与其他非引用类型的形参一样,该类形参的任何改变也仅作用于局部副本。如果函数将新指针赋给形参,主调函数使用的实参指针的值没有改变。如果函数的形参是非const类型的指针,则函数可通过指针实现赋值,修改指针所指向对象的值。
2.const形参
在C语言中,具有const形参或非const形参的函数并无区别,C++为了对C兼用,也保留了这一作法。
3.复制实参的局限性(不适宜情况)
1)当需要在函数中修改实参的值
2)当需要以大型对象作为实参传递时。对实际的应用而言,复制所付出的时间在位空间代价太大;
3)当没有办法实现对象复制
对于上述几情况,有效解决方法是将形参定义为引用或指针类型。
二、引用形参
1定义引用时,必须用与该引用绑定的对象初始化该引用。引用形参完全以相同的方式工作。每次调用函数,引用形参被创建并与相应实参关联,而并非这些对象的副本。
2.使用引用形参返回额外的信息
函数只能返回单个值,但有些时候,函数有不止一个的内容需要返回,可用引用形参的方式。
3.利用const引用避免复制
如果使用引用形参的唯一目的是避免复制实参,则应将形参定义为const引用。普通的非const引用形参在使用时不太灵活。这样的形参既不能用const对象初始化,也不能用字面值或产生右值的表达式实参初始化,只能与完全同类型的非const对象关联。