歡迎來到天天文庫
瀏覽記錄
ID:50415691
大?。?6.02 KB
頁數(shù):4頁
時間:2020-03-08
《將引用作為函數(shù)返回值.doc》由會員上傳分享,免費在線閱讀,更多相關內容在工程資料-天天文庫。
1、將引用作為函數(shù)返回值要以引用返回函數(shù)值,則函數(shù)定義時必須遵循以下格式:?類型標識符&函數(shù)名(形參列表及類型說明){//函數(shù)體}?可見,以引用返回函數(shù)值,定義函數(shù)時需要在函數(shù)名前加&。引用作為函數(shù)的返回值時,函數(shù)的返回值可以理解為函數(shù)返回了一個變量(事實上,函數(shù)返回引用時,它返回的是一個指向返回值的隱式指針),因此,值為引用的函數(shù)可以用作賦值運算符的左操作數(shù)。另外,用引用返回一個函數(shù)值的最大好處是,在內存中不產生被返回值的副本。?#include???usingnamespacestd;
2、?int&func(){staticintnum=0;???????return++num;}???voidmain(){???????inti;????????for(i=0;i<5;i++)???????????cout<3、示,可見函數(shù)func被當作賦值運算符的左操作數(shù)來使用了。圖13.1程序輸出結果?下面再給出一個使用返回引用的函數(shù)作為左值的例子,它更有力地揭示了返回引用的函數(shù)的本質。?#includeusingnamespacestd;?doublearray[5]={100.1,100.2,100.3,100.4,100.5};?double&change(inti){???????returnarray[i];}?intmain(){???????inti;????cout<<"原始值如下:";?4、??????for(i=0;i<5;i++)???????????cout<5、回值為double類型的引用,而該值又是一個由其參數(shù)i指定的數(shù)組array中元素的引用。因此,在主函數(shù)中,當語句“change(2)=3.14;”被執(zhí)行時,change函數(shù)返回的其實是對數(shù)組元素array[2]的引用。通過這個引用,array[2]被賦值3.14。隨后的語句“change(3)=-99.99;”同此原理。由于change返回的是數(shù)組中特定元素的引用,所以該函數(shù)可以放在賦值語句的左邊用來對這個數(shù)組元素進行賦值。注意前面講過沒有數(shù)組的引用,但是指向數(shù)組元素的引用時存在的。?在把引用作為返回值時6、有些一些地方需要提醒大家注意。?首先,不能返回局部變量或臨時變量的引用,但可以返回全局變量的引用,也就是說要注意被引用的對象不能超出作用域。主要原因是局部變量會在函數(shù)返回后被銷毀,因此被返回的引用就成為了“無所指”的引用,這是不被允許的。例如下面這段代碼就是錯誤的:?int&func(){???inti=10;???returni;}?在VisualC++6.0中,上述代碼在編譯時會拋出警告“warningC4172:returningaddressoflocalvariableortemporary”,7、盡管編譯器沒有報錯,但這仍然意味著一種不安定。而且在VisualC++6.0中實驗上述func()函數(shù)作為左值來使用的情況,結果表明賦值并未成功,這同樣告誡我們這種用法是絕對應當被禁止的。畢竟,當函數(shù)func()返回時,局部變量i就超出了作用域。于是由func()返回的對i的引用就是未定義的引用。而且,某些對標準C++支持更強的編譯器中會對上述func()作左值的情況報錯!另外,這類問題也可能會間接產生,這時的錯誤顯得更加隱蔽而不容易被發(fā)現(xiàn),所以當返回對一個對象的引用時,務必要仔細檢查這個對象是否會超出作8、用域。?其次,不能返回函數(shù)內部動態(tài)分配的內存的引用。雖然不存在局部變量的被動銷毀的問題,但是在此種情況下,仍然存在一些問題。例如,被函數(shù)返回的引用只是作為一個臨時變量出現(xiàn),而沒有被賦予一個實際的變量,那么這個引用所指向的由new分配的空間就無法被釋放,從而造成內存泄漏問題。?最后,可以返回類成員的引用,但最好是const常量。這是因為當對象的屬性是與某種業(yè)務規(guī)則相關聯(lián)的時候,其賦值常常與某些其它屬性或者對象的狀態(tài)有關,于是有必
3、示,可見函數(shù)func被當作賦值運算符的左操作數(shù)來使用了。圖13.1程序輸出結果?下面再給出一個使用返回引用的函數(shù)作為左值的例子,它更有力地揭示了返回引用的函數(shù)的本質。?#includeusingnamespacestd;?doublearray[5]={100.1,100.2,100.3,100.4,100.5};?double&change(inti){???????returnarray[i];}?intmain(){???????inti;????cout<<"原始值如下:";?
4、??????for(i=0;i<5;i++)???????????cout<5、回值為double類型的引用,而該值又是一個由其參數(shù)i指定的數(shù)組array中元素的引用。因此,在主函數(shù)中,當語句“change(2)=3.14;”被執(zhí)行時,change函數(shù)返回的其實是對數(shù)組元素array[2]的引用。通過這個引用,array[2]被賦值3.14。隨后的語句“change(3)=-99.99;”同此原理。由于change返回的是數(shù)組中特定元素的引用,所以該函數(shù)可以放在賦值語句的左邊用來對這個數(shù)組元素進行賦值。注意前面講過沒有數(shù)組的引用,但是指向數(shù)組元素的引用時存在的。?在把引用作為返回值時6、有些一些地方需要提醒大家注意。?首先,不能返回局部變量或臨時變量的引用,但可以返回全局變量的引用,也就是說要注意被引用的對象不能超出作用域。主要原因是局部變量會在函數(shù)返回后被銷毀,因此被返回的引用就成為了“無所指”的引用,這是不被允許的。例如下面這段代碼就是錯誤的:?int&func(){???inti=10;???returni;}?在VisualC++6.0中,上述代碼在編譯時會拋出警告“warningC4172:returningaddressoflocalvariableortemporary”,7、盡管編譯器沒有報錯,但這仍然意味著一種不安定。而且在VisualC++6.0中實驗上述func()函數(shù)作為左值來使用的情況,結果表明賦值并未成功,這同樣告誡我們這種用法是絕對應當被禁止的。畢竟,當函數(shù)func()返回時,局部變量i就超出了作用域。于是由func()返回的對i的引用就是未定義的引用。而且,某些對標準C++支持更強的編譯器中會對上述func()作左值的情況報錯!另外,這類問題也可能會間接產生,這時的錯誤顯得更加隱蔽而不容易被發(fā)現(xiàn),所以當返回對一個對象的引用時,務必要仔細檢查這個對象是否會超出作8、用域。?其次,不能返回函數(shù)內部動態(tài)分配的內存的引用。雖然不存在局部變量的被動銷毀的問題,但是在此種情況下,仍然存在一些問題。例如,被函數(shù)返回的引用只是作為一個臨時變量出現(xiàn),而沒有被賦予一個實際的變量,那么這個引用所指向的由new分配的空間就無法被釋放,從而造成內存泄漏問題。?最后,可以返回類成員的引用,但最好是const常量。這是因為當對象的屬性是與某種業(yè)務規(guī)則相關聯(lián)的時候,其賦值常常與某些其它屬性或者對象的狀態(tài)有關,于是有必
5、回值為double類型的引用,而該值又是一個由其參數(shù)i指定的數(shù)組array中元素的引用。因此,在主函數(shù)中,當語句“change(2)=3.14;”被執(zhí)行時,change函數(shù)返回的其實是對數(shù)組元素array[2]的引用。通過這個引用,array[2]被賦值3.14。隨后的語句“change(3)=-99.99;”同此原理。由于change返回的是數(shù)組中特定元素的引用,所以該函數(shù)可以放在賦值語句的左邊用來對這個數(shù)組元素進行賦值。注意前面講過沒有數(shù)組的引用,但是指向數(shù)組元素的引用時存在的。?在把引用作為返回值時
6、有些一些地方需要提醒大家注意。?首先,不能返回局部變量或臨時變量的引用,但可以返回全局變量的引用,也就是說要注意被引用的對象不能超出作用域。主要原因是局部變量會在函數(shù)返回后被銷毀,因此被返回的引用就成為了“無所指”的引用,這是不被允許的。例如下面這段代碼就是錯誤的:?int&func(){???inti=10;???returni;}?在VisualC++6.0中,上述代碼在編譯時會拋出警告“warningC4172:returningaddressoflocalvariableortemporary”,
7、盡管編譯器沒有報錯,但這仍然意味著一種不安定。而且在VisualC++6.0中實驗上述func()函數(shù)作為左值來使用的情況,結果表明賦值并未成功,這同樣告誡我們這種用法是絕對應當被禁止的。畢竟,當函數(shù)func()返回時,局部變量i就超出了作用域。于是由func()返回的對i的引用就是未定義的引用。而且,某些對標準C++支持更強的編譯器中會對上述func()作左值的情況報錯!另外,這類問題也可能會間接產生,這時的錯誤顯得更加隱蔽而不容易被發(fā)現(xiàn),所以當返回對一個對象的引用時,務必要仔細檢查這個對象是否會超出作
8、用域。?其次,不能返回函數(shù)內部動態(tài)分配的內存的引用。雖然不存在局部變量的被動銷毀的問題,但是在此種情況下,仍然存在一些問題。例如,被函數(shù)返回的引用只是作為一個臨時變量出現(xiàn),而沒有被賦予一個實際的變量,那么這個引用所指向的由new分配的空間就無法被釋放,從而造成內存泄漏問題。?最后,可以返回類成員的引用,但最好是const常量。這是因為當對象的屬性是與某種業(yè)務規(guī)則相關聯(lián)的時候,其賦值常常與某些其它屬性或者對象的狀態(tài)有關,于是有必
此文檔下載收益歸作者所有