[問題] 頂層、低層const
開發平台(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這件事嗎?
請板上的大師們不吝教導,看了好幾篇文章還是不理解為什麼要有這種機制...
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.251.33.237 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1624127378.A.D92.html
※ 編輯: museangel (111.251.33.237 臺灣), 06/20/2021 02:41:52
→
06/20 02:39,
4年前
, 1F
06/20 02:39, 1F
→
06/20 02:43,
4年前
, 2F
06/20 02:43, 2F
→
06/20 02:44,
4年前
, 3F
06/20 02:44, 3F
推
06/20 03:06,
4年前
, 4F
06/20 03:06, 4F
→
06/20 03:06,
4年前
, 5F
06/20 03:06, 5F
→
06/20 03:06,
4年前
, 6F
06/20 03:06, 6F
→
06/20 03:07,
4年前
, 7F
06/20 03:07, 7F
→
06/20 03:08,
4年前
, 8F
06/20 03:08, 8F
→
06/20 03:09,
4年前
, 9F
06/20 03:09, 9F
→
06/20 03:10,
4年前
, 10F
06/20 03:10, 10F
→
06/20 03:11,
4年前
, 11F
06/20 03:11, 11F
→
06/20 03:11,
4年前
, 12F
06/20 03:11, 12F
抱歉還是沒辦法理解,
假如:
const int i = 1;
const int *const j = &i;
const int *const k = j;
「但當我們 assign 值出來時, 我們是複製值」
k複製j的值,也就是取得j的記憶體存放的i位址。
「因此這最頂層變數參照被我們解參照了, 其常數性不再有意義」
請問j是在指派給*const k時被解參照嗎?
不太懂什麼時候最頂層變數被解參照…
我可以理解成:
「只要A變數被指派給B變數,就是僅僅傳遞A的值給B,不會傳遞其餘存在A變數上的特性,
而在B變數上,施加在A變數的種種特性都不會存在」嗎?
不過這又回到了為什麼A變數的種種特性都不會在B變數上面存在的問題了...
推
06/20 04:08,
4年前
, 13F
06/20 04:08, 13F
→
06/20 04:08,
4年前
, 14F
06/20 04:08, 14F
→
06/20 04:08,
4年前
, 15F
06/20 04:08, 15F
→
06/20 04:08,
4年前
, 16F
06/20 04:08, 16F
→
06/20 04:08,
4年前
, 17F
06/20 04:08, 17F
沒辦法理解copy之後為什麼原本變數的一部分特性就消失...
※ 編輯: museangel (111.251.33.237 臺灣), 06/20/2021 08:10:55
→
06/20 08:59,
4年前
, 18F
06/20 08:59, 18F
→
06/20 09:03,
4年前
, 19F
06/20 09:03, 19F
→
06/20 09:17,
4年前
, 20F
06/20 09:17, 20F
→
06/20 09:18,
4年前
, 21F
06/20 09:18, 21F
→
06/20 09:22,
4年前
, 22F
06/20 09:22, 22F
→
06/20 09:23,
4年前
, 23F
06/20 09:23, 23F
謝謝各位大師從各種不同角度說明,很開心終於理解了!
確實常數就是要限制特定變數的記憶體內的值不要被更動而已,
如果複製出去各自分離、互不干涉的,就不需要為新分出去的值加上不能更動的限制。
原本一直糾結在什麼頂層const、低層const,
沒有意識到,只要結合設定常數的目的:「不讓特定變數記憶體內的值更動」,
跟指派「是拷貝原本變數記憶體內的值」,
而由「拷貝出的值有無可能影響到常數變數記憶體內的值」,再去想就通了。
一、在基礎型別的指派中:
每個變數的記憶體位址裡面存有各自的值,
而const就是要保護被它套用的特定變數的記憶體位址內的值不被更改,
在拷貝過後,已經各自分離,
故新變數內的值無論怎麼更動都不會影響到常數變數記憶體內存放的值,
不用在新變數套上const。
二、在複合型別的指派中:
1.指向常數基礎型別的常數或非常數指標:
如前述,因為拷貝後各自分離,
可不在意此處是否為常數指標,只要關注被指向的基礎型別變數是否為常數,
而之所以還需要關注,是因為指標內存放的位址,
存有常數基礎型別變數被限制不能更動的值,非其他被複製出去已各自獨立的值。
2.參考常數基礎型別的常數參考:
因為參考會更動到基礎型別的記憶體內存放的值,(雖然不知道參考是怎麼封裝的指標...)
因此在被參考之物件為常數基礎型別時,就必須讓參考同樣是常數參考,
否則就會有可能更動到常數基礎型別變數的記憶體內所存放的值。
※ 編輯: museangel (111.251.33.237 臺灣), 06/20/2021 11:50:54
推
06/21 08:24,
4年前
, 24F
06/21 08:24, 24F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章