在平时编程过程中,参数传递基本是必须的,根据具体的需求传递参数的方式以及参数的类型都会有很大的不同。在什么环境选择合适的参数传递方式和类型是至关重要的。
首先传递普通的类型,int char float double等,传递过程中可以直接传递这些类型,也可以传递这些类型的指针以及引用。
需要注意说明的是在传递类型的时候,也就是形参是类型而非指针或者引用,函数调用的时候对形参进行传递值的时候其实是对实参的一种copy,最终的结果不会印象实参的值。而且这种copy将耗费内存空间和时间的占用。所以有些时候要仔细思量一下具体的需求进行选择。然后说传递指针,指针对应的就是地址,对指针的操作就是对相应地址的操作,也就是相应内存块的操作,操作结果会影响指针所指向的地址的内容。最后说说引用,之前一直都在强调引用是变量的一个别名,对引用的操作就是对相应变量的操作。一开始这个概念还不是很清晰,现在可以这么说,引用就是对相应变量的一种捆绑,引用作为参数的时候,其实就是对变量的操作,最终也会影响变量的值。要注意这里虽然也会改变变量的值,但其机制跟指针完全不一样的。
还有需要说下const形参,其实const最应该注意的是,也是最大的特点const形参可以保证让函数不改变此参数的值,如果跟引用共用的话,就可以保证一些实参变量的值不被改变,这样就起到一定的保护作用。
数组形参,数组作为参数比较特殊,首先应该明确数组不能复制,所以无法编写使用数组类型形参的函数。而有因为数组会被自动转换为指针,通常通过处理指向数组中元素的指针来处理数组。
void printValues(int *)
void printValues(int[])
void printValues(int [10])
这三种定义都是数组指针,最后的有数组成员的定义,但这些是没有意义的,调用的时候都是直接当作指针来处理的。而且在进行调用的时候,会自动赋值指针的值,然后再进行操作。其实这个时候是没有必要的,可以考虑指针的引用来处理。
也可以直接把数组的引用当作形参void printValues(int (&arr) [10]),这个时候数组的大小就有实际意义了,参数进行传递的时候应该传递相应大小的数组。这个形式中,最应该注意的是引用外面的()这个是必须的,应为下表操作拥有更高的优先级。
容器作为形参时,从避免赋值容器的角度出发,应考虑将形参声明为引用类型。但事实上,C++程序员倾向于通过传递指向容器中需要处理的元素的迭代器来传递容器。