1. 程式人生 > >C++--引用型別,含有可變引數的函式

C++--引用型別,含有可變引數的函式

引用型別

  • 引用是識別符號的別名
  • 定義一個引用的時候,必須同時對他初始化,使它指向一個已經存在的物件 
  • 例如:其實在定義引用變數ri的時候,ri相當於變數j的別名
int i,j;
int &ri = i;//定義int引用ri,並初始化為變數i的引用
j = 10;
ri = j;//相當於i = j
  • 一旦一個引用變數被初始化後,就不能改為指向其他物件,相當於二者已經綁定了

引用可以作為形參,以實現函式的雙向傳遞。這樣也符合在分配記憶體空間的時候直接初始化,因為只有當函式被呼叫的時候,進行形參實參相結合的時候,才給形參分配儲存空間,也就是說只有函式被呼叫的時候這個引用才被定義,然後這個時候用實參的元素或者物件來初始化形參的引用變數。

#include "iostream"
using namesplace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int x = 5,y = 10;
	cout<<"x = "<<x<<"\ty = "<<y<<endl;
	swap(x,y);
	cout<<"\nx = "<<x<<"y = "<<y<<endl;
	return 0;
}

void swap(int a,int b){
	int temp;
	temp = a;
	a = b;
	b = temp;
}

/*執行結果 x = 5 y = 10
          x = 5 y = 10
*/
#include "iostream"
using namesplace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int x = 5,y = 10;
	cout<<"x = "<<x<<"\ty = "<<y<<endl;
	swap(x,y);
	cout<<"\nx = "<<x<<"y = "<<y<<endl;
	return 0;
}

void swap(int &a,int &b){
//在呼叫這個函式的時候會生成兩個引用變數a,b同時會將實參的x,y值賦給a,b 即int &a=x,&b=y;
	int temp;
	temp = a;
	a = b;
	b = temp;
}


/*執行結果 x = 5 y = 10
          x = 10 y = 5
*/

含有可變引數的函式

C++標準中提供了兩個主要的方法來實現改變函式中的形參

  • 如果所有實參型別相同,可以傳遞一個名為initializer_list的標準庫型別
  • 如果實參的型別不同,我們可以編寫可變引數的模板(在後面會學到)

initializer_list

  • 定義:initializer_list是一種標準庫型別,用於表示某種特定型別的值的陣列,該型別定義在同名的標頭檔案中
  • 使用方法:initializer_list是一個類模板,在使用模板時,我們需要在模板名字後面跟一對尖括號,括號內給出型別引數
  • 例如:
initializer_list<string> ls;//initializer_list的元素型別是string
initializer_list<int> li;//initializer_list的元素型別是in
  • initializer_list比較特殊的一點是,其物件中的元素永遠是常量值,我們無法改變initializer_list物件中元素值,含有initializer_list形參的函式也可以同時擁有其他形參
  • 使用舉例:在編寫程式碼輸出程式產生的錯誤資訊時,最好使用統一的一個函式來實現該函式的功能,使得對所有的錯誤處理都能夠整齊劃一,然而錯誤資訊的種類不同,呼叫錯誤資訊輸出函式時傳遞的引數也不同。因此我們可以用initializer_list編寫一個錯誤資訊輸出函式使其作用於可變數量的形參。