函数最多可以返回一个值,也可以不返回任何值(也有“返回void”的说法)。之所以最多只能返回一个值,因为只有这样才能在表达式中使用。比如“y=Sin(x);”,如果Sin函数返回多个值,这个表达式就失去了意义。之于为什么可以不返回任何值,经历过BASIC的人应该更能理解。因为BASIC中把有返回值的程序段叫函数,没有返回值的程序段则叫做“子程序”。很显然,“子程序”就是完成一个特定的功能后结束的程序段。
函数的返回值没有类型限制,可以是内置类型变量,也可以是类对象。无论是内置类型还是类对象,都有着一样的规律。但是,这些规律在C++到来之前很少有人去理会,毕竟内置变量类型太复通,以至于程序员根本不去考虑那么多“为什么”。
在C时代,所有的返回值都是局部变量。如下列程序:
//程序一:
int Max(int i, int j)
{
return i>j ? i : j;
}
//程序二:
char *StrCpy(char *Target, const char *Source)
{
char *Temp=Target;
while(*Source)
{
*Temp++ = *Source++;
}
return Target;
}
程序二给人一个错觉:认为该函数返回的不是函数内部的局部变量。错误原因在于没有理解指针的本质。其实程序二和程序一一样,返回值是形参之一。而形参就是作用域为函数内部的局部变量。
理解了“返回值是局部变量”还不够。因为还有一个很重要的概念没弄清。比如:
int a, b, c;
char d[10], e[10], *f;
//其它语句
c = Max(a, b);//语句一
f = StrCpy(d, e);//语句二
以上注释的两行语句都有同一个问题:如果返回的变量作用域仅限于函数内部,那么函数结束以后该变量就已经不存在了,那么给c和f赋值的是什么?
C和C++有一个机制保证以上赋值正常进行:在函数结束前,先将要返回的局部变量临时拷贝一份到栈内存(这个内存程序员无须知道,也无法知道)。然后将局部变量销毁,函数正常结束。接下来用栈中的临时变量对目标变量进行赋值,赋值结束后再把临时变量销毁。
以上这个过程凭空多出一次变量构造、复制与销毁过程,好在对于内置类型变量来说,这样的过程所需的性能赋出并不太多。但是C++到来以后,函数的返回值类型可以是类类型。而类对象的构造、复制与销毁可能很复杂、很占用系统资源。于是“引用传递”再一次发挥了它的威力。
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
