个人认为C++函数传参的一个指导性原则是:若函数的形参是非引用类型,传参时实际上是使用复制实参的值给形参,是实参值的副本,而非真正的实参;若函数的形参是引用类型的,则传递的其实就是实参本身,形参只不过是实参本身的别名而已。
1.非引用类型的形参(牢记关键词——复制实参的副本)
永远不要忘记传递进来的是实参的副本,与实参本身并无“太多直接”关系。
在使用非引用类型形参的时候,如果不需要对实参本身做修改,则直接传递即可。此时const形参,非const形参的值初始化问题五特殊要求,它们只是想用实参的副本值来初始化自己,并无特殊要求。
如果需要对实参本身进行操作或者修改,应该使用指针进行传递。形参复制的是指针的地址,通过修改指针所指地址存储的值来改变实参。
复制实参的局限性:
1)当要传递的实参是很大的对象时,复制对象所有的元素的代价太大;
2)没有办法对要传递的对象进行复制时,如要传递的是数组,而数组不能直接进行复制。
2.引用类型的形参(牢记关键词——实参的别名)
使用引用类型的形参要牢记,此时传递的参数与实参有着直接的关系。
如果使用引用类型的实参的唯一目的是为了避免大量的复制实参,而不对实参做修改,最好使用的形参类型为const 类型名&。
当子使用引用类型的形参时,要注意const在其中的影响。如果传递的实参本来是有const特性的,则不能使用非const类型的形参,这样有违const对象的使用规则。总结一下可以归纳为一下两点:
1)当函数的形参类型是const类型时,可以通过const类型的实参调用函数,也可以用非const类型的实参调用函数。
2)当函数的形参类型是非const类型时,只能用非const类型的实参调用函数。
综上两点可以看出,在不需要修改实参的情况下,函数的形参类型声明为const类型时,初始化的限制条件会相对放松些。所以有一种情况应当引起重视,就是应该吧不需要修改的应用形参定义为const引用。因为普通的非const应用会限制函数的应用,比如,这样的形参不能用const对象初始化,不能用字面值或产生右值的表达式初始化。