1. 程式人生 > >2.6 const限定符與引用、指針

2.6 const限定符與引用、指針

bsp ext font 初始化 完全 一起 指針 屬於 十分

//看上去十分純潔無害的小東西,一和指針引用結合在一起就開始禍害人間 const類型:1.必須初始化;2.值不能變。 extern const:想讓某類const對象只在一個文件裏被定義,並在多個其他文件中聲明並使用它則使用關鍵字extern來修飾const類型。(因為const對象僅在文件內有效,見書P54)。
const的引用 所謂“對const 的引用”常常被稱為“常量引用”,而這種簡稱實際上是不合適的。因為引用並不是對象,所以引用並不存在所謂的“常”即恒定不變。(註意就好,本質上還是對於引用並非對象這個重點的涉及)//引用的對象是常量還是非常量可以決定其所能參與的操作,卻無論如何都不會影響到引用和對象的綁定關系本身。 2.5曾提及引用類型必須和所綁定對象的類型相一致,而這種觀點實際上是有兩個例外,第一個例外便是:初始化常量引用時允許用任意表達式作為初始值,允許為一個常量引用綁定一個非常量的對象、字面值甚至是一般表達式——只要不通過該常量引用改變其所綁定的對象即可(哪怕是通過該對象所綁定的其他引用來改變也無所謂)(具體編譯器如何這樣操作的,此處省略,詳見書P55)
有趣的是,初始化常量引用做選取的初始值並不設限,但是要綁定常量對象則必須用常量引用來綁定。
指向常量的指針 同常量引用相似:1.指向常量的指針不能用於改變其所指對象的值;2.要想存放常量對象的地址,則必須使用指向常量的指針。(引用和指針的不同:加const限定符後引用可以稱為“常量引用”,而指針被稱為“ 指向常量的指針”) 2.5曾提及指針類型必須和所指定對象的類型相一致,而這種觀點實際上也有兩個例外,第一個例外便是:允許一個指向常量的指針指向一個非常量——同樣,只要不通過該指針改變該非常量的值即可,該非常量的值並非不可改變。
const指針 指針是對象,所以自然可以加const限定符用於表示常量指針,與常量引用不同,常量引用實際上是綁定常量的引用,對應的是指向常量的指針。常量指針,詞眼不在於指針,而在於常量,所以:常量指針必須初始化,且其值不可改變,其寫法是把*放在const之前,用於說明指針是一個常量——不變的是指針本身而不是指向的那個值——指針本身是一個常量並不意味這不能通過指針修改其所指對象的值,能否這樣做完全依賴於所指對象的類型。 關於const與指針,分清以下三個概念即可: 1.指向常量的指針; 2.常量指針;(用constexpr來定義,是為頂層const) 3.指向常量的常量指針。
//看到頂層const和底層const的時候,筆者完全是懵逼的,懵逼了兩百多頁,在知乎、CSDN上尋找答案,最終才發現這應該是屬於中英文語境產生的理解上的差別
以筆者的膚淺認識來說,頂層const和底層const只是用於分辨對象和描述對象的概念罷了,目前並沒有在實際的編程過程中體現真正價值,更多是在註釋中予以旁註,真正需與顧慮的是頂層const和底層const所體現的原則。 頂層const——表示指向常量的指針就是個常量;(此處的指針可替換為任何數據類型:算術類型,類等等) 底層const——表示指針所指向的對象/引用所綁定的對象就是個常量。(此處的指針/引用就是指復合類型的基本類型有關) //而實際上,二者的區別在前言中已經說的很明確了,這裏不加累贅,要增加進一步理解,還是在看書中去體會把

2.6 const限定符與引用、指針