c++ 引用
引用最大的价值是避免复制
#include <iostream> using namespace std; void method2(int& param) { param = param + 1; cout << "method2 inner:" << param << endl; //method2 inner:2 } void method1(int param) { param = param + 1; cout << "method1 inner:" << param << endl; //method1 inner:2 } int main() { int a { 1 }; method1(a); cout << "main:" << a << endl; //main:1 method2(a); cout << "main:" << a << endl; //main:2 char c = getchar(); return 0; }
即使你无意更改 a 的值,这样传递参数也是不妥的,因为变量从 a 复制到 param 是有开销的,这个开销在上面的例子中并不明显,因为仅仅复制了一个整型变量,假设我们要传递一个大对象或者大数组,这个开销就不容小觑了,不仅仅是复制数据导致的 CPU 开销,还有同时保存两份同样的数据导致的内存开销。
如果你既不想产生复制开销,又不想让 method2 操作 main 的变量,那么你可以使用常量引用,如下代码所示:
void method2(const int& param){ //注意const关键字 //...... }
值得注意的是,使用常量引用参数时,是可以向方法传递临时值的:method2(9)
,非常量引用参数是不能传递临时值的。
使用引用参数可以避免调用方法时的复制开销,如果方法的返回值是一个大对象呢,会不会也有复制开销呢?到目前为止,只要知道绝大多数 C++ 编译器都会帮我们完成此类优化工作,不用担心返回值的复制开销问题即可。
还有一种情况也能体现出引用的价值:在循环中使用引用变量。如下代码所示:
#include <iostream> using namespace std; int main() { int arr[]{ 9,8,7,6,5,4,3,2,1,0 }; for (int& val : arr) { cout << val << endl; } auto c = getchar(); }
上面代码中,我们在 for 循环中使用了引用变量 val,如果这里不使用引用变量的话也会产生复制开销。