天天看點

《好學的C++程式設計》——2.2 别名竟然登上大雅之堂

本節書摘來自異步社群出版社《好學的c++程式設計》一書中的第2章,第2.2節,作者: 張祖浩 , 沈天晴,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

好學的c++程式設計

别名俗稱外号或綽号,如“丫蛋”、“狗熊”等。c++中把别名雅稱為“引用”。但“引用”有“引而用之”的意思,難免會産生二義性。為此,本書就直用“别名”作叙述。不過,看别的書時,若看到“引用”二字,有可能是“别名”的雅稱,這要注意。特别是考卷中遇到“引用”二字,要多加判斷是不是“别名”的意思,否則弄不好要出錯的。

變量可以取别名,這時變量名就是該别名的實名。别名和實名屬于同一個變量。

别名和實名共用同一個存儲空間

我們知道,變量聲明後,系統會配給變量存儲空間。也就是說,實名有系統所配給的存儲空間。但别名聲明後不另配存儲空間,而是别名和實名共用同一個存儲空間。兩名不分彼此。通路别名和通路實名同樣都是算數的。實際是對同一個存儲空間進行寫值或讀值,實際是一回事。是以,通路别名就是通路實名。通路實名就是通路别名。可得出如下等價式:

程式1

(注釋:事物a與事物b等價,一般是指a與b在某些方面具有共同的性質,人們在研究這些共同的性質時,對事物a、b不加以區分,認為a、b是同一個事物。“圖檔 5”是等價符号)

獎勵大會公然呼請别名上台實施獎勵

有的讀者可能會産生疑問,既然變量有變量名,何必要另取别名?豈不多此一舉?隆重的獎勵大會,豈能按别名實施獎勵?太不嚴肅了吧!

可是,拿社會生活來說,确實人人都有大名。但在好多場合,卻非用别名不可!例如,體育競賽中,按獎勵規程要對頭三名進行獎勵。但在寫獎勵規程時,對獎勵對象當然不可能用實名來寫。隻能以“冠軍”、“亞軍”和“季軍”作為頭三名的别名寫出如下的獎勵規程:

對“冠軍”獎 8000 元 對“亞軍”獎 5000 元 對“季軍”獎 2000 元

待競賽完畢,得知張三、李四和王二榮獲頭三名。這時,“冠軍”、“亞軍”和“季軍”就分别是張三、李四和王二的别名啦。可得出上述三個獎勵句的等價句:

程式2

用頭三名的實名,來調用獎勵規程實施獎勵時,呼請“冠軍”、“亞軍”和“季軍”上台領獎。按獎勵規程一字一句給别名實施獎勵。一切都嚴格按獎勵規程之内的程式辦。但實際來看,卻是張三、李四和王二應邀上台領獎的。而獎金實際是落入張三、李四和王二的錢袋。這說明獎勵(通路)别名,就是獎勵(通路)實名。二者實際是一回事,真是:

獎勵别名于規程之内, 實際就是 獎勵實名于規程之外。

因為用頭三名實名,來調用獎勵規程實施獎勵時,獎勵别名和獎勵實名實際就是一回事了。

奧運會按規程進行獎勵時,國旗、國歌、運動員站位、獎章質别以及獎金等,一切都是嚴格按規程中的别名實施操作。看來,别名真的是登上大雅之堂了。

别名變量初次出場也必須作個聲明,聲明時要表明别名是何類型,是哪個變量的别名。

設已聲明了一個整型變量

現在要給a另取一個别名叫x ,則可作如下聲明:

在聲明中int和 & 一起作為一個整體,描述了x是一個int型别名變量。同時,變量a用“=”給别名變量x初始化。這裡初始化的意思是确立了x是a的别名。記住!記住:誰給别名初始化,别名就是誰的。别名x是a的别名,a就是x的實名。x和a的類型必須一緻。這裡二者類型都是int型。

這裡要注意,在聲明中,一定要把int、& 和 = 作為一個整體來看,描述了x是一個int型别名變量,是變量a的别名。而變量a則是x的實名。即使是在如下的聲明中:

int和 &x不緊靠在一起,但仍然是在同一個聲明語句中,也應把int、& 和 = 結合一起作為一個整體來看。這個整體描述了x是一個int型别名變量,是變量a的别名。如果在這裡脫離整體考慮,而認為a是對&x指派,或是對x指派,那就錯啦!

别名變量聲明的一般形式為:

别名變量在聲明的同時必須用一個同類型的變量給予初始化。這一初始化,就确定了該别名是該變量的别名,該變量是該别名的實名。這種關系終身不變。真是:一初定終身。

系統對别名變量不配給存儲空間。别名和實名倆共用系統配給實名變量的存儲空間。

上面講了,在c++中聲明别名的同時,必須用某變量來給别名初始化。以确定該别名就是該變量的别名。該變量名就是該别名的實名。有這關鍵的一步,就能實作“通路别名就是通路實名”,示例如下。

【例2-2】說明通路别名就是通路實名。程式如下:

程式運作結果為:

程式中,a行聲明3個int型變量a、b和c,并初始化。b行輸出a、b和c,輸出結果如f行所示。b行輸出語句中的‘t’是橫向跳格的意思,‘n’是換行的意思,見表2-2。

在c行聲明了3個int型别名變量x、y和z,并且分别用變量a、b和c給予初始化。這就明确了x、y和z分别是a、b和c的别名。

在d行的一對花括弧内,對别名x、y和z都作了增值指派。即分别取三者的原值加上一定的值後,再重新分别賦給三者。

e行又輸出a、b和c,輸出結果如g行所示。

奇怪!從f和g行的輸出結果相比來看,a、b和c的值都變大了。可是,從整個程式來看,并未對a、b和c進行增值指派呀!何以會變大呢?

關鍵在于c行的語句,用變量a、b、c分别給别名x、y、z初始化。記得嗎?“誰給别名變量初始化,别名就屬于誰”,這就明确了x、y和z分别是a、b和c的别名。如上所述“通路别名就是通路實名”。在d行,雖然是在花括弧内對别名進行增值指派,但是實際就是對花括弧之外的實名(a行)進行增值指派。具體說,就是有如下的關系:

以後會看到,d行花括弧内的程式可以讓一個函數來完成。到那時,可以看到如下情景:

通路别名于函數之内  實際就是  通路實名于函數之外

這恰似按獎勵規程内對冠、亞、季軍實施獎勵,實際就是規程之外對張三、李四和王二實施獎勵。在這裡,先提前讓大家領會一下,别名在後面内容中會有精彩表現。

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結

繼續閱讀