[C++11閱讀][1-2-2]提高代碼穩(wěn)定性(上)

穩(wěn)定性

我的補(bǔ)充
第二章的標(biāo)題叫做“保持穩(wěn)定性和兼容性”,兼容性在前面說(shuō)過(guò)了,指的是兼容C標(biāo)準(zhǔn)。關(guān)于穩(wěn)定性,我理解是指編寫代碼時(shí)不易出錯(cuò),幫助養(yǎng)成好的編碼習(xí)慣,類似const關(guān)鍵字起的作用。
如果不用這些特性,可以做到代碼功能完整,甚至性能也不錯(cuò)。用了這些特征,防止日后編寫代碼時(shí)出錯(cuò),防止其他人修改代碼時(shí)出錯(cuò),防止庫(kù)的調(diào)用者出錯(cuò)。

斷言與靜態(tài)斷言

運(yùn)行時(shí)斷言assert一直都有,C++11新增了靜態(tài)斷言宏static_assert。
都是判斷為true時(shí)繼續(xù)走,false時(shí)中止,static_assert可以加消息。

// 斷言,運(yùn)行時(shí)進(jìn)行判斷
assert(features.size() > 0);
// 靜態(tài)斷言,編譯時(shí)進(jìn)行判斷
static_assert(sizeof(st) == sizeof(index), "recognifion feature should have same size for int64");

要持有這樣的觀念,斷言是開(kāi)發(fā)階段debug用的,運(yùn)行時(shí)要disable掉。編譯宏NDEBUG可以起到release時(shí)使斷言失效的效果,不要在代碼里定義NDEBUG,用就行,這是編譯選項(xiàng)做的。

#ifdef NDEBUG
/*
 * If not debugging, assert does nothing.
 */
#define assert(x)   ((void)0)
#else /* debugging enabled */
// some code
#endif  /* NDEBUG */

noexcept修飾符與noexcept操作符

noexcept可以吃掉內(nèi)部拋出的異常,外部代碼就不用處理了,這樣代碼運(yùn)行更可控一些。
吃掉的含義是如果真的發(fā)生異常了,就地中止,調(diào)用std::terminate()。

// finally() - convenience function to generate a final_action
template <class F>
inline final_action<F> finally(const F& f) noexcept
{
    return final_action<F>(f);
}

noexcept還可以作為操作符,noexcept等同于noexcept(true),不拋異常,如果是noexcept(false)則為會(huì)拋出異常,后者比較少見(jiàn)。
作為修飾符的noexcept
https://zh.cppreference.com/w/cpp/language/noexcept_spec
作為操作符的noexcept
https://zh.cppreference.com/w/cpp/language/noexcept

就地初始化成員變量

#include <string>
using namespace std;
class Init {
public:
        Init(): a(0){}
        Init(int d): a(d){}
private:
        int a;
        const static int b = 0;
        int c = 1;  // 用double或char*效果一樣,C++11可以,C++98/03不行
        static int d = 0;  // C++11無(wú)法通過(guò)編譯
        static const double e = 1.3;  // 非整形或者枚舉,C++11無(wú)法通過(guò)編譯
        static const char * const f = "e";  // 非整形或者枚舉,C++11無(wú)法通過(guò)編譯
};

int main() {
        Init lala;
        return 0;
}

用g++編譯int c會(huì)報(bào)錯(cuò)(其實(shí)GNU處理成了warning),用g++ -std=c++11就沒(méi)事。
細(xì)心的你會(huì)發(fā)現(xiàn)用g++時(shí),double e那句沒(méi)報(bào)錯(cuò),是因?yàn)镚NU對(duì)C++的擴(kuò)展,并不是標(biāo)準(zhǔn)的。


image.png

初始化列表和就地初始化可以同時(shí)存在,同時(shí)存在時(shí),起效的是構(gòu)造函數(shù)的初始化列表。就地初始化在有多個(gè)構(gòu)造函數(shù)時(shí)很有用,在其中有的構(gòu)造函數(shù)沒(méi)有初始化列表時(shí)起效。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容