[問題] 頂層、低層const

作者: museangel (museangel)   2021-06-20 02:29:36
開發平台(Platform): (Ex: Win10, Linux, ...)
Win10
問題
剛入門學習C++,
C++ Primer, 5e, 2.4.3頂層的const小節提到:
「當我們拷貝一個物件,頂層const會被忽略。」
「另一方面,低層const永遠都不會被忽略。」
其中有個舉例:
const int ci = 42;
int &r = ci;//錯誤
1.「頂層const會被忽略、而低層就永遠不會」這個原則是從哪裡產生的呢?
為什麼不要一律保留const,而要區別頂層低層,並且有忽略跟保留的差異,
這是為了解決什麼問題嗎?
2.為什麼ci的頂層const沒有被忽略呢?如果照頂層const會被忽略的原則,
應該可以將普通int&繫結到const int物件上,為什麼不行呢?
是因為參考並沒有涉及拷貝的動作,單純只是給另一個變數加上別名而已,
所以就沒有忽略頂層const這件事嗎?
請板上的大師們不吝教導,看了好幾篇文章還是不理解為什麼要有這種機制...
作者: nh60211as   2021-06-20 02:39:00
你那不是拷貝物件,是取得物件的reference
作者: museangel (museangel)   2021-06-20 02:43:00
對耶 真的忽略這件事[email protected]@另外為什麼要有區分頂層跟低層的機制呢 怎麼不都保留呢
作者: LPH66 (-6.2598534e+18f)   2021-06-20 03:06:00
這裡應該是指一個指標本身的常數性和指標指向值的常數性常數性這種事是綁在變數上的, 只要有一個方式參照變數那就能談論這個參照存取的常數性 (不可變性)但當我們 assign 值出來時, 我們是複製值因此這最頂層變數參照被我們解參照了, 其常數性不再有意義因此講忽略有點簡略, 因為會忽略的原因是解參照取值了在這個例子裡, int& 這是一個 C++ 參照, 參照一個變數所參照的變數是 ci, 這裡是參照指定並沒有解參照取值所以就算是頂層的常數性依然會保留
作者: g0010726 (Kevin)   2021-06-20 04:08:00
用個比喻來形容好了, 一個不能被塗改的書像是圖書館內的書(const Book), 你在copy後得到的新書究竟能不能被塗改你可以自己決定,跟原本的書沒關係。但如果你有個reference或pointer代表著(指向)圖書館的書,這個狀況下const就該被保留,因為那本圖書館的書不該被塗改
作者: sarafciel (Cattuz)   2021-06-20 08:59:00
const不是變數與生俱來的特性 const是一種契約關於"某個特定位置上的某個值,我不會去改他"的契約然後參考不是別名 參考是一種拷貝 只是他copy的東西是位置 參考實際上是封裝後的指標 而不是別名你把問題想得太複雜了 實際上只是有沒有可能改到那個ci的值 所以這份契約要不要延續的問題
作者: howareuuu   2021-06-21 08:24:00
推比喻

Links booklink

Contact Us: admin [ a t ] ucptt.com