return是如何将值返回给主调函数的
我们知道,被调函数运行结束后才会返回主调函数,但是被调函数运行结束后系统为被调函数中的局部变量分配的内存空间就会被释放。也就是说,return 返回的那个值在被调函数运行一结束就被释放掉了,那么它是怎么返回给主调函数的呢?
事实上在执行 return 语句时系统是在内部自动创建了一个临时变量,然后将 return 要返回的那个值赋给这个临时变量。所以当被调函数运行结束后 return 后面的返回值真的就被释放掉了,最后是通过这个临时变量将值返回给主调函数的。而且定义函数时指定的返回值类型实际上指定的就是这个临时变量的类型。这些都是系统自动完成的,了解即可。
这也是为什么当 return 语句中表达式的类型和函数返回值类型不一致时,将 return 的类型转换成函数返回值类型的原因。return 语句实际上就是将其后的值赋给临时变量,所以它要以临时变量的类型为准,即函数返回值的类型。
可以看出,临时变量的生命周期比被调用的函数中想返回的局部变量的生命周期长。
return -1这种形式,应该也是将-1送入了临时变量。
return的返回值示例:
man1与man2是栈区的局部变量,是会随着函数的结束而消亡的。故采用了临时变量(临时匿名对象调用拷贝构造函数)。
thow
1.throw 普通类型,和函数返回传值是一样的。
抛出异常后,程序中断,类似函数返回(两者返回的地方有所区别),即结束了。这时会和return一样,有临时变量接收数据。
2.throw 字符串常量型。
例子:throw " hello,world!" " hello,world!"是字符串常量,存在文字常量区,生命周期是直到程序结束。这时候临时变量接收数据是此字符串常量的地址(char *)。
catch()时候只能匹配char*型,不能匹配string型。即(catch(char* error))
3.throw 类类型:最佳方式是使用引用类型捕捉,抛出匿名对象(相当于直接初始化临时匿名对象)。
运行结果:
匿名对象(id=0,最后析构)在临时变量中
若如此改写:
运行结果:
启发:匿名对象的生存周期长于局部变量error,抛出类类型时,我们用引用类型来接较好。
运行:
最好的写法:在上面引用的基础上,抛出时,直接创建一个匿名对象抛出
运行:
补充:如果抛出的是动态分配的对象,抛出的其实是一个指针,一定要用指针来抓取。
例子:throw new ErrorException() ; //生命周期看何时delete
引用类型和普通变量类型在抓取语句处同时出现是错误的。不能区分用哪个去接,即两者不能共存。
匿名对象此篇中是指没有名字的对象。
标签:return,变量,临时,函数调用,返回值,throw,函数 From: https://www.cnblogs.com/ylww/p/16799446.html