一、C++参数传递方式
C++自C语言发展而来,继承了C语言中的函数及按值传递和按指针传递的参数传递方式。但是出于效率与安全的综合考虑,C++引入了引用这个语言特性。而引用被设计主要就是为了作为函数参数,这使得函数运行时的变量成为调用时变量的一个别名。这种参数传递的方式成为引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。
这种参数传递的方式与值传递不同,后者传递的是函数被调用时的变量的值的拷贝;引用传递与指针传递有些类似,但是又不完全相同。
1、值传递
传递的是调用函数时传入变量的一个拷贝。比如一个int数,一个结构体的拷贝。在函数内部对应的变量与调用时传入的变量是两个个体,前者是后者的拷贝。这也就是说,无论在函数内部如何修改按值传递的变量,函数返回时原先的变量不会受到修改。
按值传递的参数传递方式有两个主要的问题:(1)实际传入的参数是调用时参数的拷贝。同样的内容占两份内存,如果变量是基本数据类型那不会占用太大的空间,如果是占用大空间的变量,比如结构体,类对象等,就会造成空间浪费。(2)函数调用返回后对于调用时的参数没有更改,因为是拷贝。但是某些情况下恰恰需要对传入的参数做更改,而且希望更改的变量在调用它的上下文中也生效,比如一个交换两个传入参数值的函数。
2、指针传递
传递的时变量的指针,或者说是这个变量的地址。由于这个函数与被调用的上下文出于同一进程,因此对于指针指向变量的修改会影响到调用函数的上下文。也就是说调用时传入的指针与函数运行时指针指向的是同一个变量,对它的修改也是同步的。
按指针传递也有两个问题:(1)传入参数实际只是一个地址,因此对于指向占大空间的变量时,使用指针传递能节省开销。但是由于传入的是一个地址,因此在使用时需要谨慎,防止因空指针或指针越界导致各种的问题。(2)对于传入指针指向的对象的修改是同步的,因此,可能会对其进行不必要或是意料之外的修改导致未定义的后果。这个问题在使用了const关键字之后得到解决。
3、引用传递
指针传参是传值传参(值为指针指向的地址),是实参传递给形参,两者内存空间不同(指针变量地址),而引用传参传的是同一个对象,可以减少内存消耗。
按引用传递的是同一个对象,因此不存在空指针或指针越界的问题。但是存在对同一个对象预期外的修改,这个问题同样可以通过const关键字来解决。