假设在C ++中具有以下功能:
#include <iostream>
int& change(int& a){
a = 6;
return a;
}
int main(){
int a = 5;
int b = change(a);
std::cout << b << std::endl;
return 0;
}
运行此命令将返回:
6
我的问题是,如果我将返回类型从int&
更改为int
,编译器将不会抱怨,并且仍将显示6。那么在C ++中如何重新调整引用? (与在C中返回指针进行比较)
答案 0 :(得分:2)
像指针一样,引用是通过存储对象的地址来实现的。
按值返回意味着它正在返回旧对象的副本。
按引用返回意味着它正在返回旧对象的地址。
#include <iostream>
int& change_ref(int& a) {
a = 6;
return a;
}
int change_value(int& a) {
a = 6;
return a;
}
int main() {
int a = 5;
change_ref(a) = 7;
// change_value(a) = 7; compile error
std::cout << a << std::endl;
int& a1 = change_ref(a); // return reference of a
// now a1 ref the a
a1 = 10;
// print a = 10 and a1 = 10
std::cout << a << " " << a1 << std::endl;
int a2 = change_value(a); // return a value of a, so return is 6
// value of a is 6 and define a new value a2
a2 = 11;
// set a2 to 11 and not change a
// print a = 6, a1=6, a2= 11
std::cout << a << " " << a1 << " " << a2 << std::endl;
return 0;
}
答案 1 :(得分:1)
您正在通过引用调用函数change()
,然后将a
的实际值更新为6。由于a
的值已更新为6,因此无论返回类型{{ 1}}将携带更新后的值,并在给定的示例中始终打印a
。
注意:声明的6
数据为b
,因此您没有打印任何参考。
答案 2 :(得分:1)
只要它不是本地声明的变量(可以从堆栈中删除),就可以通过引用返回。通过引用返回仅表示它不返回对象的副本,而是实际对象。