久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

Hi,歡迎來到嵌入式培訓高端品牌 - 華清遠見教育科技集團<北京總部官網>,專注嵌入式工程師培養15年!
當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > 淺談引用
淺談引用
時間:2016-12-30作者:華清遠(yuan)見

引用(yong)(yong)是(shi)C++引入的新語言特性,是(shi)C++常用(yong)(yong)的一(yi)個重要內容之一(yi)。在(zai)網上(shang)查了些資料(liao)后,在(zai)這我希望能用(yong)(yong)過一(yi)些簡單的應(ying)用(yong)(yong)來對引用(yong)(yong)進行分(fen)析。

引用的定義:

引用(yong)就是(shi)某(mou)一(yi)(yi)變(bian)量(liang)(目(mu)標)的(de)一(yi)(yi)個(ge)別名,對引用(yong)的(de)操作與對變(bian)量(liang)直接操作完全一(yi)(yi)樣。

引用的聲明:

類型標示符 &引用名(ming)=目(mu)標變量名(ming)

例如: 
        int a;
        ;int &b=a;

在這里定義(yi)(yi)了b為a的(de)(de)(de)引用,通過這樣的(de)(de)(de)引用,a和b表(biao)示同(tong)一對(dui)象(xiang)。在這要特別的(de)(de)(de)強(qiang)調的(de)(de)(de)是引用并不產生(sheng)對(dui)象(xiang)的(de)(de)(de)副(fu)本(ben),僅(jin)僅(jin)是對(dui)象(xiang)的(de)(de)(de)同(tong)義(yi)(yi)詞。&不是求址運算,只(zhi)是一個標識符,表(biao)示定義(yi)(yi)的(de)(de)(de)是一個類(lei)型(xing)標識符型(xing)的(de)(de)(de)一個變量的(de)(de)(de)引用。

引用的規則: 
        (1)引用被創建的同時必須被初始化(指針則可以在任何時候被初始化)。 
        (2)不能有NULL引用,引用必須與合法的存儲單元關聯(指針則可以是NULL)。 
        (3)一旦引用被初始化,就不能改變引用的關系(指針則可以隨時改變所指的對象)。 
        (4)聲明一個引用,不是定義一個變量,它只表示該引用名是目標變量的一個別名,所以它本身不是一種數據結構,因此引用本身不占存儲單元,系統也不給引用分配存儲單元。所以對引用求地址,就是對目標變量求地址。 
 &nbsp;    &nbsp; (5)不能建立數組的引用。因為數組是一(yi)個(ge)由若干元素組成的集合,所以沒(mei)有辦法(fa)建立一(yi)個(ge)數組的別名。

引用的主要功能: 
        (1)傳遞函數的參數

與C語(yu)言(yan)不同(tong),C++語(yu)言(yan)中(zhong),函數(shu)的(de)(de)參數(shu)和(he)返(fan)回值的(de)(de)傳(chuan)(chuan)遞方式(shi)除了有值傳(chuan)(chuan)遞、指(zhi)針傳(chuan)(chuan)遞還有引用傳(chuan)(chuan)遞。在C語(yu)言(yan)中(zhong)如果(guo)有大(da)塊數(shu)據(ju)作為參數(shu)傳(chuan)(chuan)遞的(de)(de)時候,采用的(de)(de)方案往往是指(zhi)針,因為這(zhe)樣可以(yi)避免將(jiang)整塊數(shu)據(ju)全(quan)部壓棧,從而提(ti)(ti)高效(xiao)率(lv)。而在C++中(zhong),它提(ti)(ti)供了一種(zhong)提(ti)(ti)高程序效(xiao)率(lv)的(de)(de)方法,就是引用。

void swap(int *p,int *q)
        {
                int temp;
                temp = *p;
                *p=*q;
                *q=temp;
   &nbsp;    }

在(zai)C++中我(wo)們就(jiu)可以改善我(wo)們的程序,寫成:

void swap(int &p,int &q)
        {
                int temp;
                temp = p;
                p=q;
                q=temp;
  &nbsp; ;    }

這個時候我(wo)們寫主(zhu)函數(shu)的(de)時候就不(bu)用再寫成swap(&a,&b)直接(jie)寫成swap(a,b)。

從例子(zi)中我們可以看出:

(1)傳(chuan)遞(di)引用給函(han)數與(yu)傳(chuan)遞(di)指針(zhen)的(de)效(xiao)果是一樣的(de)。這時,被調函(han)數的(de)形參就成為(wei)原來(lai)(lai)主調函(han)數中的(de)實參變量(liang)或對象(xiang)的(de)一個別(bie)名(ming)來(lai)(lai)使用,所以在被調函(han)數中對形參變量(liang)的(de)操(cao)作就是對其相應的(de)目標(biao)對象(xiang)(在主調函(han)數中)的(de)操(cao)作。

(2)使用(yong)(yong)引(yin)用(yong)(yong)傳遞函(han)數(shu)的(de)參(can)數(shu),在內存中并沒有產生(sheng)實(shi)(shi)參(can)的(de)副本(ben),它是直(zhi)接對(dui)實(shi)(shi)參(can)操作;而(er)使用(yong)(yong)一(yi)般變(bian)量傳遞函(han)數(shu)的(de)參(can)數(shu),當發生(sheng)函(han)數(shu)調用(yong)(yong)時,需要給形參(can)分配存儲單(dan)元,形參(can)變(bian)量是實(shi)(shi)參(can)變(bian)量的(de)副本(ben);如果傳遞的(de)是對(dui)象(xiang),還將調用(yong)(yong)拷(kao)貝構造函(han)數(shu)。因(yin)此(ci),當參(can)數(shu)傳遞的(de)數(shu)據較大(da)時,用(yong)(yong)引(yin)用(yong)(yong)比用(yong)(yong)一(yi)般變(bian)量傳遞參(can)數(shu)的(de)效率和所占空間都好。

(3)使用(yong)指針作(zuo)(zuo)為函(han)數(shu)的(de)(de)(de)參(can)(can)數(shu)雖(sui)然(ran)也(ye)能(neng)達(da)到與使用(yong)引用(yong)的(de)(de)(de)效果,但是(shi),在被調函(han)數(shu)中同樣要給形參(can)(can)分(fen)配存儲單(dan)元,且需要重復(fu)使用(yong)"*指針變量(liang)名"的(de)(de)(de)形式進行運算,這(zhe)很容(rong)易產(chan)生(sheng)錯(cuo)誤且程序的(de)(de)(de)閱(yue)讀性(xing)較差;另一(yi)方面,在主調函(han)數(shu)的(de)(de)(de)調用(yong)點處,必須(xu)用(yong)變量(liang)的(de)(de)(de)地址作(zuo)(zuo)為實參(can)(can)。而引用(yong)更容(rong)易使用(yong),更清晰。

如果既要利(li)用(yong)(yong)引用(yong)(yong)提高程序的效率,又要保護傳遞(di)給函(han)數(shu)的數(shu)據(ju)不在函(han)數(shu)中(zhong)被改變(bian),就應使用(yong)(yong)常引用(yong)(yong)。

在這就得弄明白c++中引用和指針的區別:

(a)非空區別。在任何情(qing)況下(xia)都不(bu)能(neng)使用(yong)(yong)(yong)指(zhi)向(xiang)空值的引用(yong)(yong)(yong)。一個引用(yong)(yong)(yong)必(bi)須(xu)總(zong)是指(zhi)向(xiang)某(mou)些對(dui)象(xiang)。因此如果你(ni)使用(yong)(yong)(yong)一個變(bian)(bian)(bian)量(liang)(liang)并(bing)讓他(ta)指(zhi)向(xiang)一個對(dui)象(xiang),但是該(gai)變(bian)(bian)(bian)量(liang)(liang)在某(mou)些時(shi)候也可能(neng)不(bu)指(zhi)向(xiang)任何對(dui)象(xiang),這是你(ni)應該(gai)把變(bian)(bian)(bian)量(liang)(liang)聲明(ming)為(wei)指(zhi)針,因為(wei)這樣(yang)你(ni)可以(yi)賦予(yu)空值給(gei)該(gai)變(bian)(bian)(bian)量(liang)(liang)。相反,如果變(bian)(bian)(bian)量(liang)(liang)肯(ken)定指(zhi)向(xiang)一個對(dui)象(xiang),例如你(ni)的設計不(bu)允許(xu)變(bian)(bian)(bian)量(liang)(liang)為(wei)空,這時(shi)你(ni)就(jiu)可以(yi)把變(bian)(bian)(bian)量(liang)(liang)聲明(ming)為(wei)引用(yong)(yong)(yong)。不(bu)存(cun)在指(zhi)向(xiang)空值得引用(yong)(yong)(yong)這個事實意味著使用(yong)(yong)(yong)引用(yong)(yong)(yong)的代碼效率比(bi)使用(yong)(yong)(yong)指(zhi)針要高。

(b)合法(fa)性區別。在使用引用之前不需要測試它的合法(fa)性。相反,指針則(ze)應該(gai)總(zong)是被測試,防止其為空。

(c)可(ke)修改(gai)區別。指針(zhen)與引用的另一(yi)(yi)個(ge)重(zhong)(zhong)要(yao)的不(bu)同(tong)(tong)是(shi)指針(zhen)可(ke)以(yi)被重(zhong)(zhong)新賦值(zhi)以(yi)指向另一(yi)(yi)個(ge)不(bu)同(tong)(tong)的對象。但是(shi)引用則是(shi)總是(shi)指向在初始(shi)化時被指定的對象,以(yi)后不(bu)能改(gai)變,但是(shi)指定的對象其(qi)內容可(ke)以(yi)改(gai)變。

(d)應用區(qu)別。總的來說,在(zai)(zai)以下(xia)(xia)情(qing)況下(xia)(xia)你(ni)(ni)應該使用指(zhi)(zhi)針(zhen):一是(shi)你(ni)(ni)考慮到存在(zai)(zai)不(bu)指(zhi)(zhi)向任何對(dui)(dui)象(xiang)對(dui)(dui)象(xiang)的可能(neng)(neng)(在(zai)(zai)這種情(qing)況下(xia)(xia),你(ni)(ni)能(neng)(neng)夠(gou)設置指(zhi)(zhi)針(zhen)為空),二是(shi)你(ni)(ni)需(xu)要能(neng)(neng)夠(gou)在(zai)(zai)不(bu)同的時刻(ke)指(zhi)(zhi)向不(bu)同的對(dui)(dui)象(xiang)(在(zai)(zai)這種情(qing)況下(xia)(xia),你(ni)(ni)能(neng)(neng)改變指(zhi)(zhi)針(zhen)的指(zhi)(zhi)向)。如果總是(shi)指(zhi)(zhi)向一個對(dui)(dui)象(xiang)并且一旦指(zhi)(zhi)向一個對(dui)(dui)象(xiang)后就不(bu)會改變指(zhi)(zhi)向,那么你(ni)(ni)應該使用引用。

(2)返回值。

要以(yi)引用返回函(han)數值,則函(han)數定義時要按以(yi)下(xia)格式:

類型(xing)標識(shi)符 &函數名(ming)(形(xing)參列表及類型(xing)說明)

{函數體}

看下面這個程序:

定義了一個(ge)普(pu)通的(de)函(han)數fn1(它用(yong)返(fan)回(hui)值(zhi)的(de)方法返(fan)回(hui)函(han)數值(zhi)),另(ling)外一個(ge)函(han)數fn2,它以引用(yong)的(de)方法返(fan)回(hui)函(han)數值(zhi)。

#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; 
        }

引(yin)用作為(wei)返(fan)回(hui)值,必須遵守以(yi)下規則:

(1)不能返(fan)回局部變量的引用。

例如(ru):float &b=fn1(10.0); 主要原因(yin)是(shi)局(ju)部(bu)變(bian)量會在函數返(fan)回后(hou)被銷毀(hui),因(yin)此被返(fan)回的引用(yong)就成為了"無所指"的引用(yong),程序會進入未知(zhi)狀態。

(2)不能返(fan)(fan)回(hui)函(han)數(shu)內部(bu)new分(fen)配的內存的引(yin)(yin)用(yong)。雖然不存在局部(bu)變(bian)(bian)量(liang)(liang)的被(bei)(bei)(bei)動銷(xiao)毀問題,可對于這種情(qing)況(返(fan)(fan)回(hui)函(han)數(shu)內部(bu)new分(fen)配內存的引(yin)(yin)用(yong)),又面(mian)臨(lin)其它尷(gan)尬局面(mian)。例如,被(bei)(bei)(bei)函(han)數(shu)返(fan)(fan)回(hui)的引(yin)(yin)用(yong)只是作(zuo)為(wei)一個臨(lin)時變(bian)(bian)量(liang)(liang)出現(xian),而沒有被(bei)(bei)(bei)賦予一個實際的變(bian)(bian)量(liang)(liang),那么這個引(yin)(yin)用(yong)所(suo)指(zhi)向的空(kong)間(jian)(由new分(fen)配)就(jiu)無(wu)法釋放,造成memory leak。

(3)可以返回類成員的引用(yong),但好是const。主(zhu)要(yao)原因(yin)是當對(dui)象的屬性(xing)是與(yu)某種(zhong)業務(wu)規(gui)(gui)則(business rule)相關聯的時候,其賦值常(chang)常(chang)與(yu)某些其它(ta)屬性(xing)或者對(dui)象的狀態(tai)有(you)關,因(yin)此(ci)有(you)必要(yao)將賦值操作(zuo)封(feng)裝在一個業務(wu)規(gui)(gui)則當中(zhong)。如果(guo)其它(ta)對(dui)象可以獲得該屬性(xing)的非常(chang)量引用(yong)(或指針),那么對(dui)該屬性(xing)的單純賦值就會破壞業務(wu)規(gui)(gui)則的完整性(xing)。

(4)引用與(yu)一些操(cao)作符的重載(zai):

流(liu)操(cao)(cao)(cao)作(zuo)符(fu)(fu)<<和(he)>>,這兩個(ge)操(cao)(cao)(cao)作(zuo)符(fu)(fu)常(chang)(chang)常(chang)(chang)希望被連續使(shi)用(yong),例(li)如:cout << "hello" << endl; 因(yin)此這兩個(ge)操(cao)(cao)(cao)作(zuo)符(fu)(fu)的(de)(de)(de)返(fan)回(hui)(hui)(hui)值(zhi)(zhi)(zhi)應(ying)該是(shi)(shi)一(yi)(yi)(yi)個(ge)仍然支持這兩個(ge)操(cao)(cao)(cao)作(zuo)符(fu)(fu)的(de)(de)(de)流(liu)引用(yong)。可選的(de)(de)(de)其(qi)它方案包括(kuo):返(fan)回(hui)(hui)(hui)一(yi)(yi)(yi)個(ge)流(liu)對(dui)象和(he)返(fan)回(hui)(hui)(hui)一(yi)(yi)(yi)個(ge)流(liu)對(dui)象指(zhi)針(zhen)。但是(shi)(shi)對(dui)于返(fan)回(hui)(hui)(hui)一(yi)(yi)(yi)個(ge)流(liu)對(dui)象,程序必(bi)須重(zhong)新(拷(kao)貝)構造一(yi)(yi)(yi)個(ge)新的(de)(de)(de)流(liu)對(dui)象,也就(jiu)是(shi)(shi)說(shuo),連續的(de)(de)(de)兩個(ge)<<操(cao)(cao)(cao)作(zuo)符(fu)(fu)實(shi)際上是(shi)(shi)針(zhen)對(dui)不(bu)同對(dui)象的(de)(de)(de)!這無法讓(rang)人接受。對(dui)于返(fan)回(hui)(hui)(hui)一(yi)(yi)(yi)個(ge)流(liu)指(zhi)針(zhen)則(ze)不(bu)能連續使(shi)用(yong)<<操(cao)(cao)(cao)作(zuo)符(fu)(fu)。因(yin)此,返(fan)回(hui)(hui)(hui)一(yi)(yi)(yi)個(ge)流(liu)對(dui)象引用(yong)是(shi)(shi)惟一(yi)(yi)(yi)選擇(ze)。這個(ge)唯(wei)一(yi)(yi)(yi)選擇(ze)很(hen)關(guan)鍵,它說(shuo)明了引用(yong)的(de)(de)(de)重(zhong)要性(xing)(xing)以(yi)及無可替(ti)代性(xing)(xing),也許這就(jiu)是(shi)(shi)C++語言中引入引用(yong)這個(ge)概(gai)念的(de)(de)(de)原因(yin)吧(ba)。 賦值(zhi)(zhi)(zhi)操(cao)(cao)(cao)作(zuo)符(fu)(fu)=。這個(ge)操(cao)(cao)(cao)作(zuo)符(fu)(fu)象流(liu)操(cao)(cao)(cao)作(zuo)符(fu)(fu)一(yi)(yi)(yi)樣,是(shi)(shi)可以(yi)連續使(shi)用(yong)的(de)(de)(de),例(li)如:x = j = 10;或者(x=10)=100;賦值(zhi)(zhi)(zhi)操(cao)(cao)(cao)作(zuo)符(fu)(fu)的(de)(de)(de)返(fan)回(hui)(hui)(hui)值(zhi)(zhi)(zhi)必(bi)須是(shi)(shi)一(yi)(yi)(yi)個(ge)左值(zhi)(zhi)(zhi),以(yi)便可以(yi)被繼續賦值(zhi)(zhi)(zhi)。因(yin)此引用(yong)成了這個(ge)操(cao)(cao)(cao)作(zuo)符(fu)(fu)的(de)(de)(de)惟一(yi)(yi)(yi)返(fan)回(hui)(hui)(hui)值(zhi)(zhi)(zhi)選擇(ze)。

(5)在另外的(de)(de)一(yi)(yi)(yi)些操作符中,卻(que)千萬不能返(fan)(fan)回引用(yong)(yong):+-*/ 四則運算符。主要原(yuan)因(yin)(yin)是這四個操作符沒有side effect,因(yin)(yin)此,它們(men)必須構造一(yi)(yi)(yi)個對(dui)(dui)(dui)象(xiang)(xiang)(xiang)作為(wei)(wei)返(fan)(fan)回值,可(ke)選的(de)(de)方(fang)案包括:返(fan)(fan)回一(yi)(yi)(yi)個對(dui)(dui)(dui)象(xiang)(xiang)(xiang)、返(fan)(fan)回一(yi)(yi)(yi)個局部變量的(de)(de)引用(yong)(yong),返(fan)(fan)回一(yi)(yi)(yi)個new分配的(de)(de)對(dui)(dui)(dui)象(xiang)(xiang)(xiang)的(de)(de)引用(yong)(yong)、返(fan)(fan)回一(yi)(yi)(yi)個靜態(tai)對(dui)(dui)(dui)象(xiang)(xiang)(xiang)引用(yong)(yong)。根據前(qian)面提(ti)到的(de)(de)引用(yong)(yong)作為(wei)(wei)返(fan)(fan)回值的(de)(de)三個規則,第2、3兩個方(fang)案都被否決(jue)了(le)。靜態(tai)對(dui)(dui)(dui)象(xiang)(xiang)(xiang)的(de)(de)引用(yong)(yong)又因(yin)(yin)為(wei)(wei)((a+b) == (c+d))會永遠為(wei)(wei)true而導致錯(cuo)誤。所以可(ke)選的(de)(de)只剩(sheng)下返(fan)(fan)回一(yi)(yi)(yi)個對(dui)(dui)(dui)象(xiang)(xiang)(xiang)了(le)。

\引用的總結

(1)在引用的(de)使用中,單(dan)純(chun)給某個變量(liang)取個別名(ming)是(shi)毫無意義的(de),引用的(de)目的(de)主(zhu)要用于在函數(shu)參數(shu)傳遞中,解決大塊數(shu)據(ju)或(huo)對(dui)象(xiang)的(de)傳遞效率和空間不如意的(de)問題。

(2)用(yong)引(yin)用(yong)傳(chuan)遞(di)函數(shu)的參(can)數(shu),能保(bao)證參(can)數(shu)傳(chuan)遞(di)中(zhong)不產生副本(ben),提高(gao)傳(chuan)遞(di)的效率(lv),且通過const的使用(yong),保(bao)證了引(yin)用(yong)傳(chuan)遞(di)的安全性。

(3)引(yin)用與指(zhi)(zhi)針(zhen)(zhen)的區別(bie)是(shi),指(zhi)(zhi)針(zhen)(zhen)通過(guo)某個指(zhi)(zhi)針(zhen)(zhen)變(bian)量指(zhi)(zhi)向(xiang)一個對象后,對它所(suo)指(zhi)(zhi)向(xiang)的變(bian)量間接操作。程序(xu)中使用指(zhi)(zhi)針(zhen)(zhen),程序(xu)的可讀性(xing)差;而引(yin)用本身就是(shi)目(mu)(mu)標變(bian)量的別(bie)名,對引(yin)用的操作就是(shi)對目(mu)(mu)標變(bian)量的操作。

(4)使用(yong)引用(yong)的(de)(de)時機。流操(cao)作(zuo)符(fu)(fu)<<和(he)>&gt;、賦值(zhi)操(cao)作(zuo)符(fu)(fu)=的(de)(de)返回值(zhi)、拷貝構造函數的(de)(de)參數、賦值(zhi)操(cao)作(zuo)符(fu)(fu)=的(de)(de)參數、其它情(qing)況都推薦使用(yong)引用(yong)。

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)