型別別名是乙個名字,它是某種型別的同義詞,有兩種方法可用於定義型別別名:
指標、常量和型別別名
typedef
char
*pstring;
// psting 等價於 char*
const pstring cstr =0;
// cstr 是乙個常量指標
const pstring *ps;
// ps 是指標,它指向的是乙個 char 型的常量指標
注意,上述**中宣告語句的基本資料型別都是const pstring
,const
是對給定型別的修飾,因此const pstring
就是指向char
的常量指標,而非指向常量字元的指標。
遇到了一條使用了型別別名的宣告語句時,人們往往會錯誤地嘗試把型別別名替換成它本來的樣子,以理解該語句的含義如
const pstring cstr =0;
const
char
*cstr =0;
// 是對 const psting cstr 的錯誤理解
這種理解是錯誤的。宣告語句中用到pstring
時,其基本資料型別是指標,可是用char*
重寫宣告語句後,資料型別就變成了char
,*
成為了宣告符的一部分。前後兩種宣告的含義截然不同,前者宣告了乙個指向char
的常量指標,改寫後的形式宣告成了乙個指向const char
的指標。
auto
讓編譯器通過初始值來推算變數的型別,採用auto
定義的變數必須有初始值。
使用auto
也能在一條語句中宣告多個變數。因為一條宣告語句只能有乙個基本資料型別,所以該語句中所有變數的初始基本資料型別都必須一樣。
復合型別、常量和 auto
編譯器推斷出的auto
型別有時候和初始值的型別並不完全一致,編譯器會適當地改變結果型別使其更復合初始化規則。
切記:符號&
和*
只從屬於某個宣告符,而非基本資料型別的一部分,因此初始值必須是同一種型別。
decltype 型別指示符
decltype
的作用是選擇並返回運算元的型別說明,在此過程中,編譯器分析表示式並得到它的型別,卻不實際計算表示式的值
decltype(f
()) sum = x;
// sum 的型別就是函式 f() 的返回型別
decltype
和auto
處理頂層 const 和引用的方式有些許不同。如果decltype
使用的表示式是乙個變數,則decltype
返回該變數的型別(包括頂層 const 和引用在內)
const
int ci =0,
&j = ci;
decltype
(ci) x =0;
// x 的型別是 const int
decltype
(cj) j = x;
// j 的型別是 const int&
decltype
(cj) z;
// 錯誤, z 的型別是 const int&,必須要有初始值
decltype 和引用
如果decltype
使用的表示式不是乙個變數,則decltype
返回表示式結果對應的型別。當表示式返回的乙個引用型別時,意味著可以該表示式的結果物件能作為一條賦值語句的左值
int i =42,
*p =
&i,&r = i;
decltype
(r +
0) b;
// 正確:加法的結果是 int,所以 b 的型別是 int
decltype
(*p) c;
// 錯誤:解引用的結果是 &,所以 c 的型別是 int&,必須初始化
對於decltype
所用的表示式來說,如果變數名加上了一對括號,則得到的型別與不加括號時會有不同。
如果decltype
使用的是乙個不加括號的變數,則得到的結果就是該變數的型別;
如果給變數名加上了括號,得到的結果是引用型別
decltype
((i)
) d;
// 錯誤:d 的型別是 int&,必須初始化
decltype
(i) e;
// 正確:
切記:decltype((variable))
的結果永遠是引用,decltype(variable)
的結果僅當variable
的型別是引用才是引用。 第二章 變數和基本型別
第二章 變數和基本型別 1 基本內建型別 1 有效數字 float 6位 double 10位 2 符號位 使用一位符號位的表示方式的8位signed整型取值是 128到127 3 越界賦值 取值數目求模 2 字面值常量 1 無符號長整型 1024ul 2 字串 自動在末尾新增乙個空字元 3 變數 ...
第二章 變數和基本型別
識別符號 運算子 宣告符 2.3 復合型別 基於其他型別定義的型別 1.引用 定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引用。一旦初始化完成,引用將和他的初始值一直繫結在一起,所以無法令引用重新繫結到另外乙個物件,所以引用必須初始化 2.指標 指標本身是乙個物件,...
第二章 變數和基本型別
切勿混用帶符號數和無符號數 include using namespace std int main 輸出的結果一直都是no,所以不可混用,請注意size 返回的是size type型別,而該型別也是unsigned的。只有內建型別存在字面值,字面值常量的值是不能修改的 它存放在 段中 內建型別的全...