
返回值是什么意思?在什么情况下需要加返回值?
返回值就是子程序或者函数执行结束后返回给主程序或者调用函数的函数的值。
比如
int max(int x,int y){
if(x>y) return x;
else return y;
}
返回x,y中较大的值。
如果在其他处调用,例如
int a = max(1,2);
max返回的值赋给了a,此时a=2。
/*************************************************************************************************
一个函数的函数名既是该函数的代表,也是一个变量。由于函数名变量通常用来把函数的处理结果数据带回给调用函数,即递归调用,所以一般把函数名变量称为返回值。
函数可以有返回值,也可以没有返回值。对于没有返回值的函数,功能只是完成一个操作,应将返回值类型定义为void,函数体内可以没有return语句,当需要在程序指定位置退出时,可以在该处放置一个。
函数可以有返回值,只要 return 就可以给出一个。不过我们常常不用它--有两个原因:
1、C/C++里返回值是复制出去的,而对于大的对象,复制的代价很高;
2、有些对象是不能复制的--至少编译器不知道怎么复制--比如数组。
于是我们有了很多这样的函数:
bool GetObj(ObjType& obj);
bool Encode(const char* src, char* dest);
用一个参数来代替返回值,而返回值只是指示函数执行是否成功。我本人一直固执的认为,这是C的处理方式,C++不该这样,返回就是返回,就该光明正大的返回,而不是在文档里为某个参数悄悄的注上: // out
诚然返回一个大对象是困难的,但这个困难是 C 程序员的,而不是 C++ 程序员的 -- 我们可以返回指针。C也有指针,但很少有人敢在 C 函数里返回一个指针,因为:
1、如果指针指向栈变量,毫无疑问,要么你不用这个返回值,要么是一个错误;
2、如果指针指向堆变量,要么你在祈祷用这个函数的程序员会好好的看文档且足够细心会调用 free,要么就是内存泄漏;
3、如果指针指向 static 变量,那么用这个函数的程序员牢牢记住“下次调用这个函数以后,上次的返回值也会跟着变”,要么就是你被别人骂成“专出 BUG 的垃圾”。
在C++里直接返回裸指针的话,情况并不会有什么起色,不过 C++ 有智能指针的,通常它们指向堆变量,占用的空间和裸指针一样大。
考虑前面第一个函数,我们写成:
std::auto_ptr<ObjType> GetObj();
那么一切迎刃而解,返回值如果你不要,作为临时变量,会立即被析构,返回的对象被释放;如果你要,就得赋值给另一个智能指针。总之不用程序员记得,编译器会保证这个对象的释放。
考虑第二个函数,稍微有一点麻烦,因为 auto_ptr 是不能用来持有数组的,不过,在C++的世界里,std::string 几乎总是比 char* 好用:
std::auto_ptr<std::string> Encode(const char* src);
********************************************************************************************************************/
谢谢啦