原创 Effective Modern C++ 條款17 理解特殊成員函數的生成

理解特殊成員函數的生成 在C++的官方說法中,有一條是C++願意自己生成特殊成員函數(special member functions)。在C++98,特殊成員函數有四個:默認構造函數,析構函數,拷貝構造函數,拷貝賦值運算符。這四

原创 Effective Modern C++ 條款10 比起unscoped enums更偏愛scoped enums

比起unscoped enums更偏愛scoped nums 作爲一個通用的規則,在大括號內聲明一個名字就限制了名字的作用域在括號之內。這個規則不適用於C++98的枚舉。這種枚舉的枚舉值的作用域與枚舉enum的作用域相同: enu

原创 Effective Modern C++ 條款8 用nullptr代替0和NULL

用nullptr代替0和NULL 你看看這樣行不行,0字面上的意思是個int,而不是指針。如果C++代碼中把0用作指針,那麼C++會勉強地把0翻譯爲一個空指針,和一開始說的不太一樣。C++的主要政策是,0是一個int值,而不是指針

原创 Effective Modern C++ 條款5 儘量用auto代替顯式類型聲明

用auto代替顯示類型聲明 先開個小玩笑: int x; 該死的,我忘記初始化x 了,那麼它的值是未定義的。它可能會被編譯器初始化爲0,這取決於它的聲明位置。 我們再看看另一個小玩笑,它用一個迭代器解引用得到的結構去初始化一

原创 Effective Modern C++ 條款6 當auto會推斷出不合理的類型時使用顯式類型初始化語法

當auto會推斷出不合理的類型時使用顯式類型初始化語法 條款5中我們說明了使用auto聲明類型會比顯式聲明類型更好,但是有時候auto類型推斷會和我們想象中有點差別。例如,我有一個函數以Widget 爲參數,返回std::vect

原创 Effective Modern C++ 條款13 比起iterator更偏愛const_iterator

比起iterator更偏愛const_iterator STL中的const_iterator等效於常量指針(pointers-to-const),它們指向的值是不能被修改的。標準實踐建議我們儘可能地使用const,同樣,如果迭代

原创 Effective Modern C++ 條款14 把不發出異常的函數聲明爲noexcept

把不發出異常的函數聲明爲noexcept 在C++98中,異常規範(exception specification)簡直是隻不靠譜的野獸。你必須總結一個函數可能發出的異常類型,因此如果修改了一個函數的實現,那麼異常規範可能也需要改

原创 Effective Modern C++ 條款11 用deleted functions代替private undefined的做法

用deleted functions代替private undefined的做法 如果你把代碼提供給別的開發者,那麼你會想要防止他們調用一些特殊的函數,總的來說你可以不聲明它們。不對外聲明函數,就無法調用函數啦,這太容易了。但是有

原创 Effective Modern C++ 條款7 創建對象時區分( )和{ }

創建對象時區分( )和{ } 基於你的看法,C++11的對象初始化的語法選擇是不堪和混亂的。總的來說,初始值可以藉助大括號”{}”,等號”=”,圓括號”()”: int x(0); // 初始值在圓括號內 int y = 0

原创 Effective Modern C++ 條款22 當使用Pimpl Idiom時,在實現文件中定義特殊成員函數

當使用Pimpl Idiom時,在實現文件中定義特殊成員函數 如果你曾經與過長的編譯時間鬥爭過,你應該熟悉Pimpl(“pointer to implementation”) Idiom。這項技術通過把類中的成員變量替換成指向一個

原创 Effective Modern C++ 條款15 儘可能使用constexpr

儘可能使用constexpr 如果要選出C++11中最讓人迷惑的新關鍵字,那麼大概是constexpr。當constexpr用於對象時,它本質上就是加強版的const,但它用於函數時,它擁有不同的意思。constexpr再迷惑,也

原创 Effective Modern C++ 條款21 比起直接使用new,更偏愛使用std::make_unique和std::make_shared

比起直接使用new,更偏愛使用std::make_unique和std::make_shared 讓我們從std::make_unique和std::make_shared之間的比較開始講起吧。std::make_shared是C

原创 Effective Modern C++ 條款12 把重寫函數(overriding function)聲明爲override

把重載函數聲明爲override 在C++面向對象編程的世界中,會反覆出現類,繼承,虛函數。在那個世界最基礎思想就是派生類重寫(override)基類的虛函數。意識到重寫虛函數容易出錯誤是件令人沮喪的事情,C++中重寫函數是不遵守

原创 Effective Modern C++ 條款19 用std::shared_ptr管理共享所有權的資源

用std::shared_ptr管理共享所有權的資源 那些用帶垃圾回收器語言的程序員指出並取笑C++程序員還要去防止內存泄漏。MDZZ,他們笑道,“你沒有從上世紀六十年代的Listp中得到啓示錄嗎?管理資源的應該是機器本身,而不是

原创 Effective Modern C++ 條款23 理解std::move和std::forward

理解std::move和std::forward 有效瞭解std::move和std::forward的方法是,瞭解它們做不了的事情。std::move不會移動任何東西,std::forward不會轉發任何東西,在運行期間,它們什