C/C++中传参方式可分三种:值传递(传副本)、指针传递(传地址)、引用传递(传别名)。
(1)值传递:其实是一种赋值操作,实参传递给形参时会产生额外的副本,形参只是实参的拷贝,所以函数内对形参的操作不会更新到源实参。在函数结束时,形参作为局部变量会被释放,对实参不会产生任何影响。若为类的对象会调用拷贝构造,这种深拷贝操作会影响到传参效率。(可理解为“单向接口”)
(2) 指针传递:因为传递的是实参的地址,指针指向的内存中同一个对象,所以函数内部对形参得操作会“同步更新”到实参。(可理解为“双向接口”)
(3)引用传递(C++特有):传递的是实参的别名,传参时形参被绑定到实参对象上,因此函数内部对形参的操作也都会“同步更新”到源实参。(可理解为“双向接口”)
注:关于指针传递和引用传递,形参改变对实参的改变是一种副作用,我们利用这种副作用可以方便修改传递的实参,另外,这种方式避免了值传递中的拷贝,对于大数据的实参可以有效提升效率。因此,对于想提升传参效率又不想影响实参的情况,可以使用const:
bool isShorter(const string &s1,const string &s2)//const修饰指针传参会有同样的效果
{
return s1.size() }//这也是为何在我们不想不修改实参时尽量使用const引用(指针)而不是值传递的原因。