首页 新闻 会员 周边

c++函数的返回到底是什么?

0
悬赏园豆:50 [待解决问题]

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  调用这个函数的函数到底怎么拿到了结果?
北京开发的主页 北京开发 | 初学一级 | 园豆:152
提问于:2021-09-30 15:43
< >
分享
所有回答(3)
0

返回的就是结果

后端小知识 | 园豆:204 (菜鸟二级) | 2021-10-01 00:37
0

正因为变量会被清除,所以在调用函数的时候一般要在main里用一个变量接着
比如说:
int add(int a, int b)
{
return a + b;
}
int main()
{
int a, b;
int c = add(a, b);
}
这时候add()函数的返回值会被赋值给c。
同样,如果是返回对象的函数就可以拿对象在调用处接着,相应的数据成员都会赋值。

还有一种方法传递值,就是将值赋给全局变量或者直接对全局变量进行操作。
所以就会有void这种无返回类型。

牧码少年 | 园豆:202 (菜鸟二级) | 2021-10-02 15:50
0

变量被释放后返回值还在,汇编中一般是赋值给eax寄存器的,return的时候在赋值给调用的变量
例如sum=add(a,b)
就是把eax的内容给到sum中去,完成复制

计算机知识杂谈 | 园豆:470 (菜鸟二级) | 2021-10-02 17:34

再说第二问。retc应该是在栈中的,所有局部变量都存储在栈中,甚至包括返回地址等信息也保存在栈中,才能实现递归。
类的返回应该也是返回整个类,保存在某个区域内

支持(0) 反对(0) 计算机知识杂谈 | 园豆:470 (菜鸟二级) | 2021-10-02 17:36

有机会你自己可以尝试反汇编来看看结果

支持(0) 反对(0) 计算机知识杂谈 | 园豆:470 (菜鸟二级) | 2021-10-02 19:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册