iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
自我挑戰組

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

[Day 8] Make sure that objects are initialized before they're used (2)

  • 分享至 

  • xImage
  •  

前言

接續前一天的內容,再來看看書上有提到的一些關於物件初始化的內容。

initialization的順序

初始化的順序規則如下:

  • base class> derived class
  • data member: declare的順序,即使在intialzation list不是這個順序!
    因此為了避免混淆,initialzation的順序最好跟declaration一致。

然而還有最後一點:non-local static物件的初始化順序是在別的translation units*被定義的!*

這看起來很複雜,可以拆解來看:
首先static物件的life cycle是從他被創立,直到整個程式結束。non-local指不是在function內的static object。
translation unit則差不多相當於"single object file"。
不同的translation unit的初始化順序是不一定的!
我們可以確定同一translation unit內的順序,但沒有辦法確定在不同translation unit的物件他們的綜合順序,
所以最直接的方式就是以 local static 物件來取代 non-local static 物件。
但這也有其他需要注意的事項。有不同的設計方始來避免他,這個後續再做補充。

總結這段內容,要符合這個守則,有三件事要做:

  1. 手動初始化built-in type的非成員物件
  2. 用member initialization list來做物件的初始化
  3. 注意並去處理跨translation unit初始化順序不確定的部分

總結

貼心重點提醒:

  • Manually initialize obejcts of built-in type, because C++ only sometimes initializes them itself
    built-in type也初始化一下它的數值,免得出現不預期行為!
  • In a constructor, prefer use of the member initialization list to assigment inside the body of the constructor. List data members in the initialization list in the same order they're declared in the class.
  • Avoid initialzation order problems across translation units by replcaing non-local static objects with local static objects.

上一篇
[Day 7] Make sure that objects are initialized before they're used (1)
下一篇
[Day 9] Know what functions C++ silently writes and calls
系列文
Effective C++ 讀書筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言