對C++中引用的補充說明(實例)

#include <iostream>

#include <string>

using namespace std;

void main(int argc,char* argv[])

{

int a=10;

int b=20;

int &rn=a;

cout<<rn<<""<<a<<endl;

cout<<&rn<<""<<&a<<endl;//c++中是無法取得應用的內存地址的,取引用的地址就是取目標的地址!

rn=b;//把引用指向另一個目標----變量b

cout<<&rn<<""<<&a<<""<<&b<<endl;

rn=100;//試圖改變b的值

cout<<a<<""<<b<<endl;//輸出修改後的結果

cin.get();

}

由于引用本身就是目標的一個別名,引用本身的地址是一個沒有意義的值,所以在c++中是無法取得引用的內存地址的。取引用的地址就是取目標的地址,c++本身就根本不提供獲取引用內存地址的方法。

引用一單初始化,就不在能夠被指向其它的目標,雖然編譯不會出錯,但操作是不起作用的,實際上還是指向最先指向的目標。

上面代碼中的rn=b實際在計算機看來就是a=b,所以修改的還是a的值。#include <iostream>

#include <string>

using namespace std;

void main(int argc,char* argv[])

{

int a=10;

void &rn=a;// 錯誤的,void即無類型的類型

int a[100];

int &ra[100]=a;//錯誤,不能聲明引用數組

cin.get();

}上面的兩錯誤要記住引用的特性,void修飾是不能夠聲明引用的,引用是不能夠聲明數組的,即不能夠聲明引用數組。

對C++中引用的補充說明(實例)
更多內容請看C/C++技術專題 C/C++應用實例專題,或

下面我們要說一下,也是補充中最重要最需要把握的內容,也是對傳統函數操作的內存狀態的一個補充學習。下面我們來看一個例子:

#include <iostream>

#include <string>

using namespace std;

float c;

float test(float,float);

void main(int argc,char* argv[])

{

float pn=test(3.0f,1.2f);

cout<<pn;

cin.get();

}

float test(float a,float b)

{

c=a*b;

return c;

}在上面的代碼中我們可能我們可能以爲函數返回的就是c變量,呵呵。這麽想可能就錯了,普通情況下我們在函數內進行普通值返回的時候在內存棧空間內其實是自動産生了一個臨時變量temp,它是返回值的一個副本一個copy,函數在return的時候其實是return的這個臨時産生的副本。

數據在內存中的情況如下圖:

對C++中引用的補充說明(實例)
上圖明確表示了副本領事變量的情況。

對C++中引用的補充說明(實例)
更多內容請看C/C++技術專題 C/C++應用實例專題,或

下面我們再來看一種情況,就是把返回值賦給引用:

#include <iostream>

#include <string>

using namespace std;

float c;

float test(float,float);

void main(int argc,char* argv[])

{

float &pn=test(3.0f,1.2f);//警告:返回的將是臨時變量,pn引用將成爲臨時變量的別名!

cout<<pn;

cin.get();

}

float test(float a,float b)

{

c=a*b;

return c;

}float &pn=test(3.0f,1.2f);這句在bc中能夠編譯通過,因爲bc擴展設置爲臨時變量設置引用,那麽臨時變量的生命周期將和引用的生命周期一致,但在vc中卻不能通過編譯,因爲一但test()執行過後臨時變量消失在棧空間內,這時候pn將成爲一個沒有明確目標的引用,嚴重的時候會導致內存出錯。它在內存中的情況見下圖:

對C++中引用的補充說明(實例)
我們在圖中看到,由于函數仍然是普通方法返回,所以仍然會有一個副本臨時變量産生,只不過,這一次只是返回一個目標地址,在main中目標地址被賦予了引用pn。

對C++中引用的補充說明(實例)
更多內容請看C/C++技術專題 C/C++應用實例專題,或

下面我們再看一種情況,這是返回引用給變量的情況:

#include <iostream>

#include <string>

using namespace std;

float c;

float& test(float,float);

void main(int argc,char* argv[])

{

float pn=test(3.0f,1.2f);

cout<<pn;

cin.get();

}

float &test(float a,float b)

{

c=a*b;

return c;

}這種返回引用給變量的情況下,在內存中,test()所在的棧空間內並沒有産生臨時變量,而是直接將全局變量c的值給了變量pn,這種方式是我們最爲推薦的操作方式,因爲不産生臨時變量直接賦值的方式可以節省內存空間提高效率,程序的可讀性也是比較好的。

它在內存中的情況見下圖:

對C++中引用的補充說明(實例)

對C++中引用的補充說明(實例)
更多內容請看C/C++技術專題 C/C++應用實例專題,或

最後的一種情況是函數返回引用,並且發值賦給一個引用的情況:

#include <iostream>

#include <string>

using namespace std;

float c;

float& test(float,float);

void main(int argc,char* argv[])

{

float &pn=test(3.0f,1.2f);

cout<<pn;

cin.get();

}

float &test(float a,float b)

{

c=a*b;

return c;

}這種情況同樣也不産生臨時變量,可讀和性能都很好,但有一點輕易弄錯,就是當c是非main的局部變量或者是在堆內存中臨時開辟後來又被fee掉了以後的區域,這種情況和返回的指針是局部指針的後果一樣嚴重,會導致引用指向了一個不明確的地址,這種情況在內存中情況見下圖:

對C++中引用的補充說明(實例)
由于這種情況存在作用域的問題,故我們推薦采用第三種方式處理。

對C++中引用的補充說明(實例)
更多內容請看C/C++技術專題 C/C++應用實例專題,或

接下來我們說幾個利用引用作爲左值參與計算的例子,這一點一非常重要,對于理解返回引用的函數是非常有幫助的。

#include <iostream>

#include <string>

using namespace std;

float c;

float& test(float,float);

void main(int argc,char* argv[])

{

float &pn=test(3.0f,1.2f);

cout<<pn<<endl;

test(3.0f,1.2f)=12.1;//把函數作左值進行計算!

cout<<pn;

cin.get();

}

float &test(float a,float b)

{

c=a*b;

return c;

}通常來說函數是不能作爲左值,因爲引用可以做爲左值,所以返回引用的函數自然也就可以作爲左值來計算了。在上面的代碼中:

float &pn=test(3.0f,1.2f);

進行到這裏的時候pn已經指向到了目標c的地址了。

接下來運行了

test(3.0f,1.2f)=12.1;

把函數作左值進行計算,這裏由于test是返回引用的函數,其實返回值返回的地址就是c的地址,自然c的值就被修改成了12.1。

對C++中引用的補充說明(實例)
更多內容請看C/C++技術專題 C/C++應用實例專題,或

C++箴言:必須返回對象時別返回引用
  一旦程序員抓住對象傳值的效率隱憂,很多人就會成爲狂熱的聖戰分子,誓要根除傳值的罪惡,無論它隱藏多深。他們不屈不撓地追求傳引用的純度,但他們全都犯了一個致命的錯誤:他們開始傳遞並不存在的對象的引用。...查看完整版>>C++箴言:必須返回對象時別返回引用
 
深入探討C++中的引用
  摘要:介紹C++引用的基本概念,通過具體的應用分析與說明,對引用進行全面、透徹地闡述。  要害詞:引用,const,多態,指針  引用是C++引入的新語言特性,是C++常用的一個重要內容之一,正確、靈活地使用引...查看完整版>>深入探討C++中的引用
 
C++引用計數的智能指針有效回收方法
C++引用計數的智能指針有效回收方法
  引用計數指針是否能有效地回收,對系統意外關機之後數據的恢複來說至關重要,要害是要避免對象複制。  怎樣從災難性故障中,恢複一個長期運行、系統級的後台守護進程或者服務,在如今的軟件設計過程中,已成爲...查看完整版>>C++引用計數的智能指針有效回收方法
 
C++中的引用(1)
引用是C++引入的新語言特性,是C++常用的一個重要內容之一,正確、靈活地使用引用,可以使程序簡潔、高效。引用簡介引用就是某一變量(目標)的一個別名,對引用的操作與對變量直接操作完全一樣。引用的聲明方法:類...查看完整版>>C++中的引用(1)
 
C++ FAQ閱讀筆記[2]--引用
[8.1] 什麽是引用?一個對象的別名(一個替換的名字)叫引用引用經常被用來做在函數參數的引用傳遞中void swap(int& i,int& j){ int tmp=i; i=j; j=tmp;}int main(){ int x,y; swap(x,y);}這裏i和j是main是函數...查看完整版>>C++ FAQ閱讀筆記[2]--引用
 
深入探討C++中的引用
摘要:介紹C++引用的基本概念,通過詳細的應用分析與說明,對引用進行全面、透徹地闡述。  關鍵詞:引用,const,多態,指針  引用是C++引入的新語言特性,是C++常用的一個重要內容之一,正確、靈活地使用引用,...查看完整版>>深入探討C++中的引用
 
引用外部圖片素材實例
                                                          ...查看完整版>>引用外部圖片素材實例
 
中國聯通針對工信部文件的補充說明
  【eNet矽谷動力專稿】3月18日消息,針對近日工信部發表的文件《關于做好發放3G牌照後續工作的通知》中指出有關中國聯通被授權只能在北方10省及南方的重慶、四川開展固定網本地電話業務,而未提及能否在南方各省經...查看完整版>>中國聯通針對工信部文件的補充說明
 
CECT9898添加個性化字符的補充說明
前段時間有機油提出在緊靠"中國移動"(手機待機桌面顯示的運營商標志,此標志是去不掉的)下行的地方可以個性化任意添加約12個字符的情況,此機油使用的是第三版9898.很多使用第四版的機油(包括我)試了N遍都不行,最後得出...查看完整版>>CECT9898添加個性化字符的補充說明
 
 
回到王朝網路移動版首頁