问题描述
我制作了以下示例,以测试我对引用的理解:
#include <iostream>
int test(){
int a = 1;
int &b = a;
return b;
}
int main(int argc,const char * argv[]) {
std::cout << test() << std::endl;
}
我打算做的是写一个引用变量被销毁的示例。我最初的想法是,由于a
中test
的生命周期在b
中返回test
时结束,因此输出test
的返回值会产生乱码。但是,令我惊讶的是,它实际上确实输出了1!
这怎么可能?我在这里想念的是-a
可以继续生活在b
中吗?
解决方法
该函数不返回对任何对象的引用。它返回一个类型为int的临时对象,该对象已由b引用的值进行了复制初始化。
int test(){
int a = 1;
int &b = a;
return b;
}
实际上,该函数等效于以下函数,而无需使用中间变量
int test(){
return 1;
}
返回引用意味着函数返回类型应为引用类型。像
int & test()
{
int a = 1;
return a;
}
在这种情况下,编译器将发出一条消息,指出函数返回对局部变量的引用。
,我知道你的困惑来自哪里。您认为是因为在分配b时使用(&)运算符,所以变量b现在包含a的内存地址。情况并非如此,“&”号是静音的,这意味着在这种情况下它对变量b没有影响。
int test()
{
int a = 1;
int &b = a;
return b;
}
您期望的行为看起来像这样
int* test()
{
int a = 1;
int *b = nullptr;
b = &a;
return b;
}
在这种情况下,您返回b而不取消引用变量,那么您将获得内存地址而不是数字1。