C++11新特性(二):語言特性

LemHou發表於2024-08-24

C++11新特性

語言特性

nullptr空指標

nullptr空指標的使用可以規避掉以往設定為NULL的風險。NULL在編譯器中常常被設定為0或者其它數字,此時判斷指標是否為NULL,即判斷指標型別是否能夠等於整型值,並不安全。

int *p = nullptr;

強型別列舉

強型別列舉不能隱式轉換為int型別,可以指定底層型別,如果未指定底層型別,會自動預設為int型別。只能透過型別名訪問,是因為成員作用域侷限在型別中,並不公開。

// 強型別列舉
enum class HttpState:uint32_t{
    HTTP_OK, // private
    HTTP_BAD
};
using State = HttpState;
State state = State::HTTP_OK;

constexpr宣告

constexpr會告訴編譯器在編譯時對其進行最佳化,所以會在編譯時即計算完。因此禁止呼叫函式(發生在執行時)。

constexpr int Add(int a, int b)
{
        return a + b;
}
int main(){
    int a =3, b = 4;
    const int res = Add(a, b);
    std::cout << res << std::endl;
}

屬性

[[noreturn]]屬性指明,函式不返回值。

委託構造

構造器能夠呼叫其它構造器進行初始化。

class MyClass{
    MyClass(int a) :val(a){}; // default private
    MyClass() : MyClass(0){};
private:
    int val;  
}

使用者定義語義

這個暫時沒有理解

顯式虛過載

override告知編譯器,派生類會覆蓋基類中的虛擬函式,避免發生簽名不匹配和不存在相應虛擬函式。如果出錯會報錯。

// explict virtual override
class Base{
    virtual void Add()=0;
};
class Derived final: public Base{
    void Add() override{

    };
};  

Final限定符:限定的東西無法繼承

告訴編譯器,用於指示一個類不能被進一步繼承,或者一個虛擬函式不能被子類覆蓋。

// final修飾的虛擬函式無法覆蓋
class Cat{
public:
    virtual void showCatName() final{ // 限定不能被繼承
        /* 顯示名字 */
    }
};
class MyCat : public Cat{
    void showCatName(){ // 不能繼承父類,此時會編譯報錯
        /* ... */
    }
}
// final修飾的類無法繼承
class Base final{
    virtual void Add() = 0;
};

default函式

此修飾符用於告訴編譯器為default修飾的函式生成預設函式, noexcept告訴編譯器不要丟擲異常,避免物件構建過程中丟擲異常,假如建構函式丟擲異常,其中有一些變數已經生成。那麼此時物件無法構建成功,已經生成的變數則無法析構,會導致丟失記憶體。

class Myclass{
    Myclass() noexcept = default; // 生成預設配置
};

deleted函式

此修飾符用於告訴編譯器不要為delete生成預設的函式,使其無法被例項化和呼叫。可以完成禁止複製、禁止移動等功能。

class Myclass{
    Myclass() noexcept = delete; // 生成預設配置
};

相關文章