在編寫程序時,數據類型(data type)定義了使用存儲空間的(內存)的方式。
程序員通過定義數據類型(data type),告訴特定存儲空間這里要存儲的數據類型是什么,以及你即將操作他的方式。(注:存儲空間有:堆存儲,棧,靜態存儲等,后面再仔細去研究)
1.數據類型可以是內部的或者抽象的。
-
- 內建數據類型:
- 內建數據類型是編譯器可以理解的數據類型,直接與編譯器關聯。C++在這里幾乎完全繼承了C 的數據類型。或者稱為基本數據類型
- 抽象數據類型:
- 可以先理解為一個類(C++靈魂的精髓,數據類型:類),它是由我們自己或者別的用戶自行定義的數據類型。(這里學習類的時候在仔細學習)
- 內建數據類型:
2. 基本內建類型(又稱,基本數據類型)
標准C的內建類型(由C++繼承)沒有說明必須多少位。只是規定了內部數據類型必須能存儲的最大值和最小值。
C++和C內部數據類型有4個基本類型。分別是:char,int, float & double 。(如下介紹:
2.1 說明符(specifier)
說明符(specifier)用於改變基本內建類型的含義,並把它們擴展為一個更大的集合,有以下四種:
-
-
- signed
- unsigned
- short
- long
-
注:signed (代表有符號)和 unsigned(代表無符號)。因為數據類型在計算機中以二進制存儲,有符號的就會占去一個比特位來表示符號位。相應的取值范圍也會變小。
-
一般上面的四種基本類型可以再使用一個或多個說明符進行修飾。詳細的參考如下圖示:
(另外,在面試的時候面試官,如果問到,例如char一定是1個字節嗎?一般會回到視機器而定,一般是一個字節)
2.2 bool類型
在bool類型成為C++標准之前,每個人都在用自己的方法實現類似於bool類型的行為。這種方式是很不利於可移植性的。
談到bool,必須要談到兩個內建常量:true(轉換為整數1) & false(轉換為整數0)。(注:內建常量暫不解釋)
此外一些語言元素也被采納,在C++ 中:
因為現在很多代碼使用的是整型int表示一個標志,所以編譯器隱式轉換int為bool(非零值為true,零值為false)
2.3 枚舉類型
枚舉(enumerated)類型就是指他的值為符號常量而不是字面值的類型,她們通常以下面形式聲明:
enum Type{ CUP, PINT, QUART, HALF, GALLON };
這條語句聲明了一個類型,稱為week。這種類型的變量按下面方式聲明:
enum Type CUP, PINT, QUART, HALF, GALLON ;
這種變量的存儲方式實際方式是整型的形式,第一個變量是0,第二個是1,以此往后(在不賦值的情況下)。當然在適當的是后,你可以選擇賦值特定的整型值。
enum Type{ CUP=1, PINT=5, QUART=3, HALF=11, GALLON };
如上面,並沒有對最后一個變量賦值,那么他的值就比前面一個大1,為12;
2.4 typedef
C語言支持一種叫做typedef的機制(當然C++也是同樣支持的啦,畢竟是繼承了C的優良品性)。他允許你為各種數據類型定義新的名字。typedef聲明的寫法和普通的聲明基本相同,只是吧typedef這個關鍵字出現在聲明的前面。例如下面的這個聲明:
char *ptr_char;
把變量ptr_char聲明能夠為一個指向字符的指針,但是在你添加關鍵字typedef后,聲明變為:
typedef char *ptr_char;
這種聲明吧prr_char作為只想字符的指針類型的新名字(這里對指針可以不了解,畢竟還到后面才學的到)。你可以像使用任何個預定義名字一樣,在下面申明中使用新名字。如下:
ptr_char a;
聲明了a指向字符的指針。
注:typedef與#define還是有區別的,面試的時候可能會被問到。雖然都可以用來創建新的類型名。但是后者無法正確的處理指針類型。如下:
#define ptr_char char * ptr_char a,b;
可以正確的使用a,但是b卻被聲明一個字符。所以通常定義復雜的類型時,選擇typedef更為穩妥。