[總結:]
- 類型是C++程序設計的基礎
- 每種類型都定義了其存儲空間要求和可以在該類型的所有對象上執行的操作.C++提供了一組基本內置類型,如int,char等.這些類型與它們在機器硬件上的表示方式密切相關.
- 類型可以分為const和非const; const對象必須要初始化,且其值不能被修改.另外,我們還可以定義復合類型, 如引用. 引用為對象提供了另一個名字.復合類型是用其他類型定義的類.
- C++語言支持通過定義類來自定義類型. 標准庫使用類設施來提供一組高級的抽象概念, 如IO和string類型.
- C++是一宗靜態類型語言:變量和函數在使用前必須聲明。變量可以聲明多次但是只能定義一次。定義變量時候就進行初始化幾乎總是個好主意
類 型
含 義
最小存儲空間
bool
布爾型
——
char
字符型
8位
wchar_t
寬字符型
16位
short
短整型
16位
int
整型
16位
long
長整型
32位
float
單精度浮點型
6位有效數字
double
雙精度浮點型
10位有效數字
long doble
擴展精度浮點型
10位有效數字
- 因為位數不同,這些類型所能表示的最大(最小)值也因機器的不同而有所不同。
- 讓存儲具有結構的最基本方法是用塊(chunk)處理存儲。通常將,。
- 帶符號signed和無符號unsigned類型
-
- unsigned int 類型可以簡化寫成unsigned,也就是說,unsigned後面不加其他類型說明符就意味著是:unsigned int。
- 符號位為1,值就為負數;符號位為0,值就為0或正數。
- 對於unsigned類型來說,負數總是超過其取值范圍。unsigned類型的對象可能永遠不會保存負數。但在C++中,把負數賦值給unsigned對象是完全合法的,其結果是該負數對該類型的取值個數求模後的值。
由於-1的補碼是11111111(原碼絕對值取反加一)結果就是255的二進制編碼。
- 浮點型,類型float,double和long double分別表示單精度浮點數,雙精度浮點數和擴展精度浮點數。
-
- 一般float類型用一個字(32位)來表示,double類型用兩個字(64位)來表示,long double 類型用三個或四個字(96位或128位)來表示。
- 對於實際程序來說float類型的精度通常是不夠的——float只能保證6位有效數字,而double型至少可以保證10位有效數字,能滿足大多數計算的需要。
- 42這樣的值在程序中就被當做。字面值是指只能用它的值來稱呼它,常量是指它的值不能修改。只有內置類型存在字面量,沒有類類型的字面量,因此也沒有任何標准庫類型的字面量。
-
- 20 //十進制
- 024 //八進制
- 0x14 //十六進制
- 字面值整數常量的默認類型是int或long類型。其精度類型決定於字面值——其值適合int就是int類型,適合long就是long類型。也可以通過增加後綴,強制將字面值整數常量轉換為long,unsigned或unsigned long類型。
- 通過在數值後面加L或者l制定常量為long類型(推薦使用大寫L,因為小寫l容易和1混淆)
- 類似,可以通過在數值後面加U或u定義unsigned類型。同時加L和U就能夠得到unsigned long類型的字面值常量(後綴之間沒有空格)。
例子:128U /*unsigned*/ 1024UL /*unsigned long*/
1L /*long*/ 8Lu /*unsigned long*/
-
- 默認的浮點字面值常量位double類型。
- 在數值後面加上F或者f表示單精度;加上L或l表示擴展精度。
- 例子:3.14159F 12.345L 1.2345E1L
'a' '2' ',' ' '
-
- 在字符字面值的前面加L就可以得到wchar_t類型的寬字符字面值。
-
換行符
\n
水平制表符
\t
縱向制表符
\v
退格符
\b
回車符
\r
進紙符
\f
報警(響鈴)符
\a
反斜線
\\
疑問號
\?
單引號
\'
雙引號
\"
-
- 我們可以將任何的字符表示為一下形式的通用轉義字符:
-
- \ooo 這裡的ooo表示3個八進制的數字,這三個數字表示字符的數字值。
-
\7
\12
\40
\0
\062
\115
響鈴符
換行符
空格符
空字符
'2'
'M'
-
-
- 同樣也可以用十六進制轉義字符來定義字符:\xddd 由反斜線,一個x和一個或多個十六進制數字組成。
- 字符串字面值:
-
- 字符串字面值常量用雙引號括起來的0個或多個字符表示。
- C++兼容C,所有字符串字面值都由編譯器自動在末尾添加一個空字符。
- 同樣也存在寬字符串字面值,一樣在前面加L。如:L"a wide string literal".
- 寬字符串字面量是一串常量寬字符,同樣以一個寬空字符結束。
3. 變量
- 左值 (lvalue,發音為ell-vallue)左值可以出現在賦值語句的左邊或右邊
- 右值 (rvalue,發音為are-valle)右值只能出現在賦值的右邊
-
- 變量時左值,因此可以出現在賦值語句的左邊
- 數字字面值是右值,因此不能被賦值。
- 變量命名
- 變量命名習慣:
- 變量名一般用小寫字母。
-
- 區別初始化和賦值:初始化指創建變量並給它賦初始值,而賦值則是擦除對象的當前值並用新值代替;
- 可以通過一個計數器和一個字符初始化string對象。這樣創建的對象包含重復多次的指定字符,重復次數由計數器指定:
std::string all_nines(10,'9'); //all_nines="9999999999"
初始化all_nines的唯一方法就是直接初始化。
- 初始化規則
-
- 系統會根據變量的類型和變量定義的位置自動幫我們初始化。
- 內置類型變量的初始化:
-
- 內置類型變量是否自動初始化取決於變量定義的位置。在函數體外部定義的變量都初始化成0
- 函數體內定義的內置類型變量不進行自動初始化。
- 類類型變量的初始化:
-
- 類通過定義一個或多個構造函數來控制類對象的初始化。
- 如果定義某個類的變量時沒有提供初始化式,那麼就會使用默認構造函數,無論變量在哪裡定義,默認構造函數都會被使用。
- std::string empty; // empty is the empty string; empty=" "
- 聲明和定義
-
- 任何在多個文件中使用的變量都需要有與定義分離的聲明。在這種情況下,一個文件含有變量的定義,使用該變量的其他文件則包含該變量的聲明(而不是定義)。
- 定義const對象
-
- const限定符將一個對象轉換成一個常量。
- const int bufSize=512; // input buffer size
- 定義bufSize為常量並初始化為512,任何修改bufSize的嘗試都會導致編譯失敗;
- 因為常量在定義後就不能被修改了,所以在定義的時候就必須進行初始化。
- const對象默認為文件的局部變量
-
- 與其他變量不同,在全局作用域中聲明的const變量是定義該對象的文件的局部變量。就是說,此變量只存在於那個文件中,不能被其他文件訪問。
- 但是可以通過制定const變量為extern,就可以在整個程序中訪問const對象;
- 非const變量默認為extern,要使const變量能夠在其他的文件中訪問,必須顯式地制定它為extern。
5.引用
引用就是對象的另一個名字,引用主要用做函數的形參。
- 引用是一種復合類型,通過在變量名前添加“&”符號來定義,
- 引用必須使用與該類型的對象初始化:
-
- int iva1=1024;
- int &refVa1=ival; // ok, refVa1 refers to iva1
- int &refVal12; // error, a reference must be initialized
- int &refVa13=10; // error, initializer must be an object
- 初始化是指明引用指向哪個對象的唯一方法;
- 引用只是一個對象的另一個名字;
- 當引用初始化後,只要該引用存在,它就保持綁定到初始化時指向的對象,不能將引用綁定到另一個對象。
- const引用
-
- const引用是指向const對象的引用。可以讀取但不能修改。
-
- typedef可以用來定義類型的同義詞;
- typedef定義以關鍵字typedef開頭,後面是數據類型和標示符。
-
- typedef double wages;// wages is a synonym for double
- wages hourly=12.45; // double hourly=12.45
-
- 我們經常需要為某些屬性定義一組可以可選擇的值。枚舉不僅提供了一種方法定義了整數常量集,而且還把它們聚集成組;
- 定義和初始化:
-
- enum point{point1,point2,point3}; // point1=0; point2=1; point3=2;
- enum point{point1=1,point2,point3}; // point1=1; point2=2; point3=3;
- enum point{point1=1,point2,point3=5,point4,point5}; // point1=1; point2=2; point3=5; point4=6; point5=7;
- 不能改變枚舉成員的值。枚舉成員本身就是一個常量表達式,所以也可用於需要常量表達式的任何地方。
-
- 每個類都定義了一個接口和一個實現。
- 定義類時,通常先定義該類的接口,即該類所提供的操作。通過這些操作,可以決定該類完成其功能所需要的數據,以及是否需要定義一些函數來支持這個類的實現。
- 定義Sales_item類
-
- Sales_item{
- public:
- //operations onSales_item objects will go here
- private:
-
- }
-
- 類的數據成員(橙色部分)
-
- 當定義數據成員時,只能指定該數據成員的名字和類型。
- 不能在類定義裡定義數據成員的時候 初始化數據成員,而是通過構造函數的特殊成員函數控制初始化。
- 訪問標號
-
- public部分定義的成員在程序的任何部分都可以訪問。
- private部分定義的成員,不是類的組成部分的代碼不能訪問。
- 使用struct關鍵字定義類類型。(struct是從C語言中繼承過來的)
-
- 如果使用class關鍵字來定義類,那麼定義在第一個訪問標號前的任何成員都隱式指定為private;
- 如果使用struct關鍵字來定義類,那麼這些成員都是public
- 使用class還是struct關鍵字來定義類,僅僅影響默認的初始訪問級別。
- 頭文件的正確使用能夠帶來2個好處:保證所有文件使用給定屍體的同一聲明;當聲明需要修改時,只有頭文件需要更新;
- 頭文件用於聲明而不是用於定義;
- 一些const對象定義在頭文件中
- 預處理器
-
- #include設施是C++預處理器的一部分,預處理器處理程序的源代碼,在編譯器之前運行。
- #include指示只接受一個參數:頭文件名。
- 為了避免名字沖突,預處理器變量用全大寫字母表示
-
- 預處理器變量有兩種狀態:已定義和未定義;
- #define 指示接受一個名字並定義該名字為預處理器變量; #ifndef 指示檢測指示的預處理器變量是否未定義,如果預處理器變量未定義,那麼跟在後面的所有指示都被處理,直到出現#endif ;
- #ifndef SALESITEM_H
- #define SALESITEM_H
- //使用這些設施來預防多次包含同一頭文件
- #endif
- #include指示接受以下兩種形式:
-
- #include <standard_header>
- #include "my_file.h"
- 如果頭文件名包括在尖括號<>裡,那麼認為該頭文件是標准頭文件。編譯器將會在預定義的位置集查找該頭文件。
- 如果頭文件名包括在一對引號中,那麼認為它是非系統文件,查找通常開始於源文件的所在路徑。