注册 登录
编程论坛 C++教室

关于函数返回引用的问题

tao12345 发布于 2013-09-01 07:53, 838 次点击
我刚接触C++,但是关于函数反馈一个引用老是不能够理解,函数返回的引用是谁的引用?
例如下面的这个程序,函数f返回了一个引用temp,那么temp是谁的引用?
#include "iostream"

int main()
{int i=5;
 int& f(int);
 int n=f(i);
 std::cout<<n<<std::endl;
    return 0;
}

int& f(int x)
{
    int temp;
    temp=x*x;
    return temp;
}
11 回复
#2
peach54602013-09-01 15:15
未定义行为
#3
tao123452013-09-01 20:38
回复 2楼 peach5460
什么叫未定义行为?
这个程序是能够运行的,我想问的是,这个程序的子函数,返回的是temp值,而根据函数的定义,返回值是一个引用,即temp是个引用,那么temp是谁的引用?
#4
TonyDeng2013-09-01 21:03
知道“引用”是什么概念吗?
#5
peach54602013-09-02 11:13
未定义行为:
在计算机编程中,未定义行为(英语:Undefined behavior)是指行为不可预测的计算机代码。这是一些编程语言的一个特点,最有名的是在C语言中。[1]在这些语言中,为了简化标准,并给予实现一定的灵活性,标准特别地规定某些操作的结果是未定义的,这意味着程序员不能预测会发生什么事。
例如,在C语言中,在任何自动变量被初始化之前使用这个变量会产生未定义的行为,除以零或访问数组定义的界限之外的元素(参见缓冲区溢出)也会产生未定义的行为。在一般情况下,之后的任何行为是不确定的。特别是,标准从来没有要求编译器判断未定义的行为,因此,如果程序调用未定义的行为,可能会成功编译,甚至一开始运行时没有错误,只会在另一个系统上,甚至是在另一个日期运行失败。当一个未定义行为的实例发生时,正如语言标准所说,“什么事情都可能发生”,也许什么都没有发生。

来自维基百科:http://zh.
#6
l9911606192013-09-02 17:36
你引入了第三变量,返回的引用是temp自身的引用
#7
tao123452013-09-02 19:35
回复 5楼 peach5460
谢谢,请教了其他的人,他们给我这样解释的,但是仍有疑问,请再帮我看看行吗?谢谢!

1 temp是子函数定义的一个临时变量,用来存储fun函数计算的结果;
2 实际上,函数在运行的时候,参加运算的参数是放在堆栈中的,(假如说这个运算是一个复杂的函数),每运行一次函数的原型结果会放在栈顶,该结果会成为下一步运算的一个因数,直到函数运行完毕;
3 2中最后一次运行的结果会放在堆栈中,程序会自动设定一个隐藏的临时变量表示,然后再将此临时变量传递给temp,temp实际是临时变量的引用;
4 但temp的结果返回到主函数以后,temp的内存(也即临时变量的栈中的内存)将会被释放,但是如果按照这种解释,下面的程序又解释不了?

#include "iostream"

int main()
{   int n=2;
    int f(int);
    f(n);
    std::cout<<f(n)<<std::endl;
    return 0;

}

int f(int i)
{
    int temp;
    temp=i*i;
    std::cout<<&temp<<std::endl;
    return temp;
}

运行结果为:
0012FF20
0012FF1C
4
#8
tao123452013-09-02 19:41
回复 4楼 TonyDeng
高手,那你帮忙看一下下面的程序的运行结果为什么这么奇怪?我要输出temp的地址值,但是为什么输出了两个地址值?请问是为什么?

#include "iostream"

int main()
{   int n=2;
    int f(int);
    f(n);
    std::cout<<f(n)<<std::endl;
    return 0;

}

int f(int i)
{
    int temp;
    temp=i*i;
    std::cout<<&temp<<std::endl;
    return temp;
}

运行结果为:
0012FF20
0012FF1C
4
#9
TonyDeng2013-09-02 19:51
1.你得到的解释是对的;
2.之所以输出了两个地址值,是因为你调用了2次f()函数。

程序代码:

#include "iostream"

int main()
{   int n=2;
    int f(int);
    f(n);                            // 第1次调用
    std::cout<<f(n)<<std::endl;      // 第2次调用
    return 0;

}

int f(int i)
{
    int temp;
    temp=i*i;
    std::cout<<&temp<<std::endl;
    return temp;
}


[ 本帖最后由 TonyDeng 于 2013-9-2 19:57 编辑 ]
#10
TonyDeng2013-09-02 20:12
两次地址不同,是很正常的,不要幻想函数中的局部变量总在同样的地址上储存,那其实是随机的,也不由程序自己控制。系统只保管住你在函数中声明为static型的变量的空间,所有auto型的变量空间都会随着函数的终结而释放并被重新分配,每次运行在同样地址上的几率几乎为零。比如你上面的代码连续两次调用f(n),即把那行重复一次,就看到两个相同的地址值,但只要两行的代码不完全相同,有其他副行为,都难以得到这种机会。写程序不要把效果寄托在这种假定上,也不需要过分关心这些东西,无益的。
#11
TonyDeng2013-09-02 20:33
只有本站会员才能查看附件,请 登录
#12
peach54602013-09-03 06:18
T版已经解释得很详细了。我就不班门弄斧了。
1