iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
自我挑戰組

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

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

  • 分享至 

  • xImage
  •  

重點

進入第四條準則:

Make sure that objects are initialized before they're used

C++中的物件是否會自動被初始化呢?答案是有些有,有些沒有。如第一條規則([Day 2] View C++ as a federation of languages)說的,C++是個語言熔爐,所以會發現為什麼有些時候有些物件需要去初始化他有些不用,例如array(C++中的C part)就不需要,但vector(C++中的STL part)就要。因為太複雜了所以只要掌握這個大原則就好─ 在使用物件之前先初始化它!

對於內建的非成員物件,我們需要特別寫,例如:

int x=0;
const char* test = "A C-style string";
double d;
std::cin>>d;

而對於其他的物件,通常都是在constructors完成。這裡也有簡單原則:確保constructor裡面有將所有物件成員初始化!

assignment!=initialization

值得注意的一點是,知道要在constructor初始化,可能很直覺的寫法就是這樣寫:

ABEntry::ABEntry(const std::string& name, const std::string& address, const std::list<PhoneNumber>& phones)
{
    theName = name;
    theAddress = address;
    the Phones = phones;
}

但這樣寫還不夠好,在進入constructor的本體之前,這些成員就都被初始化好了!目前的寫法其實是assignment,default的constructor會在進入constructor的本體之前就先初始化好了─除了numTimesConsuslted因為它是build-in type。

更好的寫法是用 "member initialization list"

ABEntry::ABEntry(const std::string& name, const std::string& address, const std::list<PhoneNumber>& phones):
    theName(name), theAddress(address), thePhones(phones){}

雖然兩者呈現的結果相同,但後者比前者來得有效率。因為前者其實會先call default constructors先初始化好後,再重新assign新的值給那幾個變數。而使用initialization list則是直接在construct的時候採用copy construct。通常形態下,效率:call一個copy constructor> 先default constructor 再+ copy assigment

有時我們非要用member initialization list不可,例如當data member是const或是reference的時候,因為它們不能被assign,因此永遠都要用initialization list。

另外一個反例則是當我們有多組constructor的時候,例如繼承的classes,每一層都有自己的一組初始化list,這時就可以考慮把assignments放到一個function讓各個constructor來call。不過大部分時間,使用initialzation list會比較推薦。

補充


上一篇
[Day 6] Use const whenever possible (2)
下一篇
[Day 8] Make sure that objects are initialized before they're used (2)
系列文
Effective C++ 讀書筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言