6.4.3 值传递

    很多C++教科书在讲述函数值传递调用时都会举下面这个例子,见代码6.6。

    代码6.6 传值调用CallByValue


    <—————————————文件名:example606.cpp——————————————> 01 #include<iostream> 02 using namespace std; 03 int main() 04 { 05 void change(int,int);//函数声明 06 int x=2,y=3; 07 cout<<"交换前:x="<<x<<",y="<<y<<endl; 08 change(x,y);//传值调用 09 cout<<"交换后:x="<<x<<",y="<<y<<endl; 10 return 0; 11 } 12 void change(int n,int m)//函数定义 13 { 14 int temp; 15 temp=n; 16 n=m; 17 m=temp; 18 }

    输出结果如下所示。


    交换前:x=2,y=3 交换后:x=2,y=3

    【代码解析】函数change()并没有像我们预想的那样将x和y的值进行调换,这是为什么呢?这是因为代码第8行的change()函数采用的是传值调用,只有在调用change()函数时,编译器才会为其中的形式参数m和n以及变量temp分配内存区域,并用实参x和y对形参n和m赋值,change()函数中进行的数值交换是对n和m进行的操作,并不会影响main()函数中的x和y。而且,m、n及temp在change()函数执行完毕后便会被撤销,所占的内存区域被收回。调用函数和被调用函数发生的唯一数据关联就是由实参向形参赋值,此后,被调函数中的变量(含形参)与调用函数中的变量便各有各的内存空间,互不干涉,即使变量名相同,也会被编译器认为是不同的变量。

    换句话说,被调函数中执行的任何操作都只作用在被调函数内的变量上,而不作用在调用函数的变量上,通过传值调用时被调函数无法改变调用函数中的变量值。

    那有没有可能被调函数改变了调用函数中的变量值呢?答案是肯定的,请看随后的内容。