引用符"&"与函数参数的搭配与应用

  在C++中,可能会遇到这种情况:我想在写一个函数改变在主函数main里面某个变量的值,但在函数里改变的值无法被传入到主函数当中,例如下面这种情况:

 

void func(vector<int> x) {
    x.push_back(1);
    x.push_back(2);
    x.push_back(3);
}

int main() {
    vector<int> a = func(a);
    for (int i = 0; i < a.size(); i++) {
        cout << a[i] << ' ';
    }
    return 0;
}

  我们在这个函数中输入了三个数,但这三个数仅仅是被输入到了形参x里面:

        

  并没有被传送到外面的主函数里面的实参a里面,所以才会什么都没有输出。那么该怎么办呢?这时就要请到我们的引用符&了。引用其实就是这个变量的别名,使用引用的变量及对其操作和对原变量操作的没有区别。例如:

int a = 1;
int& b = a;
b = 2;
printf("a = %d,b = %d",a,b);

  这里int& b的意思就是b是a的引用,所以对b进行操作也会改动a的值。所以第3行中改动b的值为2,那么a的值也会相应的变为2。

  

  所以上面那个函数就可以改动为这样:

void fun(vector<int> &x) {
    x.push_back(1);
    x.push_back(2);
    x.push_back(3);
}

  这段代码的第1行中&x的意思就是x是传入参数的一个引用,当我们调用这个函数并传入一个实参的时候,这个x就会自动变为那个实参的引用。所以在函数里面用x输入值就等于在主函数里面那个实参输入了值。 

  那么当我们比较这两段代码:

#include <cstdio>
#include <vector>
using namespace std;

void func(vector<int> &x) {
    x.push_back(1);
    x.push_back(2);
    x.push_back(3);
}

int main() {
    vector<int> a;
    func(a);
    for (int i = 0; i < a.size(); i++) {
        cout << a[i] << ' ';
    }
    return 0;
} 
#include <cstdio>
#include <vector>
using namespace std;

vector<int> func(vector<int> x) {
    x.push_back(1);
    x.push_back(2);
    x.push_back(3);
    return x;
}

int main() {
    vector<int> a;
    vector<int> b = func(a);
    for (int i = 0; i < b.size(); i++) {
        cout << b[i] << ' ';
    }
    return 0;
} 

  的时候,我们就会发现第1段代码的效率比第2段代码要高。为什么呢?因为第2段代码当中有一个麻烦的语句return x。如果我们在这个函数里面要输入300万个数的话,那么这个return x就会非常的慢,因为他要把300万个数字复制一遍,然后再传给主函数。但第1段代码中用了引用之后,只需要在函数里面改动x的值,那么外面的实参a也会相应改动,不需要传来传去。