设为首页 加入收藏

TOP

3.1.2 引用作为函数参数
2013-10-07 16:20:38 来源: 作者: 【 】 浏览:68
Tags:3.1.2 引用 作为 函数参数

3.1.2  引用作为函数参数

1. 引用传递参数

在作为函数参数时,引用具有指针的威力,又具有传值方式的简单性与可读性。而且使用引用可以从调用的函数返回多个值。

例如,有以下程序:
 

  1. #include <iostream.h> 
  2. void f(int a[],int n,int &max,int &min)  
  3. {   max=min=a[0];  
  4.     for (int i=1;i<n;i++)  
  5.     {   if (max<a[i]) max=a[i];  
  6.         if (min>a[i]) min=a[i];  
  7.     }  
  8. }  
  9. void main()  
  10. {   int a[10]={2,5,2,9,0,8,6,1,7,4};  
  11.     int max,min;  
  12.     f(a,10,max,min);  
  13.     cout << "Max:" << max << endl;  
  14.     cout << "Min:" << min << endl;  
  15. }  

上述程序中,函数f使用了两个引用,即Max和Min用于返回值。其执行结果如下:

  1. Max:9  
  2. Min:0  

2. 对象引用作为函数参数

在实际应用中,使用对象引用作为函数参数要比使用对象指针作为函数参数更普遍。这是因为使用对象引用作为函数参数,既具有用对象指针作为函数参数的优点,又具有用对象作为函数参数的简单性与可读性。

例如,有以下程序:

  1. #include <iostream.h> 
  2. class Sample  
  3. {   int x,y;  
  4. public:  
  5.     Sample(){ x=y=0; }  
  6.     Sample(int x1,int y1) {   x=x1;y=y1;}  
  7.     void copy(Sample s) { x=s.x;y=s.y;    }  
  8.     void setxy(int x1,int y1) {   x=x1;y=y1; }  
  9.     void disp()    { cout << "(" << x << "," << y << ")" << endl; }  
  10. };  
  11. void fun(Sample s1,Sample &s2)  
  12. {   s1.setxy(12,18);  
  13.     s2.setxy(23,15);  
  14. }  
  15. void main()  
  16. {   Sample s(5,10),t;  
  17.     s.disp();  
  18.     t.copy(s);  
  19.     t.disp();  
  20.     fun(s,t);  
  21.     s.disp();  
  22.     t.disp();  
  23. }  

上述程序中,main函数调用fun(s,t)后,由于fun函数只有第二个参数使用了对象引用,所以s对象不改变,而t对象改变了。其执行结果如下:
 

  1. (5,10)  
  2. (5,10)  
  3. (5,10)  
  4. (23,15)  

在函数调用过程中,实参到形参传递数据时,是将实参复制给形参,注意这种复制是浅复制,例如,有以下程序:

  1. #include <iostream.h> 
  2. #include <string.h> 
  3. class MyClass  
  4. {   char *pstr;  
  5.     int size;  
  6. public:  
  7.     MyClass() {}                    //默认构造函数  
  8.     MyClass(char a[],int n)     //重载构造函数  
  9.     {   pstr=new char[n+1];         //分配n+1个字符空间  
  10.         strcpy(pstr,a);             //复制字符串  
  11.         size=n;  
  12.     }  
  13.     ~MyClass()                  //析构函数  
  14.     {   delete [] pstr; }  
  15.     void Copy(MyClass obj)      //复制  
  16.     {   this->pstr=new char[obj.size+1];  
  17.         strcpy(this->pstr,obj.pstr);   
  18.         this->size=obj.size;  
  19.     }  
  20.     void Disp()                 //输出pstr  
  21.     {   cout << pstr << endl; }  
  22. };  
  23. void main()  
  24. {   MyClass s("ABC",3),s1;  
  25.     cout << "s:"; s.Disp();  
  26.     s1.Copy(s);  
  27.     cout << "s1:"; s1.Disp();  
  28. }  

上述程序中定义了一个MyClass类,其中Copy成员函数用于将形参obj对象复制给当前调用的对象,并采用深复制。可是在程序执行时却出现错误。这是因为执行s1.Copy(s)时,由于Copy成员函数的形参obj不是引用型参数,需要将实参对象s复制给形参对象obj,这种复制是浅复制,也就是说obj.pstr和s.pstr都指向同一个内存空间,当Copy函数执行完毕,调用obj的析构函数将所指空间释放了,而程序结束时,再调用s的析构函数时出现错误。

改正的方法十分简单,只需将Copy成员函数的形参obj改为引用型参数即可。因为改为引用型参数后,obj和s共享同一内存空间,当Copy函数执行完毕,不会调用obj的析构函数将所指空间释放,只有在程序结束时调用s的析构函数才释放所指空间。

在设计一个类时,如果含有指针数据成员,那么成员函数中对象形参通常采用引用类型,否则会出现错误。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.1.1 引用的概念 下一篇3.1.3 引用返回值

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·用 Python 进行数据 (2025-12-25 15:49:09)
·如何学习Python数据 (2025-12-25 15:49:07)
·利用Python进行数据 (2025-12-25 15:49:04)
·Java 学习线路图是怎 (2025-12-25 15:19:15)
·关于 Java 学习,有 (2025-12-25 15:19:12)