一级棒(Eachfun)
一级棒 - 读书笔记 - C++ Primer - 函数的非引用返回值
RSS订阅
函数的非引用返回值
发表时间:2006-07-29 22:43:57 关键词:C++,MFC,VC,Primer,编程,教程,读书

  函数最多可以返回一个值,也可以不返回任何值(也有“返回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++到来以后,函数的返回值类型可以是类类型。而类对象的构造、复制与销毁可能很复杂、很占用系统资源。于是“引用传递”再一次发挥了它的威力。

本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
发表评论
称呼:
QQ:
邮箱:
链接:
内容:
搜索: 百度搜索 Google搜索
Copyright©2000 - 2008 Eachfun.Com, All Rights Reserved 一级棒网络
苏ICP备05080156号
一级棒建站系统 http://www.eachfun.com 一级棒版权所有,未经许可不得商用!