本篇開始介紹第五章的內容:強型別列舉。
列舉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...