说到形参与实参,在C++出来之前其实很简单,就一句话:形参的改变不影响实参。这个状态直到C++有了“引用传递”才有改变。
要弄清这个,首先得弄清形参与实参是什么东西。因为函数是一段“可以重用而不必重写”的代码,每次重用当然未必完全相同(不可否认有些函数每次重用都完全相同),那么不同在哪里呢?又怎样产生不同呢?一种方法是依靠随机,随机是个好东西,不要说客户了,连程序员都无法控制每次调用的结果。第二种方法是凭客观条件(比如运行时间、机器配置)。但是这些函数应用很窄,类似于“y=Sin(x)”这样的函数就绝不能这样做。
那么,从“y=sin(x)”的形式看来,能决定函数怎样运行的唯一因素就是x的值了。函数的某次运行是受某一个x值的影响并控制的,而下一次运行,则会受另一个x值的影响。那么,调用函数者就有必要告诉函数:我要用哪个值来控制你,而函数自己则有必要保存这个值,直到函数结束。
为此,在函数内部建立一个临时的、局部的变量,该变量的作用域就是函数内部,该变量的作用时间就是从函数开始执行到结束执行。如果同一函数在同一时间有几个副本在执行(这种情况在多线程程序中会出现),那么它们是互不相干的,它们内部的变量也是互不相干的。这个变量就叫做“形参”,全称形式参数。
“形式”是跟“实际”相对的,另一个参数就是实际参数,叫“实参”,在调用函数时,这个值将决定函数内部的形参的值。实参在函数中是否可见?这要取决于两个因素:一是实参的作用域,二是有没有被形参覆盖。先说第一个因素,如果只谈C语言,那么所谓的作用域就是全局与局部两种,但是C++中还有“类作用域”这一概念,由此第一个因素变得复杂了。第二个因素本身并不复杂,但是如果没有引起程序员的注意,那么造成的问题是很难发现的。试看下以下程序:
int a;//全局变量
int ttt(int a)//该函数的形参也叫a
{
cout << ++a << endl;
return a;
}
int main()
{
a = 3;
cout << a << endl;
cout<< ttt(a) << endl;
cout << a << endl;
return 0;
}
该程序中有一个全局的a变量,但是在ttt()函数中却被另一个a覆盖了,所以,++a没有影响到全局的a,如果把函数定义改为“int ttt(int b)”则有不同的结果。
以上把“形参”和“实参”提了这么多,主要目的还是讲清“形参的改变不影响实参”这句话。字数不少了,留到下篇文章再续吧。(我觉得我写得不像读书笔记,倒像是教材了。呵呵)
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!

沣水攸同
未填
34381089
未填
时间:2010-02-03 09:55:59