对函数的C ++返回引用的困惑

时间:2018-07-31 01:53:13

标签: c++ pointers

我对C ++中的引用一直感到困惑,因此我对以下函数进行了一些实验

std::vector<float> & fun(std::vector<float> & x) {
    return x;
}

然后我使用以下两种方式调用该函数:

std::vector<float> x(10000);
std::vector<float> result1 = fun(x);
std::vector<float> & result2 = fun(x);

现在变量result2确实是x的引用,但result1似乎是x的副本而不是引用。所以我很困惑:

为什么我可以将非引用变量声明为返回引用的函数的返回值?

由于我对result1的声明不是引用,C ++会将我返回的引用更改为非引用变量吗?

3 个答案:

答案 0 :(得分:6)

由于fun(x)仅接受对x的引用并将其返回,因此您的代码(左侧)与右侧的代码等效:

a std::vector<float> x(10000);          a std::vector<float> x(10000);

std::vector<float> result1 = fun(x);    std::vector<float> result1 = x;
std::vector<float> &result2 = fun(x);   std::vector<float> &result2 = x;

换句话说,result1成为x副本,而result2成为对{{1}的引用 }。这意味着xresult1不同,而xresult2指的是相同的基础数据。

与以下内容确实没有什么不同

x

此时,int a = 42; int b = a; int &c = a; 是一个独立副本,如果更改,则不会影响其他两个变量。但是,由于ba引用相同的基础数据,因此更改其中一个会影响另一个。

答案 1 :(得分:4)

基本上与

相同
std::vector<float> x(10000);
std::vector<float> & result2 = x;
std::vector<float> result1 = result2;

由于result2x的引用,因此该语言允许使用,result2的每次提及都与x相同。您可能会看到引用是别名result2x别名

答案 2 :(得分:1)

没有真正的更改

发生的事情是引用引用了某物,并且当您在表达式中使用引用时,您(通常)会得到它引用的内容。所以,如果我有类似的东西:

int x = 1;
int &rx = x;

std::cout << rx;

要打印出的是x的值-引用被取消引用以获取值,这就是要打印出的内容。同样,如果我有类似的内容:

int x = 1;
int y = 2;
int rx = x;
int ry = y;
int z = rx + ry;

...编译器将取消对rxry的引用,以获取xy的值。然后将它们相加,并将结果分配给z

摘要

引用是某些对象的别名。在大多数情况下(基本上是初始化另一个引用除外),在表达式中使用引用会使用引用所引用的对象,而不是引用本身。