OOP_由C到C++ (8)

运行结果:

a=5 b=10 a=10 b=5 例1.18 采用“引用参数”传递函数参数 #include <iostream.h> void swap(int& m, int& n) { int temp; temp=m; m=n; n=temp; } main() { int a=5, b=10; cout<<"a="<<a<<" b="<<b<<endl; swap(a, b); cout<<"a="<<a<<" b="<<b<<endl; return 0; }

运行结果:

a=5 b=10 a=10 b=5 (4) 用引用返回函数值

函数可以返回一个引用,将函数说明为返回一个引用的主要目的是:为了将函数用在赋值运算符的左边。

要以引用返回函数值,则函数定义时要按以下格式:

类型标识符 &函数名(形参列表及类型说明)
{函数体}

说明

以引用返回函数值,定义函数时需要在函数名前加&

用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。

例1.19 返回引用的函数 #include <iostream.h> int a[]={1, 3, 5, 7, 9}; int& index(int); // 声明返回引用的函数 void main() { cout<<index(2)<<endl; index(2)=25; // 将a[2]重新赋值为25 cout<<index(2)<<endl; } int& index(int i) { return a[i]; } 例1.20 用引用返回函数的值 #include<iostream.h> int A[10]; int& array(int i); void main() { int i, number; A[0]=0; A[1]=1; cin>>number; for (i=2;i<number;i++) { array(i)=array(i-2)+array(i-1); cout<<"array("<<i<<")="<<array(i)<<endl; } } int& array(int i) { return A[i]; }

运行结果:

array(2)=1 array(3)=2 array(4)=3 array(5)=5 array(6)=8 array(7)=13 array(8)=21 array(9)=34

在定义返回引用的函数时,注意不要返回该函数内的自动变量 (局部变量)的引用,由于自动变量的生存期仅限于函数内部,当函数返回时,自动变量就消失了。

int& fun() { int a; //... return a; }

传递引用给函数与传递指针的效果是一样的,但使用更简练。

使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;

void swap(int *p1, int *p2) { int p; p=*p1; //必须用“*指针变量名”的形式操作目标变量 p1=*p2; *p2=p; } main() { int a,b; cin>>a>>b; swap(&a,&b); //必须以变量a和b的地址作为实参 cout<<a<<b; } 如何使一个被调函数同时返回多个值

由于函数的返回值是通过函数体中的return语句完成的,但一个return语句只能返回一个值,为此,我们可以采用以下方法:

(1)利用全局变量的方法:在函数中把所需数据保存在全局变量中。当被调函数执行完毕后在主调函数中直接读取全局变量的值即可。

(2)使用指针或数组的方法:指针作为函数参数的情况下,可将主调函数的某些变量的地址传递给被调函数。

(3)利用引用的方法:使用引用传递参数,可以在被调函数中改变主调函数中目标变量的值,这种方法实际上就是可以使被调函数返回多个值。

例 使用引用使函数返回多个值

以下定义了可以同时返回10个数中的最大值和最小值的函数max_min。

#include <iostream.h> void max_min(int *p,int n,int &max,int &min); //声明函数max_min void main() { int a[10]; int ma,mi; int i; for(i=0;i<10;i++) cin>>a[i]; max_min(a,10,ma,mi); //调用函数max_min cout<<ma<<mi; } void max_min(int *p,int n,int &max,int &min) //形参max 和min定义成引用 { int i=0; max=*(p+i); min=*(p+i); for(i=1;i<n;i++) { if(max<*(p+i)) max=*(p+i); //实质上就是对实参变量ma赋值 if(min>*(p+i)) min=*(p+i); //实质上就是对实参变量mi赋值 } } 例 以下程序中定义了一个普通的函数fn1(它用返回值的方法返回函数值),另外一个函数fn2,它以引用的方法返回函数值。 #include <iostream.h> float temp; //定义全局变量temp float fn1(float r); //声明函数fn1 float &fn2(float r); //声明函数fn2 float fn1(float r) //定义函数fn1,它以返回值的方法返回函数值 { temp=(float)(r*r*3.14); return temp; } float &fn2(float r) //定义函数fn2,它以引用方式返回函数值 { temp=(float)(r*r*3.14); return temp; } void main() //主函数 { float a=fn1(10.0);//第1种情况,系统生成要返回值的副本(即临时变量) float &b=fn1(10.0);//第2种情况,可能会出错(不同C++系统有不同规定) //不能从被调函数中返回一个临时变量或局部变量的引用 float c=fn2(10.0); //第3种情况,系统不生成返回值的副本 //可以从被调函数中返回一个全局变量的引用 float &d=fn2(10.0); //第4种情况,系统不生成返回值的副本 //可以从被调函数中返回一个全局变量的引用 cout<<a<<c<<d; }

一个返回引用的函数值作为赋值表达式的左值

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzsgy.html