文章大綱:
1.題目簡介
2.題目關(guān)鍵解答
3.知識總結(jié)和擴展
題目簡介
題目關(guān)鍵解答
知識總結(jié)和擴展
1.const的作用,防止變量被修改。維護變量的安全性
2.引用垄潮,防止產(chǎn)生一次拷貝副本。浪費內(nèi)存
將“引用”作為函數(shù)參數(shù)有哪些特點?
(1)傳遞引用給函數(shù)與傳遞指針的效果是一樣的怕磨。這時,被調(diào)函數(shù)的形參就成為原來主調(diào)函數(shù)中的實參變量或?qū)ο蟮囊粋€別名來使用寞缝,所以在被調(diào)函數(shù)中對形參變量的操作就是對其相應(yīng)的目標對象(在主調(diào)函數(shù)中)的操作癌压。
(2)使用引用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒有產(chǎn)生實參的副本荆陆,它是直接對實參操作滩届;而使用一般變量傳遞函數(shù)的參數(shù),當發(fā)生函數(shù)調(diào)用時被啼,需要給形參分配存儲單元帜消,形參變量是實參變量的副本;如果傳遞的是對象浓体,還將調(diào)用拷貝構(gòu)造函數(shù)泡挺。因此,當參數(shù)傳遞的數(shù)據(jù)較大時命浴,用引用比用一般變量傳遞參數(shù)的效率和所占空間都好娄猫。
(3)使用指針作為函數(shù)的參數(shù)雖然也能達到與使用引用的效果贱除,但是,在被調(diào)函數(shù)中同樣要給形參分配存儲單元媳溺,且需要重復(fù)使用"*指針變量名"的形式進行運算月幌,這很容易產(chǎn)生錯誤且程序的閱讀性較差;另一方面悬蔽,在主調(diào)函數(shù)的調(diào)用點處扯躺,必須用變量的地址作為實參。而引用更容易使用蝎困,更清晰录语。將“引用”作為函數(shù)返回值類型的格式、好處和需要遵守的規(guī)則?
格式:類型標識符 &函數(shù)名(形參列表及類型說明){ //函數(shù)體 }
好處:在內(nèi)存中不產(chǎn)生被返回值的副本禾乘;(注意:正是因為這點原因澎埠,所以返回一個局部變量的引用是不可取的。因為隨著該局部變量生存期的結(jié)束始藕,相應(yīng)的引用也會失效失暂,產(chǎn)生runtime error!
注意事項:
(1)不能返回局部變量的引用。這條可以參照Effective C++[1]的Item 31鳄虱。主要原因是局部變量會在函數(shù)返回后被銷毀弟塞,因此被返回的引用就成為了"無所指"的引用,程序會進入未知狀態(tài)拙已。
(2)不能返回函數(shù)內(nèi)部new分配的內(nèi)存的引用决记。這條可以參照Effective C++[1]的Item 31游昼。雖然不存在局部變量的被動銷毀問題危纫,可對于這種情況(返回函數(shù)內(nèi)部new分配內(nèi)存的引用),又面臨其它尷尬局面纳鼎。例如建车,被函數(shù)返回的引用只是作為一個臨時變量出現(xiàn)扩借,而沒有被賦予一個實際的變量,那么這個引用所指向的空間(由new分配)就無法釋放缤至,造成memory leak潮罪。
(3)可以返回類成員的引用,但最好是const领斥。這條原則可以參照Effective C++[1]的Item 30嫉到。主要原因是當對象的屬性是與某種業(yè)務(wù)規(guī)則(business rule)相關(guān)聯(lián)的時候,其賦值常常與某些其它屬性或者對象的狀態(tài)有關(guān)月洛,因此有必要將賦值操作封裝在一個業(yè)務(wù)規(guī)則當中何恶。如果其它對象可以獲得該屬性的非常量引用(或指針),那么對該屬性的單純賦值就會破壞業(yè)務(wù)規(guī)則的完整性嚼黔。
(4)流操作符重載返回值申明為“引用”的作用:
流操作符<<和>>细层,這兩個操作符常常希望被連續(xù)使用惜辑,例如:cout << "hello" << endl; 因此這兩個操作符的返回值應(yīng)該是一個仍然支持這兩個操作符的流引用∫呤辏可選的其它方案包括:返回一個流對象和返回一個流對象指針韵丑。但是對于返回一個流對象,程序必須重新(拷貝)構(gòu)造一個新的流對象虚缎,也就是說,連續(xù)的兩個<<操作符實際上是針對不同對象的钓株!這無法讓人接受实牡。對于返回一個流指針則不能連續(xù)使用<<操作符。因此轴合,返回一個流對象引用是惟一選擇创坞。這個唯一選擇很關(guān)鍵,它說明了引用的重要性以及無可替代性受葛,也許這就是C++語言中引入引用這個概念的原因吧题涨。賦值操作符=。這個操作符象流操作符一樣总滩,是可以連續(xù)使用的纲堵,例如:x = j = 10;或者(x=10)=100;賦值操作符的返回值必須是一個左值,以便可以被繼續(xù)賦值闰渔。因此引用成了這個操作符的惟一返回值選擇
再單獨說明一下注意事項的(1)和(2)
可能有人會問(1)中席函,不管是局部變量還是其他變量我都把它通過函數(shù)return給了一個實例,它就算被銷毀了還是有實例持有這個引用冈涧,怎么會沒有實例指向這個引用了茂附。
答案是:局部變量的銷毀發(fā)生在函數(shù)return之前。(這個涉及到更加底層的知識督弓,有興趣可以查閱相關(guān)資料) 所以當你return的時候营曼,你的局部變量就銷毀了。也就沒有沒有哪個實例指向這個引用愚隧。返回過去也不知道是哪個引用
(2)中如果你new了一個內(nèi)存出來蒂阱,然后去返回這個引用。那么當函數(shù)結(jié)束時狂塘,這個變量被銷毀了蒜危。但是你沒有釋放這個內(nèi)存。就會造成泄漏睹耐。再也找不到這個內(nèi)存了辐赞。
文章參考來源:
http://www.cnblogs.com/hongzg1982/articles/2145312.html