using namespace std;
int fun1(int a)
{
return a;
}
int& fun2(int a)
{
return a;
}
int main(void)
{
int a = 10;
cout << fun1(a) << endl;
cout << fun2(a) << endl;
}
int& fun2(int a)和int fun1(int a)有什么区别啊?
#include <iostream>
using namespace std;
int fun1(int a);
int& fun2(int a);
int main() {
int a = 10;
cout << fun1(a) << endl;
cout << fun2(a) << endl;
}
int fun1(int a) {
return a;
}
int& fun2(int a) {
return a;
}
上述代码可以成功运行,但是会发出警告:
app.cpp: In function 'int& fun2(int)':
app.cpp:13:15: warning: reference to local variable 'a' returned [-Wreturn-local-addr]
int& fun2(int a) {
~~~~^
10
另外,它没有打印出 fun2 的返回值,该函数理应返回某个对象的引用,引用在初始化后不能更改,始终指向同一个变量,且不能为空,而在 fun2 中,该函数返回的是内部变量的引用,该变量的声明周期限制在 fun2 的作用域内,一旦 fun2 返回,其内部变量就会被销毁,这时候返回的引用所引用的是一个不存在的对象。
参考:
在yiyan.baidu.com和https://tongyi.aliyun.com/ 输入“ c++中 int& fun2(int a)和int fun1(int a)有什么区别啊?”
给的解释比较全面。 传值 传地址的差别
可以具体讲一下吗
首先你这个能编译通过?
func2函数中a为临时变量,当func2执行结束后,临时变量a会被销毁,此时你还以引用的方式返回,那不就有问题了吗
至于以int和int& 的区别,可以理解为int&拿到的是变量的地址(可做左值),可以对该内存空间继续做运算(可以参考下string 重载等号运算符的实现),int的话,它就是一个变量,做右值