程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++編程中將援用類型作為函數參數的辦法指南

C++編程中將援用類型作為函數參數的辦法指南

編輯:關於C++

C++編程中將援用類型作為函數參數的辦法指南。本站提示廣大學習愛好者:(C++編程中將援用類型作為函數參數的辦法指南)文章只能為提供參考,不一定能成為您想要的結果。以下是C++編程中將援用類型作為函數參數的辦法指南正文


有了變量名,為何還須要一個體名呢?C++之所以增長援用類型, 重要是把它作為函數參數,以擴大函數傳遞數據的功效。

到今朝為止我們引見過函數參數傳遞的兩種情形。

1) 將變量名作為實參和形參
這時候傳給形參的是變量的值,傳遞是單向的。假如在履行函數時代形參的值產生變更,其實不傳回給實參。由於在挪用函數時,形參和實參不是統一個存儲單位。

【例】請求將變量i和j的值交換。上面的法式沒法完成此請求。

#include <iostream>
using namespace std;
int main( )
{
  void swap(int,int); //函數聲明
  int i=3,j=5;
  swap(i,j); //挪用函數swap
  cout<<i<<" "<<j<<endl; //i和j的值未交換
  return 0;
}
void swap(int a,int b) //妄圖經由過程形參a和b的值交換,完成實參i和j的值交換
{
  int temp;
  temp=a; //以下3行用來完成a和b的值交換
  a=b;
  b=temp;
}

運轉時輸入3 5i和j的值並未交換。

為懂得決這個成績,采取傳遞變量地址的辦法。

2) 傳遞變量的指針
形參是指針變量,實參是一個變量的地址,挪用函數時,形參(指針變量)指向實參變量單位。法式見例6.19。

【例】應用指針變量作形參,完成兩個變量的值交換。

#include <iostream>
using namespace std;
int main( )
{
  void swap(int *,int *);
  int i=3,j=5;
  swap(&i,&j); //實參是變量的地址
  cout<<i<<" "<<j<<endl; //i和j的值已交換
  return 0;
}
void swap(int *p1,int *p2) //形參是指針變量
{
  int temp;
  temp=*p1; //以下3行用來完成i和j的值交換
  *p1=*p2;
  *p2=temp;
}

形介入實參的聯合見圖表示。

這類真假聯合的辦法依然是“值傳遞”方法,只是實參的值是變量的地址罷了。經由過程形參指針變量拜訪主函數中的變量(i和j),並轉變它們的值。如許就可以獲得准確成果,然則在概念上倒是兜了一個圈子,不那末直接了當。

在Pascal說話中有“值形參”和“變量形參”(即var形參),對應兩種分歧的傳遞方法,前者采取值傳遞方法,後者采取地址傳遞方法。在C說話中,只要“值形參”而無“變量形參”,全體采取值傳遞方法。C++把援用型變量作為函數形參,就填補了這個缺乏。

C++供給了向函數傳遞數據的第(3)種辦法,即傳送變量的別號。

【例】應用“援用形參”完成兩個變量的值交換。

#include <iostream>
using namespace std;
int main( )
{
  void swap(int &,int &);
  int i=3,j=5;
  swap(i,j);
  cout<<"i="<<i<<" "<<"j="<<j<<endl;
  return 0;
}
void swap(int &a,int &b) //形參是援用類型
{
  int temp;
  temp=a;
  a=b;
  b=temp;
}

輸入成果為:

  i=5 j=3


在swap函數的形參表列中聲明a和b 是整型變量的援用。

現實上,在真假聯合時是把實參i的地址傳到形參a,使形參a的地址取實參i的地址,從而使a和i同享統一單位。異樣,將實參j的地址傳到形參b,使形參b的地址取實參j的地址,從而使b和j同享統一單位。這就是地址傳遞方法。為便於懂得,可以淺顯地說:把變量i的名字傳給援用變量a,使a成為i的別號。

請思慮:這類傳遞方法和應用指針變量作形參時有何分歧?可以發明:應用援用類型就不用在swap函數中聲明形參是指針變量。指針變量要別的開拓內存單位,其內容是地址。而援用變量不是一個自力的變量,不零丁占內存單位,在例中援用變量a和b的值的數據類型與實參雷同,都是整型。
在main函數中挪用swap函數時,實參不用用變量的地址(在變量名的後面加&),而直接用變量名。體系向形參傳送的是實參的地址而不是實參的值。
這類傳遞方法相當於Pascal說話中的“變量形參”,明顯,這類用法比應用指針變量簡略、直不雅、便利。應用變量的援用,可以部門取代指針的操作。有些曩昔只能用指針來處置的成績,如今可以用援用來取代,從而下降了法式設計的難度。

【例】對3個變量按由小到年夜的次序排序。

#include <iostream>
using namespace std;
int main( )
{
  void sort(int &,int &,int &); //函數聲明,形參是援用類型
  int a,b,c; //a,b,c是需排序的變量
  int a1,b1,c1; //a1,b1,c1終究的值是已排好序的數列
  cout<<"Please enter 3 integers:";
  cin>>a>>b>>c; //輸出a,b,c
  a1=a;b1=b;c1=c;            
  sort(a1,b1,c1); //挪用sort函數,以a1,b1,c1為實參
  cout<<"sorted order is "<<a1<<" "<<b1<<" "<<c1<<endl; //此時a1,b1,c1已排好序
  return 0;
}
void sort(int &i,int &j,int &k) //對i,j,k 3個數排序
{
  void change(int &,int &); //函數聲明,形參是援用類型
  if (i>j) change (i,j); //使i<=j
  if (i>k) change (i,k); //使i<=k
  if (j>k) change (j,k); //使j<=k
}
void change (int &x,int &y) //使x和y交換
{
  int temp;
  temp=x;
  x=y;
  y=temp;
}

運轉情形以下:

Please enter 3 integers:23 12 -345↙
sorted order is -345 12 23

可以看到:這個法式很輕易懂得,不容易失足。因為在挪用sort函數時真假聯合使形參i,j,k成為實參a1,b1,c1的援用,是以經由過程挪用函數sort(a1, b1, c1)既完成了對i,j,k排序,也就同時完成了對a1,b1,c1排序。異樣,履行change (i, j)函數,可以完成對實參i和j的交換。

援用不只可以用於變量,也能夠用於對象。例照實參可所以一個對象名,在真假聯合時傳遞對象的肇端地址。這會在今後引見。

當看到&a如許的情勢時,如何差別是聲明援用變量照樣取地址的操作呢?當&a的後面有類型符時(如int &a),它必定是對援用的聲明;假如後面無類型符(如cout<<&a),則是取變量的地址。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved