iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
自我挑戰組

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

[Day 10] Explicitly disallow the use of compiler-generated functions you do not want

  • 分享至 

  • xImage
  •  

前言

今天的守則與前一則([Day 9] Know what functions C++ silently writes and calls)有強烈相關,就直接來看看吧!

不想要的函式要記得關掉!

這個守則是:

Explicitly disallow the use of compiler-generated functions you do not want

守則本身很好理解,畢竟前一天我們已經看過了C++會幫我們自動產生哪些函式,記得昨天的四大金剛嗎?今天要來看的則是,我們要如何disallow這些不想要的function?

我們已經知道如果我們不宣告,那compiler就會自動幫我們產生copy constructor與copy assignment operator;那我們就宣告吧!這樣compiler就不會產生了;但矛盾的是,既宣告了,那不就可以用了嗎?那如果我就是不想要它可以用,可以怎麼做呢?

首先,記得前一則守則有提到,compiler默默產生的這些function都是public的,那第一個我們能做的就是把它宣告成private的,這樣至少可以避免compiler自動產生,別人也不能隨便call。再來,我們可以不要 定義它! 這樣 link time* 就會出現error!總結以上 宣告為private+不定義它 是很普遍的做法,iostreams library裡面也有用到,現在就打開你電腦裡的STL去看看ios_base, basic_iossentry的實作吧*!

↑以上是本書的內容

But如果你有打開你電腦去看or直接去查,八成會發現我的ios_base不是這樣寫啊!!!從這邊可以看到
https://ithelp.ithome.com.tw/upload/images/20230920/20140096XChdijFm4g.png
诶?原來這是C++11以前的做法。現在都用delete來搞定啦!
詳情的作法跟區別,可以參考這邊Explicitly Defaulted and Deleted Functions,裡面有非常詳盡的說明。

本章節後面提到的就是C++11以前的做法,就不補充了。看來下次的主題改成CppCon的讀書筆記好了...光看書沒有更新現實情況就尷尬了。

總結

這次就不附上貼心重點提醒了,因為書中提到的做法比較過時;但雖然說這個disallow作法不同,精神並沒有變!還是要記得去關掉它!

補充

  • 查看iostreams library中的實作:這些程式碼其實都隨著你安裝compiler的時候就一起裝了。例如,如果你也是follow vscode官網的C++環境建置教學(Using GCC with MinGW,我之前也有一篇稍微整理在vs code跑C++的相關步驟─[Day 23] 在VS Code使用C++),那它推薦你裝的compiler就是MinGW;而如果是用visual studio的話,則會是MSVC,這些關係在網路上可以找到很多人的整理,或可以看看參考資料的連結。而如果你已經有了可以跑C++環境,最簡單的就是打開你的IDE,然後輸入std::ios_base,右鍵go to definition,就可以看到它到底身在何方啦!例如:
    https://ithelp.ithome.com.tw/upload/images/20230920/20140096aoWu5J5WbD.png

參考資料


上一篇
[Day 9] Know what functions C++ silently writes and calls
下一篇
[Day 11] Declare destructors virtual in polymorphic base classes
系列文
Effective C++ 讀書筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言