我对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 ++会将我返回的引用更改为非引用变量吗?
答案 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}的引用 }。这意味着x
与result1
不同,而x
和result2
指的是相同的基础数据。
与以下内容确实没有什么不同
x
此时,int a = 42;
int b = a;
int &c = a;
是一个独立副本,如果更改,则不会影响其他两个变量。但是,由于b
和a
引用相同的基础数据,因此更改其中一个会影响另一个。
答案 1 :(得分:4)
基本上与
相同std::vector<float> x(10000);
std::vector<float> & result2 = x;
std::vector<float> result1 = result2;
由于result2
是x
的引用,因此该语言允许使用,result2
的每次提及都与x
相同。您可能会看到引用是别名,result2
是x
的别名。
答案 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;
...编译器将取消对rx
和ry
的引用,以获取x
和y
的值。然后将它们相加,并将结果分配给z
。
引用是某些对象的别名。在大多数情况下(基本上是初始化另一个引用除外),在表达式中使用引用会使用引用所引用的对象,而不是引用本身。