1、一个c++函数比如
int sum(int i1, int i2)
{
int s;
s = i1 + i2;
return s;
}
在这个函数里返回的s,到底是返回的s的值呢?还是返回的s这个地址空间呢?因为s是函数的自动变量,函数结束了,s变量就自动从栈里消失了。那么调用这个函数的其它函数是拿不到s这个变量的,那么调用函数是怎么拿到s的值的呢?
2、假设 c 是一个类,看下面的函数,这个函数返回的到底是什么呢?
class c {
int a, b, sum;
c(int, int);
int add();
int sub();
}
c calculate(int i1, int i2)
{
c retc(i1, i2);
retc.add();
return retc;
}
函数calculate的返回值应该是一个类,但是retc这个实例的范围应该是在这个函数里,离开这个函数就应该消失了。有如下几个问题:
A、retc这个类的实例到底是在哪里(堆里?栈里?代码段里?还是哪里?)?
B、return retc 这个句子到底做了什么?
B.1 是返回了整个retc实例吗?
B.2 是返回了retc中三个数据 a b sum吗?包含实例的代码吗?
B.3 调用这个函数的函数到底怎么拿到了结果?
返回的就是结果
正因为变量会被清除,所以在调用函数的时候一般要在main里用一个变量接着
比如说:
int add(int a, int b)
{
return a + b;
}
int main()
{
int a, b;
int c = add(a, b);
}
这时候add()函数的返回值会被赋值给c。
同样,如果是返回对象的函数就可以拿对象在调用处接着,相应的数据成员都会赋值。
还有一种方法传递值,就是将值赋给全局变量或者直接对全局变量进行操作。
所以就会有void这种无返回类型。
变量被释放后返回值还在,汇编中一般是赋值给eax寄存器的,return的时候在赋值给调用的变量
例如sum=add(a,b)
就是把eax的内容给到sum中去,完成复制
再说第二问。retc应该是在栈中的,所有局部变量都存储在栈中,甚至包括返回地址等信息也保存在栈中,才能实现递归。
类的返回应该也是返回整个类,保存在某个区域内
有机会你自己可以尝试反汇编来看看结果