數(shù)據(jù)類型告訴我們數(shù)據(jù)的意義以及操作
2.1 基本內(nèi)置類型
2.1.1 算術(shù)類型
整形(包括字符和bool類型)产场、浮點型
C++中只規(guī)定了內(nèi)置類型的最小尺寸
2.1.2 類型轉(zhuǎn)換
尤其注意帶符號和不帶符號之間的轉(zhuǎn)換
2.1.3 字面值常量
(literal)eg:42|'a'|"Hello world!"|nullptr|false
轉(zhuǎn)義序列
eg:\n|\t|\\|\?
可以通過加前后綴的方法指定字面值常量的類型
L'a'|42ULL
2.2變量
提供一個具名的秕铛、可供程序操作的存儲空間
2.2.1 變量定義
類型說明符 一個多個變量名(逗號隔開);
int a,b,c;
對象和變量一般互換使用,對象通常指的是一塊能存儲數(shù)據(jù)并具有某種數(shù)據(jù)類型的內(nèi)存空間.
對變量初始化是習(xí)慣必要的迷守,初始化與賦值不同
用列表初始化可以方便的檢測出初始值是否用丟失信息的風(fēng)險eg: ing a={0};
默認(rèn)初始化:定義與任何函數(shù)體外的變量被初始化為0,其它值被默認(rèn)初始化(初始值是多少奸晴?),例外情況:定義于函數(shù)體內(nèi)的內(nèi)置類型變量不會被初始化。因此對變量初始化是習(xí)慣必要的
2.2.2 變量聲明和定義
C++支持分離式編譯介返,允許程序分割為若干文件盯腌,每個文件可以獨立編譯,如何在文件間共享代碼?
聲明使名字被程序所知,一個文件想要使用別處定義的名字就必須包含對那個名字的聲明鬼譬。定義創(chuàng)建了與名字相關(guān)聯(lián)的實體
聲明 extern int i;
定義 int j;
只要顯示初始化變量就看作定義變量,如果想在多個文件中共用同一個變量,聲明變量必須分離,聲明能有多次租幕,定義只能有一次
2.2.3 標(biāo)識符
由字母、數(shù)字拧簸、下劃線組成劲绪,必須以字母、下劃線開頭
注意使用命名規(guī)范提高程序可讀性
變量名用小寫字母盆赤,類名用大寫字母開頭贾富、多個單詞間隔開
2.2.4 作用域
C++作用域用{}分隔
2.3復(fù)合類型
基于其他類型定義的類型,這里重點介紹引用和指針
2.3.1 引用
左/右值引用,右值引用是對內(nèi)置類講的牺六,這里指左值引用.引用類型必須和其引用對象類型一致
int ival=1;
int &refVal=ival;
int &refVal4=10;\\error 引用類型初始值必須為一個對象
引用必須被初始化颤枪,因為引用只是給另外一個已經(jīng)存在的對象起了別名,所以引用必須綁定.同理沒有引用的引用,一旦綁定就不能綁定到其他對象
2.3.2 指針
pointer 指向另外一個類型的負(fù)荷類型淑际,和應(yīng)用類似實現(xiàn)了其他對象的間接訪問畏纲,但是1 指針本身是一個對象扇住;2 指針無需定義時賦值,當(dāng)然建議初始化盗胀。
int *p1,*p2;//指針定義
double dval,*dp2;
dp2=&dval;
int ival=42;
int *p=&ival;//取地址符 &獲取對象地址
cout<<*p;//解地址符*
p=&dval;//error
指針非常復(fù)雜以后接觸到再說
空指針
int *p1=nullptr; //等價于 int *p1=0;
int *p2=0; //#include cstdlib
int *p3=NULL;//等價于 int *p3=0;
nullptr是C++11剛引入的艘蹋,是一種特殊類型的字面值,可以轉(zhuǎn)換為任意其他指針類型票灰,最好使用nullptr而不是NULL女阀。
賦值
和引用不同,指針和其他變量一樣可以給指針賦值屑迂。
void* 指針
是一種特殊的指針類型,可以存放任意對象地址,void*指針中存放了一個地址浸策,里面具體放了什么類型對象,并不知道惹盼。
void *視角看內(nèi)存空間就是內(nèi)存空間庸汗,沒辦法訪問內(nèi)存空間對象.
double obj=3.14;
int ival=3;
void *pv=&obj;
pv=&ival;
2.3.3 理解符合類型的申明
int *p;//*修飾的是p,并不是int
//類型修飾符只是聲明符的一部分
int *p1,*p2;
指向指針的指針
int **p1,***p1;//依次類推
int ival=1024;
int *pi=&ival;
int **pi=π
不能定義指向引用的指針手报,但是存在指針的引用
理解類型是什么蚯舱,最簡單的方法是從右到左閱讀r的定義,離變量名最近的符號對變量類型有最直接的影響
int i=21;
int *p;
int *&r=p;//對指針p的引用
r=&i;//相當(dāng)于p=&i
*r=0;//后果i=0
2.4 const
const 標(biāo)志變量類型是常量,必須初始化。
因為在編譯時昧诱,會把出現(xiàn)這個常量的地方,全部替換對應(yīng)初始值.
const int buff_size=1024;
注意 const對象被設(shè)定為僅在文件內(nèi)有效
如果想要在文件間共享所袁,如果是常量表達(dá)式盏档,使用extern聲明就好。
如果不是常量表達(dá)式燥爷,則需要在不論在定義還是聲明都是用extern
extern const int bufsize
同時在具體定義時使用
extern const int bufsize=fun();
2.4.1 對常量的引用
必須使用常量類型的引用來引用常量蜈亩,常量引用只是對引用可以參與的操作做了限制
const int ci=1;
const int &r1=ci;
常量引用可以綁定非常量對象,非常量引用并不能綁定常量對象
double dval=3.14;
const int &ri=dval;
//會發(fā)生以下事件
const int temp=dval;
const &ri=temp;
//顯然如果是對非常量引用這么操作是沒有意義的前翎,
//因為如果是非常量引用稚配,
//你肯定是想改變dval的值,顯然是不可能的港华,
//所以只有常量引用才會過編譯
2.4.2 指針和const
指向常量的指針道川,同常量引用類似,都是指向?qū)ο蟮某A恐羔樆蛘咭昧⒁耍僮魇艿较拗泼疤选V赶虻膶ο笫遣皇浅A浚⒉魂P(guān)心橙数。
常量指針 const指針 不允許改變指針本身的值,但是如果指向的不是常量尊流,就可以改變指針指向的值
int num=9;
int *const curErr=#
注意與const int *p的區(qū)別
2.4.3 頂層const
top-level const 表示指針本身是常量,一般化 表示任意對象是常量
low-level const 表示指針指向的對象 是常量灯帮,一般化 與指針和引用等符合類似的基本類型部分相關(guān)崖技,底層const拷貝時逻住,拷出對象必須具有相同的const資格,或者兩個對象的數(shù)據(jù)類型可以相互轉(zhuǎn)換迎献,譬如非常量轉(zhuǎn)換常量
2.4.4 常量表達(dá)式與constexpr
- 值不會變
- 在編譯是就可以得到計算結(jié)果的表達(dá)式
C++11新標(biāo)準(zhǔn)規(guī)定使用constexpr聲明變量有編譯器驗證變量是否是一個常量表達(dá)式
字面值類型
可以被定義成constexpr的類型瞎访,稱為字面值類型,literal type
指針和constexpr
constexpr聲明中如果定義一個指針忿晕,constexpr會把指針變?yōu)轫攲觕onst
constexpr int *p=nullptr;\\一個頂層非底層const指針