- 面向對象編程(OOP)的本質:設計并擴展自己的數據類型
-
內置C++數據類型
C++數據類型 - 標識存儲的數據的方法:使用變量
- C++中的算術運算
- C++中的類型轉換
3.1 簡單變量
信息存儲的三個基本屬性:
- 信息將存儲在哪里
- 要存儲什么值
- 存儲何種類型的信息
3.1.1 變量名
C++變量命名規則:
- 在名稱中只能使用字母字符、數字和下劃線(_)
- 名稱的第一個字符不能是數字
- 區分大小寫字符
- 不用使用C++關鍵字作為名稱
- 以兩個下劃線或下劃線和大寫字母打頭的名稱將被保留給實現(編譯器及其使用的資源)使用。以一個下劃線開頭的名稱被保留給實現,用作全局標識符(名稱被聲明的位置)
- C++對于名稱的長度沒有限制,名稱中所有的字符都有意義,但有些平臺有長度限制。(ANSI C只保證名稱中的前63個字符有意義)
多個單詞組成名稱的處理方法:
- 使用下劃線字符分開單詞(C程序員慣用)
- 從第二個單詞開始首字母大寫(Pascal程序員慣用)
3.1.2 整型
- 語言只能表示所有整數的一個子集
- 不同C++整型使用不同的內存量來存儲整數,使用的內存量越大,可表示的整數范圍就越大
3.1.3 整型short、int、long、long long
-
C++確保這些類型的最小長度:
- short至少16位
- int至少與short一樣長
- long至少32位,且至少與int一樣長
- long long至少64位,且至少與long一樣長
位:計算機內存的基本單元,每一位都有0/1兩種可能。
字節:8位的內存單元。
C++字節:由至少能夠容納實現的基本字符集的相鄰位組成,即可能的取值數目必須等于或超過字符總數。在使用ASCII碼的系統中,一個字節表示8位;在使用Unicode的系統中,一個字節表示16或32位。
short是short int的簡稱,long是long int的簡稱
sizeof運算符返回類型或變量的長度,對類型名,將名稱放在括號中;對變量名,括號是可選的。eg:
sizeof(int); sizeof n_short;
頭文件climits定義了表示各種限制的符號名稱,比如 INT_MAX
#define INT_MAX 32767
中#define
是一個預處理器編譯指令,它查找獨立的token(單獨的單詞),跳過嵌入的單詞,進行替換-
變量初始化的三種方式:
- int owls = 101; // 來自C語言
- int wrens(432); // C++方式
- int hamburgers = {24}; //C++11初始化方式,用于數組或結構,也可用于單值變量
-
C++11初始化方式
- int a{2};//a=2
- int b = {3};//b=3
- int c{};//c=0
- int d = {};//d=0
C++11使得可將大括號初始化器用于任何類型(可以使用等號,也可以不使用),這是一種通用的初始化語法。
3.1.4 無符號類型
- 優點:增大變量能夠存儲的最大值
- 使用:使用關鍵字unsigned(unsigned int的縮寫)
-
典型的整型溢出行為
典型的整型溢出行為
3.1.5 選擇整型類型
- int被設置為目標計算機的自然長度(natural size,指的是計算機處理起來效率最高的長度)
- 如果沒有非常有說服力的理由,則選擇int
- 如果變量表示的值不可能為負,則使用無符號類型
- 如果知道可能表示的整數值大于16位證書的額最大可能值,則使用long
- 如果存儲的值操作20億,則使用long long
- 當有大型整型數組或節省內存很重要時才使用short
3.1.6 整型字面值
- 十進制:第一位是1~9
- 八進制:第一位是0
- 十六進制:前兩位是0x或0X
- 雖然有不同的表示方式,但是都將以相同的方式(二進制數) 存儲在計算機中
- 控制符oct或hex,實際上是一條消息,告訴cout采取何種行為
int a = 10;
//輸出八進制
cout <<oct
<<a;
//輸出十六進制
cout <<hex
<<a;
3.1.7 C++如何確定常量的類型
- 除非有理由(使用特殊后綴或者值太大)存儲為其他類型,否則默認將整型常量存為int
- 首先看后綴
- long:l/L后綴
- unsigned int:u/U 后綴
- unsigned long:ul/uL/Ul/UL后綴
- long long 和 unsigned long long 同理
- 其次看長度
- 對于不帶后綴的十進制整數的考慮順序:int 、long、long long
- 對于不帶后綴的十六進制或八進制整數的考慮順序:int、unsigned int、unsigned long、long long、unsigned long long
3.1.8 char類型:字符和小整數
- 存儲字母:通過字母的數值編碼解決問題
- char用來處理字符,也可以用做比short更小的整型
- cin和cout的轉化作用:根據變量類型,輸入和輸出字符類型
- C++對字符使用單引號,對字符串使用雙引號
- cout.put(字符常量/字符變量) 函數
- 作用:顯示一個字符
- 是ostream的一個成員函數,句號是成員運算符
- 歷史緣故:cout在C++Release 2.0之前,cout將字符變量顯示為字符,而將字符常量顯示為數字
- char字面值
- 常規字符:使用單引號括起
- 非常規字符(比如單引號):使用轉義字符(\)轉義,可以使用數字轉義序列或字符轉義序列(比如 \0x8和\b都表示退格)
- 通用字符名
- C++支持一個基本的源字符集,即可用來編寫源代碼的字符集
- C++標準還允許實現提供擴展源字符集和擴展執行字符集
- C++提供一種表示特殊字符的機制,獨立于任何特定的鍵盤,使用通用字符名(universal character name)
- \u + 8個十六進制位
- \U + 16個十六進制位
- signed char和unsigned char
- char在默認情況下既不是有符號也不是沒有符號的,是否有符號由C++實現決定
- signed char范圍-128~127,unsigned char范圍0~255
- wchar_t
- 解決的問題:程序需要處理的字符集無法使用一個8位的字節表示
- 解決方法1:如果大型字符集是實現的基本字符集,那么編譯器廠商可以將char定義為一個16位字節或者更長的字節
- 解決方法2:使用wchar_t (寬字符類型),底層的類型取決于C++實現,可能是unsigned short或int等
- wcin和wcout可以處理wchar_t流
- 加上前綴L來指示寬字符常量和寬字符串(如,L"tall")
- C++ 11新增類型:char16_t 和 char32_t
- 解決的問題:Unicode的普及,對特定長度和符號特征的類型的需要,而wchar_t隨實現而不同
- 使用前綴u指示char16_t,無符號,長16位
- 使用前綴U指示char32_t,有符號,長32位
3.1.9 bool類型
- C++將非零值解釋為true,將零解釋為false
- 任何數字值或指針值都就可以被隱式轉換為bool值
3.2 const限定符
符號常量的表示:
- 名稱首字母大寫
- 整個名稱大寫
- 使用前綴k
- ......
如果聲明常量時沒有提供值,則該常量的值將是不確定的,且無法修改的。
const較#define的優點:
- 能夠明確指定類型
- 可以用使用C++的作用域規則將定義限定在特定的函數或文件中
- 可以將const用于復合類型
ANSI C和C++中const的區別:
- 作用域規則
- C++中可以用const值聲明數組長度
3.3 浮點數
小數,帶小數部分的數字,分兩部分存儲,一部分表示值,另一部分表示縮放因子(用來移動小數點的位置)。
3.3.1 書寫浮點數
- 標準小數點表示法
- E表示法
- d.dddE+n表示將小數點向右移動n位
- d.dddE-n表示將小數點向坐移動n位
3.3.2 浮點類型
- C++有3中浮點類型:float、double、long double
- 表示:有效數位+允許的指數最小范圍
- 有效位(significant figure):數字中有意義的位
- 可以查看頭文件cfloat獲取系統對浮點數的限制
3.3.3 浮點常量
- 默認情況下為double類型
- 如果希望常量為float類型,請使用f或F后綴
- 如果希望為long double,可使用l或L后綴
3.3.4 浮點數的優缺點
- 可以表示整數之間的值
- 由于有縮放因子,可以表示更大范圍的的數
- 浮點運算速度慢,精度低
3.4 C++算術運算符
3.4.1 運算符優先級和結核性
- 僅當兩個運算符被用于同一操作數時,優先級和結合性規則才有效
- C++使用優先級規則來確定首先使用哪個運算符
- 可以使用括號來執行自己定義的優先級
- 當兩個運算符優先級相同時,C++看操作數的結合性是從左到右還是從右到左
3.4.2 除法分支
除法運算符(\)的行為取決于操作數的類型
3.4.3 求模運算符
求模運算符(%):返回整數除法的余數
3.4.4 類型轉換
自動類型轉換的情況:
- 將一種算術類型的值賦給另一種類型的變量
- 表達式中包含不同的類型
- 將參數傳遞給函數時
#1:初始化和賦值進行的轉換
轉換 | 潛在的問題 |
---|---|
將較大的浮點類型轉換為較小的浮點類型,比如double轉float | 精度降低;當值超出范圍時,結果不確定 |
將浮點型轉為整型 | 小數部分丟失;當值超出范圍時,結果不確定 |
將較大的整型轉為較小的整型,如long轉short | 當值超出范圍時,通常只復制右邊的字節 |
#2:以{}方式初始化(列表初始化)時進行的轉換(C++11)
列表初始化不允許縮窄
#3:表達式中的轉換
自動轉換 | 不同類型運算時轉換 |
---|---|
- bool、(unsigned)char、short 自動轉為 int,因為int類型是計算機的自然類型<br />- 若short比int短,則unsigned short被轉為int;若長度相同,則unsigned short被轉為unsigned int<br />- wchar_t被轉換成下列第一個寬度足夠存儲其取值范圍的類型:int、unsigned int、long和unsigned long | 1. 按下列順序,當有一個類型符合,則另一個操作數將被轉換成同一類型:long double>double>float <br />2. 整型提升<br />3. 比較有無符號和操作數的級別 |
#4:傳遞參數時的轉換
- C++對char和short類型應用整型提升
- 將參數傳遞給取消原型對參數傳遞控制的函數時,C++將float參數提升為double
#5:強制類型轉換
- 強制類型轉換不會改變變量本身,而是創建一個新的、指定類型的值
- 強制類型轉換格式
- (typename) vlaue //C Style
- typename (vlaue) //C++ Style,就像函數調用一般
- static case<typename> value //更嚴格的類型轉換
3.4.5 C++11中的auto聲明
- 讓編譯器根據初始值的類型推斷變量的類型
- 一般用于處理復雜類型,比如STL中的類型