?
[原創文章歡迎轉載,但請保留作者信息]
Justin 于 2009-10-26
布道到這個時候,
Scott Meyers
已經開始語重心長的講授C++程序員的生存哲學:吝嗇。
這里,高尚是高尚者的墓志銘,const是吝嗇者的通行證。咱玩兒C++啥都要吝嗇,無論什么對象,沒有特殊關系的就只能眼看手不動。要做到不讓別人動自己的寶貝,就要用const,哪怕你心里沒那么小氣,也要拋出個const出來顯示咱的層次:強中自有強中手,個個const不離手……
上面純屬個人瞎扯,書上沒有這樣寫,這樣寫只因為瞎扯能讓人記憶猶新。但是從大師的題目(Use const whenever possible)就可以看出來,所謂的瞎扯其實也不是完全沒有道理。
首先要知道const可以通用在對象上,函數參數和返回值上,甚至是用在限制函數本身。
大量聲明const的做法有點“寧可錯殺一千不可放過一個”的味道,就算我濫用了const,頂多在編譯的時候報錯:“對不起,您要修改的對象是個const…… ”反之,如果因為疏忽沒有定義一個原本應該是const的對象,造成的錯誤就是隱性的。所以只要存在不需要改動的(或者根本就不能改動的)對象,就把她打上const的烙印,讓外人動不得。
大師就是大師,說完了這些,馬上給自己留了一條后路……
?? Compilers enforce bitwise constness, but you should program using conceptual constness.
這里有提到constness(這個詞有點難解釋,就理解為const的名詞形式吧sigh…)的兩個門派: bitwise學院派和conceptual實用派。
bitwise constness陣營應該都是很學究的,這里認為如果一個函數被聲明是const,你就絕對不能修改對象里的任何成員(static成員除外)。做人就要表里如一,說一不二。
主張conceptual constness流的當然都比較好說話,雖然你是const黨,但需要的時候,還是應該有例外的嘛。正所謂人無完人,const也沒有絕對的const~
編譯器都是古板的,所以它很堅定D投身學院派。跟著大師混的程序員都是聰明的,當然是實用派的粉絲。
但是粉絲又要依賴古板的編譯器……
所以大師傳授了獨門絕學mutable:用mutable限定的對象,哪怕是在const函數里,一樣可以修改,愛咋玩咋玩!
和const有關的還有在const和非const對象間的轉換問題(用const_cast和static_cast完成兩個方向的轉換),不過層次太高,我還沒能看到有需要用的地方@#¥%