這些準則看標題都很簡單,不過內容就會介紹背後的前因後果,補充各種用法,有時真的越來越難以理解,就吸收多少算多少吧。
來看第三條準則:
Use "const" whenever possible
一開始都還非常好理解,開宗明義就告訴你好處是什麼─ const提供了一個方法,讓compiler跟programmer知道那些值不該被更改。當你確定某個值不該被改的時候就加const,讓compiler幫你卡關!
const可以在很多地方被使用─
const用在指標上,是用"*"號左右來決定不能該改的是指標指什麼還是指標指向的內容。
char greeting[] = "Hello";
const char *p = greeting; // non-const pointer, const data
char const *p = greeting;
char * const p = greeting; // const pointer, non-const data
const char * const p = greeting; // const pointer, const data
而STL中iterators其實就是像 T*
的pointer,而當你想要讓iterator指向的東西內容可以被更改,但不可讓這個iterator改指別的東西的話,要這樣寫:
const std::vector<int>::iterator iter = vec.begin(); // like T* const
*iter = 10; // ok!
++iter; // error!
反之,你要讓itertor可以改指別的東西,但指向的內容不能被更改的話,可以用const_iterator
,它的作用跟const T*
是一樣的
std::vector<int>::const_iterator cIter = vec.begin(); // like const T*
*cIter = 10; // error!
++iter; // ok!
另外在函式宣告的時候,const也可以被加在return value或是parameter上,或針對整個member function!
加在return type上通常不太會這樣使用,不過有時候可能會加來避免一些不恰當使用,例如
const Rational operator*(const Rational& lhs, const Rational& rhs);
雖然看起來很怪,但可以避免有人這樣call來用,可能typo...
if((a*b) = c)...
加在parameter上也是同理,多使用"c-o-n-s-t"加空白這6個字,可以避免掉一些手殘沒注意到的地方,划算!
這個const *
左右常常會搞混... 又const iterator
是 T* const
, const_iterator
才是 const T*
也是有點混亂...不過沒關係平常比較常用的應該是 const_iterator
(畢竟它才能指向別的, iter下去)
今天先看到這邊,明天再來看比較複雜的,bitwise const& logical const!