iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
自我挑戰組

Effective C++ 讀書筆記系列 第 5

[Day 5] Use const whenever possible (1)

  • 分享至 

  • xImage
  •  

前言

這些準則看標題都很簡單,不過內容就會介紹背後的前因後果,補充各種用法,有時真的越來越難以理解,就吸收多少算多少吧。

能用const就用!

來看第三條準則:

Use "const" whenever possible

一開始都還非常好理解,開宗明義就告訴你好處是什麼─ const提供了一個方法,讓compilerprogrammer知道那些值不該被更改。當你確定某個值不該被改的時候就加const,讓compiler幫你卡關!

const可以在很多地方被使用─

  • classses外:global或namespace中的constants,或static的object
  • classes內:static/ non-static的成員
  • pointers: 指標本身,或它指向的內容,或兩者同時

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

iterators

而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!

function declaration

另外在函式宣告的時候,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 iteratorT* const, const_iterator才是 const T*也是有點混亂...不過沒關係平常比較常用的應該是 const_iterator(畢竟它才能指向別的, iter下去)
今天先看到這邊,明天再來看比較複雜的,bitwise const& logical const!


上一篇
[Day 4] Prefer const, enum, and inline to #define(2)
下一篇
[Day 6] Use const whenever possible (2)
系列文
Effective C++ 讀書筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言