1. 背景
函数返回值就是使用return
语句终止正在执行的函数,看是很简单的问题有什么说的呢?因为越是简单的问题里面越是有一些不易发现的坑。
比如在循环中使用return语句:
bool findChar(const string &str, const char c){
auto size = str.size();
for(decltype(size) i = 0; i < size; i++){
if(str[i] == c){
return true;
}
}
}
看是有return语句,但是只有循环中满足特定条件才能正常返回,如果找不到的话实际上是没有返回值。编译器可能能检测出这个错误,也可能检测不出来,要看编译器的实现,好在大部分情况编译器甚至IDE可以帮我们检测出来,但是如果不幸我们用了检测不出来的编译器,可能会在运行时发生未定义行为错误。
2. 理解值是如何被返回的
类似于形参被初始化,函数返回一个值也是类似于变量初始化。最终是返回的值初始化调用点的一个临时量,这个临时量就是函数调用的结果。
如果函数返回的是局部变量,则返回值将被拷贝到调用点。
如果函数返回的是引用,因为引用只是它所引对象的别名,则不会将所引用的值拷贝到调用点。
那么问题来了,如果返回的引用引用了局部变量会发生什么?
答案是会发生错误,因为返回了未定义的值。
因为在方法体内,函数执行完成意味着局部变量存储的空间会被释放,局部变量的引用指向了非法内存区域
标签:返回,return,函数,C++,编译器,引用,返回值,Android,size From: https://blog.csdn.net/sjw890821sjw/article/details/140577297