C 引用的作用和用法

2021-06-18 01:17:49 字數 3679 閱讀 6998

c++ 引用的作用和用法

我的總結:引用的好處之一就是在函式呼叫時在記憶體中不會生成副本。

引用總結

(1)在引用的使用中,單純給某個變數取個別名是毫無意義的,引用的目的主要用於在函式引數傳遞中,解決大塊資料或物件的傳遞效率和空間不如意的問題。

(2)用引用傳遞函式的引數,能保證引數傳遞中不產生副本,提高傳遞的效率,且通過const的使用,保證了引用傳遞的安全性。

(3)引用與指標的區別是,指標通過某個指標變數指向乙個物件後,對它所指向的變數間接操作。程式中使用指標,程式的可讀性差;而引用本身就是目標變數的別名,對引用的操作就是對目標變數的操作。

(4)使用引用的時機。流操作符《和》、賦值操作符=的返回值、拷貝建構函式的引數、賦值操作符=的引數、其它情況都推薦使用引用。

引用就是某一變數(目標)的乙個別名,對引用的操作與對變數直接操作完全一樣。

引用的宣告方法:型別識別符號 &引用名=目標變數名;

【例1】:int a;  int &ra=a;  //定義引用ra,它是變數a的引用,即別名

(1)&在此不是求位址運算,而是起標識作用。

(2)型別識別符號是指目標變數的型別。

(3)宣告引用時,必須同時對其進行初始化。

(4)引用宣告完畢後,相當於目標變數名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變數名的別名。ra=1; 等價於 a=1; 

(5)宣告乙個引用,不是新定義了乙個變數,它只表示該引用名是目標變數名的乙個別名,它本身不是一種資料型別,因此引用本身不佔儲存單元,系統也不給引用分配儲存單元。故:對引用求位址,就是對目標變數求位址。&ra與&a相等。

(6)不能建立陣列的引用。因為陣列是乙個由若干個元素所成的集合,所以無法建立乙個陣列的別名。

(7)不能建立引用的引用,不能建立指向引用的指標。因為引用不是一種資料型別!!所以沒有引用的引用,沒有引用的指標。

例如:

int n;

int &&r=n;//錯誤,編譯系統把"int &"看成一體,把"&r"看成一體,即建立了引用的引用,引用的物件應當是某種資料型別的變數

int &*p=n;//錯誤,編譯系統把"int &"看成一體,把" *p "看成一體,即建立了指向引用的指標,指標只能指向某種資料型別的變數

(8)值得一提的是,可以建立指標的引用

例如:

int *p;

int *&q=p;//正確,編譯系統把" int * "看成一體,把"&q"看成一體,即建立指標p的引用,亦即給指標p起別名q。

引用應用

1、引用作為引數 

引用的乙個重要作用就是作為函式的引數。以前的c語言中函式引數傳遞是值傳遞,如果有大塊資料作為引數傳遞的時候,採用的方案往往是指標,因為這樣可以避免將整塊資料全部壓棧,可以提高程式的效率。但是現在(c++中)又增加了一種同樣有效率的選擇(在某些特殊情況下又是必須的選擇),就是引用。

【例2】:

void swap(int &p1,  int &p2)  //此處函式的形參p1, p2都是引用 

為在程式中呼叫該函式,則相應的主調函式的呼叫點處,直接以變數作為實參進行呼叫即可,而不需要實參變數有任何的特殊要求。如:對應上面定義的swap函式,相應的主調函式可寫為:

main( )

相應的主調函式為:

int main()

如果既要利用引用提高程式的效率,又要保護傳遞給函式的資料不在函式中被改變,就應使用常引用。

2、常引用

常引用宣告方式:const 型別識別符號 &引用名=目標變數名;

用這種方式宣告的引用,不能通過引用對目標變數的值進行修改,從而使引用的目標成為const,達到了引用的安全性。

【例3】: 

int a ;

const int &ra=a;

ra=1;  //錯誤,不能通過引用對目標變數的值進行修改

a=1;  //正確 

writing into constant object

這不光是讓**更健壯,也有些其它方面的需要。

【例4】:假設有如下函式宣告:

string foo( );

void bar(string & s);

那麼下面的表示式將是非法的:

bar(foo( ));

bar("hello world"); 

原因在於foo( )和"hello world"串都會產生乙個臨時物件,而在c++中,這些臨時物件都是const型別的。因此上面的表示式就是試圖將乙個const型別的物件轉換為非const型別,這是非法的。

引用型引數應該在能被定義為const的情況下,盡量定義為const 。

3、引用作為返回值

要以引用返回函式值,則函式定義時要按以下格式:

型別識別符號 &函式名(形參列表及型別說明)

說明:(1)以引用返回函式值,定義函式時需要在函式名前加&

(2)用引用返回乙個函式值的最大好處是,在記憶體中不產生被返回值的副本。

【例5】: 以下程式中定義了乙個普通的函式fn1(它用返回值的方法返回函式值),另外乙個函式fn2,它以引用的方法返回函式值。

#i nclude

float  temp;  //定義全域性變數temp

float  fn1(float r);  //宣告函式fn1

float  &fn2(float r);  //宣告函式fn2

float  fn1(float r)  //定義函式fn1,它以返回值的方法返回函式值

float &fn2(float r)  //定義函式fn2,它以引用方式返回函式值

void main()  //主函式

}

(5)在另外的一些操作符中,卻千萬不能返回引用:+-*/ 四則運算符。它們不能返回引用,effective c++[1]的item23詳細的討論了這個問題。主要原因是這四個操作符沒有side effect,因此,它們必須構造乙個物件作為返回值,可選的方案包括:返回乙個物件、返回乙個區域性變數的引用,返回乙個new分配的物件的引用、返回乙個靜態物件引用。根據前面提到的引用作為返回值的三個規則,第2、3兩個方案都被否決了。靜態物件的引用又因為((a+b) == (c+d))會永遠為true而導致錯誤。所以可選的只剩下返回乙個物件了。

4、引用和多型  

引用是除指標外另乙個可以產生多型效果的手段。這意味著,乙個基類的引用可以指向它的派生類例項。

【例7】: 

class  a;

class  b:public a;

b  b;

a  &ref = b;  // 用派生類物件初始化基類物件的引用

ref 只能用來訪問派生類物件中從基類繼承下來的成員,是基類引用指向派生類。如果a類中定義有虛函式,並且在b類中重寫了這個虛函式,就可以通過ref產生多型效果。

c 「 」的作用和用法

在看別人程式的時候偶爾看到,總結了一下兩個用途 1.不常用,也不推介用的用法。關鍵字 可以作為識別符號來使用,說白了,就是講關鍵字變成非關鍵字。2.逐字字串字面量,以 開頭,後面是由引導包含的字串。使用引導號包含的字串的內容原樣輸出,而且他們能夠跨越兩行或更多行。因此,可以加入新行,製表符等,而不需...

C 引用的作用

學習了引數的三種傳遞方式 值傳遞 指標傳遞與引用傳遞後不由地對這不熟悉的引用感到好奇,根據引用的概念,引用在定義初始化時與物件名繫結,為物件建立引用名,就類似於別名的作用,可別名不就會像值傳遞一樣不改變實參的值了嗎,可引用傳遞又能跟指標傳遞一樣改變實參的值,我便抱著這種疑問對引用展開 先看下引用傳遞...

C 指標和引用的用法

一 基本知識 指標和引用的宣告方式 宣告指標 char pc 宣告引用 char c a char rc c 它們的區別 從現象上看,指標在執行時可以改變其所指向的值,而引用一旦和某個物件繫結後就不再改變。這句話可以理解為 指標可以被重新賦值以指向另乙個不同的物件。但是引用則總是指向在初始化時被指定...