C++中,琳琅滿目的書籍,也不遺餘力的如此吹捧。可是事實證明,到目前爲止,我們國家還沒有任何一位高人寫出任何一本令我歎爲觀止的C++教程,我不得不感慨萬分。顯然,每個接受C++面向對象思想的人,都應該清楚,所謂面向對象,絕對不是要面向一個矮胖的數據塊,而是要用抽象的思維去建立一個幾乎能夠媲美現實世界的程序架構。
我們還是回到問題的本身。
對於函數中參數的傳遞來說,我確定一定以及肯定地認爲,只要你無意使傳入對象返回任何結果,你就應該將它聲明爲常引用。
什麼叫常引用?很多人的腦袋開始像飢腸轆轆的肚子一樣,嘰嘰咕咕的叫起來。
還是得先看看引用吧。
C++決定,任何人,任何時候,可以給一個已知的對象(或者變量)再起一個名字----這就是引用。表達式可以是這樣:
int i = 9;
int& ii = i;
CString str(“idealsoft”);
CString& strAlias = str;
經常猶抱琵琶半遮面的引用,爲它的粗心付出了代價。那個取地址的操作符“&”,很不情願的站在了別名(alias)的左邊,雖然它的心還在右邊,雖然它還是在取用右邊人物的地址,是的,是這樣的,這就是引用,實質上就是將一個現有的地址賦給另外一個常地址。
我們都知道引用是不能再次賦值的,這符合const變量的特徵,它被來自原變量的地址初始化。其實,就像它一樣:
char* const p = “idealsoft”;
一個內容可以改變,而自身無法改變的指針,給了我們另外的一個神祕而詭異的名字,它就是傳說中的引用。好,我們把它再加上一個const,讓它的內容也不能被改變:
const char* const p = “idealsoft”;
這是什麼妖怪?我曾經似乎在以前的const詳解裏邊說過,這種指針在編程的時候基本上沒有用武之地。那它到底是什麼?其實,它就是一個常引用,就像是水中的月亮,你只能看,卻永遠也別指望碰到它。
好,我們就來看看水中的月亮。
Print(const CString& str) //驕傲的水中之月
{
printf(“I’m just %s\n”, str); //曾經我問過,爲什麼printf能夠打印CString?
}
……
int main()
{
CString str(“idealsoft”);
Print(str);
}
我們爲什麼要用常引用?而不直接用C++“標榜”的對象,或者其它?顯然,我們已經知道引用就相當於一個不可變的指針,在參數傳遞的時候,完全不必將整個對象壓棧,而僅需壓入一個指針,你可以想象一個充斥着一望無垠對象的程序,它的效率將會怎樣的不堪入目。常引用則同時避免了,我們的參數被惡意的篡改。
打印之後,水中之月依然冷豔而一塵不染,在以後的日子裏,想必,你也會像我一樣,立即決定非她不娶並決定和她廝守終身。