《C++ Primer》學習筆記(第二章)

基本內(nèi)置類型:
算術類型:字符、整型數(shù)、布爾值、浮點數(shù)
空類型不對應具體的值

類型 含義 最小尺寸
bool 布爾類型 未定義
char 字符 8bit
wchar_t 寬字符 16bit
char16_t Unicode字符 16bit
char32_t Unicode字符 32bit
short 短整型 16bit
int 整型 16bit
long 長整型 32bit
long long 長整型 64bit
float 單精度浮點數(shù) 6位有效數(shù)字,32bit
double 雙精度浮點數(shù) 10位有效數(shù)字,64bit
long double 擴展精度浮點數(shù) 10位有效數(shù)字,96或128bit

布爾類型:真(true) 假(false)
計算機中可尋址最小內(nèi)存塊稱為“字節(jié)(byte)”,儲存的基本單元稱為“字(word)”。
一般來說float和double分別有7和16個有效位
帶符號:signed(正數(shù)、負數(shù)或0) 無符號:unsigned(大于等于0)
unsigned int可以簡寫為unsigned
char, signed char, unsigned char。signed char和char不一樣
無法預知的行為源于編譯器無須(有時候是不能)檢測的錯誤
如果把int的尺寸看成是一個不變的已知值,那么這樣的程序就稱作不可移植的
類型char表現(xiàn)可能是帶符號的也可能是無符號的,具體是哪種由編譯器決定
當一個算術表達式中既有無符號數(shù)又有int值時,那個int值就會轉換成無符號數(shù)
把負數(shù)轉換成無符號數(shù)類似于直接給無符號數(shù)賦一個負值,結果等于這個負數(shù)加上無符號數(shù)的模
字面值常量,每個字面值常量都對應一種數(shù)據(jù)類型,字面值常量的形式和值決定了它的數(shù)據(jù)類型
整型和浮點型字面值
十進制字面值的類型是int、long和long long中尺寸最小的那個
八進制和十六進制字面值的類型是能容納其數(shù)值的int、unsigned int、long、unsigned long、long long和unsigned long long中尺寸最小者
short沒有對應的字面值
默認的浮點型字面值是一個double
字符串和字符串字面值
由單引號括起來的一個字符稱為char型字面值,雙引號括起來的零個或多個字符則構成字符串型字面值
轉義序列
有兩類字符程序員不能直接使用,一類是不可打印的字符,如退格或其他控制字符,另一類是在C++語言中有特殊含義的字符,在這些情況下需要用到轉義序列,以反斜線作為開始
響鈴符 \a \7
換行符 \n \12
空格 \40
空字符 \0
字符M \115 \x4d
如果反斜線\后面跟著的八進制數(shù)字超過3個,只有前3個數(shù)字與\構成轉義序列
\x要用到后面跟著的所有數(shù)字
Best practices:當使用一個長整型字面值時,使用大寫字母L來標記,因為小寫字母l和數(shù)字1容易混淆
字符串和字符串字面值:

前綴 含義 類型
u Unicode 16字符 char16_t
U Unicode 32字符 char32_t
L 寬字符 wchar_t
u8 UTF-8 char

整型字面值

后綴 最小匹配類型
u or U Unsigned
l or L long
ll or LL long long

浮點型字面值

后綴 類型
f或F float
l或L long double

true和false是布爾類型的字面值
nullptr是指針字面值
C++中的每個變量都有其數(shù)據(jù)類型,變量和對象一般可以互換使用
string是一種庫類型,表示一個可變長的字符序列
通常情況下,對象是指一塊能儲存數(shù)據(jù)并具有某種類型的內(nèi)存空間
初始化和賦值是兩個完全不同的操作
初始化的含義是創(chuàng)建變量時賦予其一個初始值,而賦值的含義是把對象的當前值擦除,而用一個新值來替代
C++11新標準:花括號初始化變量 (列表初始化)
默認初始化:如果定義變量時沒有指定初值,變量被默認初始化,如果是內(nèi)置類型的變量未被顯式初始化,它的值由定義的位置決定。定義于任何函數(shù)體之外的變量被初始化為0,定義在函數(shù)體內(nèi)部的內(nèi)置類型變量將不被初始化,是未定義的。
分離式編譯:允許將程序分割為若干個文件,每個文件可被獨立編譯
為了支持分離式編譯,C++語言將聲明和定義區(qū)分開來
聲明使得名字為程序所知,規(guī)定了變量的類型和名字;定義負責創(chuàng)建與名字相關的實體,申請儲存空間,也可能會為變量賦一個初始值
如果想聲明一個變量而非定義它,就在變量名前添加關鍵字extern
任何包含了顯式初始化的聲明即成為定義
變量能且只能被定義一次,但是可以被多次聲明
靜態(tài)類型語言:在編譯階段檢查類型(類型檢查)
定義也是聲明:當定義變量時我們聲明了它的類型和名字
C++標識符由字母、數(shù)字和下劃線組成,其中必須以字母或下劃線開頭
用戶自定義的標識符中不能連續(xù)出現(xiàn)兩個下劃線,也不能以下劃線緊連大寫字母開頭,定義在函數(shù)體外的標識符不能以下劃線開頭
全局作用域、塊作用域
被包含(嵌套)的作用域稱為內(nèi)層作用域,包含著別的作用域的作用域稱為外層作用域
復合類型是指基于其他類型定義的類型:引用和指針
一條聲明語句由一個基本數(shù)據(jù)類型和緊隨其后的一個聲明符列表組成。每個聲明符命名了一個變量并指定該變量為與基本數(shù)據(jù)類型有關的某種類型
引用為對象起了另外一個名字,通過將聲明符寫成&d的形式來定義引用類型
引用必須被初始化,因為無法令引用重新綁定到另外一個對象
為引用賦值,實際上是把值賦給了與引用綁定的對象,引用只能綁定在對象上
指針是指向另外一種類型的復合類型
指針與引用相比的不同點:
1.指針本身就是一個對象,且在指針的聲明周期內(nèi)它可以先后指向幾個不同的對象
2.指針無須在定義時賦初值,在塊作用域內(nèi)定義指針如果沒有被初始化,也將擁有一個不確定的值
指針存放某個對象的地址
取地址符(&)
引用不是對象,沒有實際地址,所以不能定義指向引用的指針
指針值:
1.指向一個對象
2.指向緊鄰對象所占空間的下一個位置
3.空指針,意味著指針沒有指向任何對象
4.無效指針,也就是上述情況之外的其他值
解引用符(*):訪問對象
對指針解引用會得出所指的對象,因此如果給解引用的結果賦值,實際上也就是給指針所指的對象賦值
NULL:預處理變量 <cstdlib> 值為0
預處理變量不屬于命名空間std,由預處理器負責管理
賦值永遠改變的是等號左側的對象
void*指針,特殊的類型,可存放任意對象的地址
類型修飾符是聲明符的一部分
把修飾符和變量標識符寫在一起強調(diào)變量具有復合類型,把修飾符和類型名寫在一起強調(diào)本次聲明定義了一種復合類型
**表示指向指針的指針,***表示指向指針的指針的指針
指針式對象,所以存在對指針的引用
Example:

int *p;
int *&r = p;

const限定符:定義一種變量,它的值不能被更改
因為const對象一旦創(chuàng)建后其值就不能再改變,所以const對象必須初始化
只能在const類型的對象上執(zhí)行不改變其內(nèi)容的操作
默認情況下,const對象僅在文件內(nèi)有效
如果想在多個文件之間共享const對象,必須在變量的定義之前添加extern關鍵字
可以把引用綁定到const對象上,稱之為對常量的引用
引用的類型必須與其所引用對象的類型保持一致的第一個例外:
在初始化常量引用時允許用任意表達式作為初始值,允許為一個常量引用綁定非常量的對象、字面值,甚至是個一般表達式
臨時量:當編譯器需要一個空間來暫存表達式的求值結果時臨時創(chuàng)建的一個未命名的對象
常量引用僅對引用可參與的操作做出了限定,對于引用的對象本身是不是一個常量未作限定
指向常量的指針不能用于改變其所指對象的值;指向常量的指針
指針的類型必須與所指對象的類型一致,但是有例外:
第一種例外情況是允許令一個指向常量的指針指向一個非常量對象
常量指針必須初始化,一旦初始化完成則其值就不能更改了,把*放在const關鍵字之前用以說明指針是一個常量
頂層const表示指針本身是一個常量,底層const表示指針所指的對象是一個常量
頂層const可以表示任意的對象是常量,底層const則與指針和引用等復合類型的基本類型部分有關
用于聲明引用的const都是底層const
常量表達式指指不會改變并且在編譯過程就能得到計算結果的表達式
在一個復雜系統(tǒng)中,很難分辨一個初始值到底是不是常量表達式
聲明為constexpr的變量一定是一個常量,而且必須是常量表達式初始化
一般來說,如果認定變量是一個常量表達式,那就把它聲明成constexpr類型
算術類型、引用和指針都屬于字面值類型
一個constexpr指針的初始值必須是nullptr或者0,或者是存儲于某個固定地址中的對象
函數(shù)體內(nèi)定義的變量一般來說并非存放在固定地址中,定義于所有函數(shù)體外的對象其地址固定不變
constexpr把它所定義的對象置為了頂層const
處理類型:
類型別名是某種類型的同義詞

typedef關鍵字

typedef double wages; //wages是double的同義詞
typedef wages base, *p; //base是double的同義詞,*p是double*的同義詞

typedef作為基本數(shù)據(jù)類型的一部分
別名聲明:using SI = int;
用關鍵字using作為別名聲明的開始,其后緊跟別名和等號,把等號左側的名字規(guī)定成等號右側類型的別名
auto類型說明符,讓編譯器替我們?nèi)シ治霰磉_式所屬的類型,通過初始值來推算
auto定義的變量必須有初始值
對常量對象取地址是一種底層const
如果希望推斷出的auto類型是一個頂層const,需要明確指出:

const auto f = ci;

decltype類型說明符:選擇并返回操作數(shù)的數(shù)據(jù)類型,在此過程中,編譯器分析表達式并得到它的類型

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容