《深入理解C 11》筆記 強型別列舉

2021-08-21 09:31:32 字數 1519 閱讀 9321

本篇開始介紹第五章的內容:強型別列舉。

列舉enum的使用應該十分常見,用於定義同一類的資料。但是列舉其實存在一定的問題:

enum

male ;

enum

female ;

如上**,如果兩個列舉中定義了相同名稱的列舉值,將會編譯報錯,因為列舉值並沒有自己的名字空間。針對這種情況,往往會通過名字空間來分割列舉值的作用空間:

namespace

male;

}namespace

female ;

}int main()

另外,列舉值總是可以被隱式轉換為整形,這也會引起一些問題:

enum

level ;

enum

type ;

class

password

level level;

type type;

};int main()

return 0;

}

還有一點,列舉值所占用的空間大小也不確定。原來的標準規定,c++列舉的基礎型別有編譯器來具體制定實現,以下的**輸出是在visual c++編譯的:

enum a ;

enum b ;

enum c ;

int main()

從上面的**可以分析出,g++會在需要的時候將列舉擴充套件為8位,且會根據列舉的型別變動是否有符號。而visual c++始終為4位,且始終為無符號型別。

強列舉型別

強列舉型別是c++11針對以上的問題引入的一種新的列舉型別:

enum

class

type

強列舉型別有幾個特點:

enum

class

type : char

下面我們看一下強列舉型別的具體例子:

enum

class

level ;

enum

class

type ;

class

password

level level;

type type;

};int main()

if (pwd.level

< level::three)

if (pwd.type > 1) // 編譯失敗,無法隱式轉換為整形

if ((int)pwd.type > 1)

return 0;

}

另外,指定基本型別之後,各個編譯器之間的實現就會相同,便於**移植:

enum

class b : unsigned

int;

int main()

深入理解C 11 筆記

include using namespace std classa a 對於含有堆記憶體的類,需要提供深拷貝的拷貝建構函式,避免預設的拷貝構造使用淺拷貝導致堆記憶體的重複刪除。a const a a m ptr new int a.m ptr 通過移動構造,a 作為函式引數,只使用淺拷貝避免臨時物...

《深入理解C 11》筆記 decltype

本篇將介紹decltype的用法。decltype與auto類似,也能進行型別推導,但是用法有一定的區別,decltype推導出的型別能作為型別宣告變數 int main decltype的應用 一種是decltype和typedef using的合用 using size t decltype s...

《深入理解C 11》筆記 追蹤返回型別

templatedecltype 2 a doublevalue t a 用decltype推導返回型別但是對於編譯器來說,是從左到右進行編譯的,decltype在進行推導時並不知道a的型別,所以這種寫法是編譯不過的。為了解決這個問題,於是引入了追蹤返回型別 template auto double...