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; // 生成預設配置
};