1.using和typedef(作用:定義類型別名)
? ? ? ? 1)typedef和using都可以用來定義一個類型別名,二者在類型別名上定義沒有區別。只是需要注意的是類型和類型別名的順序,使用typedef定義類型別名的結構為 typedef 類型 類型別名;使用using定義類型別名的結構為using 類型別名=類型;
? ? ? ? 2)但在定義類型模板的情況下,只能使用using。
? ? ? ? typedef的四大用途和兩大陷阱(參考博客:https://blog.csdn.net/ameyume/article/details/6326278#commentsedit):博主介紹的特別詳細。
? ? ? ? typedef使用功能強大,主要分為一下四個方面的用途:1)定義一種類型別名,不等同于宏替換,特別是定義復雜結構類型的時候,如typedef char *Pstring; const Pstring mystring;這里定義的是一個常量指針mystring(由于typedef定義類型別名是一個指向char類型的指針,因此加上const之后只是說指針變成了常量指針),如果采用宏替換的話,得到的結果就是mystring是一個指向常量的指針。2)typedef可以幫助C中簡化結構體的定義;沒有使用typedef定義的結構體為:struct student_info{ int age; int ID;};struct student_info zhangsan;使用typedef定義的結構體為:typedef struct student_info{ int age; int ID;}Student_info;?Student_info zhangsan;(這里的Student_info就是 struct student_info的別名,在C++結構體定義對象時可以不用使用typedef,因為C++定義對象不需要寫struct)3)用typedef可以用來定義與平臺無關的類型,標準庫中的size_t就是采用這種方法,在做跨平臺代碼移植的時候,typedef的用途更加明顯,只需要修改typedef本身的類型,而不需要修改源碼)4)使用typedef可以簡化復雜的聲明,簡化的規則是從外到里,逐層使用typedef替換,最后可以得到原聲明的最簡化版本。
? ? ? ?typedef的兩大陷阱在于:1)typedef是定義一個類型別名,分析代碼的時候需要使用類型別名的含義去分析,而不能做類型替換去分析。2)typedef 就像 auto,extern,mutable,static,和 register 一樣,是一個存儲類關鍵字,在定義類型別名的時候,不能同時出現兩個存儲類的關鍵字。
2.auto和decltype(作用:獲取對象或者表達式的類型)
? ? ? ?為了方便在編程中了解某個對象或者表達式的類型,C++11提供了auto和decltype來得到表達式或者對象的類型。在此之前復習一下上一節中所述的頂層const和底層const的概念:1)頂層const:定義的變量本身是一個常量,如常量內置類型數據和常量指針;2)底層const:指針指向的數據或者引用綁定的數據是一個常量,如指針常量和常量引用;
? ? ? ?使用auto類型說明符應注意以下幾個規則:1)auto可以在一條語句中聲明多個變量,但是多個變量的類型必須一致;2)使用auto時,編譯器一般會忽略頂層const,保留底層的const,也就是要分析左側auto的類型,右側的頂層const屬性去掉。3)在2)的基礎上,如果希望保留右側對象的頂層const屬性,只需要在auto前面加上const即可;4)當使用auto來得到引用類型時,如果右側是字面值常量時,需要在auto前面加上const,如 3)中介紹。使用auto類型說明符的結論是采用 1)2)來分析auto的類型,然后再使用句法來分析賦值是否正確。
? ? ? ? 使用decltype類型指示符需要注意一下幾個規則:1)當decltype括號中的是一個變量,則返回的是變量的類型(包含頂層const和引用),可以使用decltype去獲取引用(對象的別名)的類型,這里對于引用來說是個例外;2)當decltype括號中的類型是一個表達式時,則返回的是表達式結果的類型。3)如果括號中的是一個解引用或者給變量加多層括號,則返回的是引用類型(引用類型和解引用的結果或括號中的變量結果相同),因為變量是一種可以作為左值的特殊表達式(只有括號中是變量才是這種情況,否則多個括號情況就按表達式來分析);
? ? ? ?auto和decltype的區別在于:auto是獲取右側數據的類型,并對變量進行賦值操作;而decltype只是為了獲取括號中的表達式的類型,其結果類型和表達式的形式有關。