天天看點

《C++面向對象高效程式設計(第2版)》——3.7 編譯器如何實作const 成員函數

本節書摘來自異步社群出版社《c++面向對象高效程式設計(第2版)》一書中的第3章,第3.7節,作者: 【美】kayshav dattatri,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

c++面向對象高效程式設計(第2版)

了解編譯器如何強制執行逐位常量性(<code>bitwise constantness</code>)非常有趣。記住,成員函數沒什麼特别,它隻是一個帶有奇怪名稱和this指針的函數。那麼,編譯器如何能檢測到成員的指派?

這非常簡單。資料成員和函數之間唯一的連接配接就是<code>this</code>指針。<code>const</code>成員函數必須把調用它的對象當做const對象,這可以通過将<code>this</code>指針聲明為指向<code>const</code>的指針輕松地做到,很簡單。現在來看看帶有顯式聲明this指針的howmany原型:

`

unsigned howmany(const tintstack* this);`

根據這個聲明,任何通過指針給對象内部的資料成員指派都是非法的,因為該this指針是一個指向常量的指針。

在同一個類中,可以包含兩個相同的函數,一個是<code>const</code>函數,另一個是非<code>const</code>函數。這完全可行,而且在某些環境中非常有用。

注意:

<code>const</code>成員函數不能在它的實作中調用另一個非<code>const</code>成員函數。因為相同的對象(相同的this指針)也可以調用非<code>const</code>成員函數,而此非const成員函數可以随意修改對象。這違反了調用const成員函數的常量性(<code>constantness</code>),編譯器将會檢測出來。

eiffel:

eiffel支援與const成員函數非常類似的概念。eiffel有兩種類型的成員函數:過程(<code>procedure</code>)和函數。過程與普通的成員函數類似,但它們無傳回值。函數是一個操作,根據對象中包含的值進行計算,并傳回計算的值,這樣的函數不會改變對象的狀态。是以,過程和函數都與<code>const</code>成員函數類似。<code>smalltalk</code>并沒有類似的概念。

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

繼續閱讀