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,如果这里不使用引用变量的话也会产生复制开销。

 

posted @ 2023-09-21 13:02  AngDH  阅读(6)  评论(0编辑  收藏  举报