文章目錄
- 第2章 變量和基本類(lèi)型
- 2.1 基本內(nèi)置類(lèi)型
- 2.1.1 算術(shù)類(lèi)型
- 2.1.2 類(lèi)型轉(zhuǎn)換
- 2.1.3 字面值常量
- 2.2 變量
- 2.2.1 變量定義
- 2.2.2 變量聲明與定義的關(guān)系
- 2.2.3 標(biāo)識(shí)符
- 2.2.4 名字的作用域
- 2.3 復(fù)合類(lèi)型
- 2.3.1 引用(左值引用)
- 2.3.2 指針
- 2.3.3 理解復(fù)合類(lèi)型的聲明
- 2.4 const限定符
- 2.4.1 const的引用
- 2.4.2 指針和const
- 2.4.3 頂層const
- 2.4.4 constexpr和常量表達(dá)式
- 2.5 處理類(lèi)型
- 2.5.1 類(lèi)型別名
- 2.5.2 auto類(lèi)型說(shuō)明符
- 2.5.3 decltype
- 2.6 自定義數(shù)據(jù)類(lèi)型
- 2.6.1 定義Sales_data類(lèi)型
- 2.6.2 使用Sales_data類(lèi)
- 2.6.3 編寫(xiě)自己的頭文件
- 小結(jié)
- 術(shù)語(yǔ)表

為鐵西等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及鐵西網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站建設(shè)、
成都做網(wǎng)站、鐵西網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
第2章 變量和基本類(lèi)型
2.1 基本內(nèi)置類(lèi)型
- 算術(shù)類(lèi)型(字符 整型 布爾型 浮點(diǎn)型 ) 空類(lèi)型
2.1.1 算術(shù)類(lèi)型
| 類(lèi)型 | 含義 | 最小尺寸 |
|---|
| bool | 布爾類(lèi)型 | / |
| char | 字符 | 8 |
| wchar_t | 寬字符 | 16 |
| char16_t | Unicode字符 | 16 |
| char32_t | Unicode字符 | 32 |
| short | 短整型 | 16 |
| int | 整型 | 16 |
| long | 長(zhǎng)整型 | 32 |
| long long | 長(zhǎng)整型 | 64 |
| float | 單精度浮點(diǎn)型 | 6位有效數(shù)字 |
| double | 雙精度浮點(diǎn)型 | 10位有效數(shù)字 |
| long double | 擴(kuò)展精度浮點(diǎn)型 | 10位有效數(shù)字 |
char 空間確保可存放機(jī)器基本字符集任意字符對(duì)應(yīng)數(shù)字值
wchar_t char16_t char32_t 確??纱娣艡C(jī)器大擴(kuò)展字符集任意字符
賦予內(nèi)存中某地址明確含義需知道存儲(chǔ)在地址的數(shù)據(jù)類(lèi)型,類(lèi)型決定數(shù)據(jù)所占比特?cái)?shù)/解釋比特內(nèi)容
浮點(diǎn)型 :?jiǎn)?雙/擴(kuò)展精度浮點(diǎn)型 float 1個(gè)字32bit;double 2個(gè)字64bit;long double 3/4個(gè)字96/128bit
- 帶符號(hào)類(lèi)型 無(wú)符號(hào)類(lèi)型
- (除去 布爾型 擴(kuò)展字符型)整型可分 帶/無(wú)符號(hào)類(lèi)型
- 帶符號(hào):正、負(fù)、0;無(wú)符號(hào):大于0
- int short long ,long long 均為帶符號(hào),加unsigned為無(wú)符號(hào);unsigned int 可簡(jiǎn)寫(xiě)為unsigned
- 字符型:char(實(shí)際上會(huì)為后兩種的其中一種由編譯器決定)、signed char、unsigned char
- unsigned char可表示0-255區(qū)間內(nèi)的值,signed char表示范圍-128-127
- 如何選擇類(lèi)型
- 明確值不可能為負(fù)時(shí)選無(wú)符號(hào)類(lèi)型
- 整數(shù)運(yùn)算用int,超出int范圍用long long
- 算數(shù)表達(dá)式不使用char/bool
- 浮點(diǎn)數(shù)運(yùn)算用double(float精度不夠/計(jì)算代價(jià)相差不大)
2.1.2 類(lèi)型轉(zhuǎn)換
- 類(lèi)型所能表示的值得范圍決定了轉(zhuǎn)換的過(guò)程
- 非bool->bool: 0->false; other->ture
- bool->非bool:false->0; ture->1
- 浮點(diǎn)->整型:僅保留小數(shù)點(diǎn)前部分
- 整型->浮點(diǎn):小數(shù)部分記為0,若超出浮點(diǎn)類(lèi)型容量則精度可能有損失
- 給無(wú)符號(hào)賦超出范圍的值->初始值對(duì)無(wú)符號(hào)類(lèi)型表示數(shù)值總數(shù)取模后的余數(shù)
- 給帶符號(hào)類(lèi)型賦超出表示范圍的值,結(jié)果為未定義
- 避免無(wú)法預(yù)知(編譯器無(wú)需/不能檢測(cè)的錯(cuò)誤)和依賴(lài)于現(xiàn)實(shí)環(huán)境的行為
- 含有無(wú)符號(hào)類(lèi)型的表達(dá)式
- 負(fù)數(shù)和無(wú)符號(hào)數(shù)相加,先將負(fù)數(shù)轉(zhuǎn)換為無(wú)符號(hào)數(shù)類(lèi)似直接給無(wú)符號(hào)數(shù)賦一個(gè)負(fù)值,結(jié)果等于這個(gè)負(fù)數(shù)加上無(wú)符號(hào)數(shù)的模
- 從無(wú)符號(hào)數(shù)減去一個(gè)值(無(wú)論是不是無(wú)符號(hào)數(shù)),須確保結(jié)果不能是一個(gè)負(fù)值
- 循環(huán)中的條件,for不要寫(xiě)無(wú)符號(hào)數(shù)>=0;因?yàn)槠溆肋h(yuǎn)也不會(huì)小于0,會(huì)導(dǎo)致死循環(huán);改用while(u>0){–u;}
- 切勿混用帶符號(hào)類(lèi)型和無(wú)符號(hào)類(lèi)型
- 帶符號(hào)數(shù)會(huì)自動(dòng)轉(zhuǎn)換為無(wú)符號(hào)數(shù)
2.1.3 字面值常量
- 整型和浮點(diǎn)型字面值
- 0開(kāi)頭八進(jìn)制,0x開(kāi)頭16進(jìn)制
- 字符和字符串字面值
- 單引號(hào)字符字面值’a’
- 雙引號(hào)字符串字面值"a"(常量字符構(gòu)成的數(shù)組array,編譯器在字符串結(jié)尾添加’\0’,故長(zhǎng)度比內(nèi)容多一;可以分行書(shū)寫(xiě)"hello"“world”)
- 轉(zhuǎn)義序列
- 不能直接使用:1. 不可打??;2. 特殊含義字符:?jiǎn)我?hào) 雙引號(hào) 問(wèn)號(hào) 反斜線
- 換行 \n 橫向制表\t 縱向制表\v 退格\b 雙引號(hào)
\"反斜杠\\回車(chē)\r … - 泛化的轉(zhuǎn)義序列 \x后跟一個(gè)或多個(gè)16進(jìn)制數(shù)字,\后跟1/2/3個(gè)八進(jìn)制數(shù)字
- 指定字面值的類(lèi)型(前綴(字符和字符串字面值)u,U,L,u8;后綴(整型/浮點(diǎn)型字面值)U,L,LL, F,L)
- 布爾字面值和指針字面值
- 布爾:true false ;指針:nullptr
2.2 變量
- 具名的 可供操作的儲(chǔ)存空間;數(shù)據(jù)類(lèi)型決定變量所占內(nèi)存空間大小和布局方式,存儲(chǔ)值的范圍,能夠參與的運(yùn)算;變量和對(duì)象可以互換使用
2.2.1 變量定義
- 類(lèi)型說(shuō)明符 變量名(變量名以逗號(hào)分隔 以分號(hào)結(jié)束)
- 對(duì)象:一塊能存儲(chǔ)數(shù)據(jù)并具有某種類(lèi)型的內(nèi)存空間
- 初始值:創(chuàng)建變量時(shí)獲得的特定值(初始化);初始化不是賦值,賦值:把對(duì)象的當(dāng)前值擦除而以一個(gè)新值替代
- 列表初始化int a=0;int a={0};int a{0};//花括號(hào)列表初始化 int a(0);
- 默認(rèn)初始化:定義時(shí)沒(méi)指定初值變量被默認(rèn)初始化;內(nèi)置類(lèi)型定義于函數(shù)體外初始化為0,定義于函數(shù)體內(nèi)則不被初始化。(建議初始化每一個(gè)內(nèi)置類(lèi)型變量)
2.2.2 變量聲明與定義的關(guān)系
- 分離式編譯:將程序分割為若干個(gè)文件,每個(gè)文件可被獨(dú)立編譯
- 聲明:使名字為程序所知(規(guī)定變量的類(lèi)型和名字)(extern);定義:負(fù)責(zé)創(chuàng)建與名字關(guān)聯(lián)的實(shí)體(規(guī)定變量的類(lèi)型和名字外還申請(qǐng)儲(chǔ)存空間/可能為變量賦初始值);任何包含顯式初始化的聲明即成為定義;函數(shù)體內(nèi)部試圖初始化extern關(guān)鍵字標(biāo)記的變量將引發(fā)錯(cuò)誤;變量只能被定義一次但可被多次聲明
- c++靜態(tài)類(lèi)型語(yǔ)言,編譯階段檢查類(lèi)型
2.2.3 標(biāo)識(shí)符
- 字母 數(shù)字 下劃線組成,必須以字母或者下劃線開(kāi)頭;長(zhǎng)度無(wú)限制,大小寫(xiě)敏感
- 不能被用作標(biāo)識(shí)符:保留字,標(biāo)準(zhǔn)庫(kù)保留名字(連續(xù)兩個(gè)下劃線/下劃線緊連大寫(xiě)字母開(kāi)頭),定義在函數(shù)體外標(biāo)識(shí)符不能以下劃線開(kāi)頭
- 變量命名規(guī)范:
- 標(biāo)識(shí)符要體現(xiàn)實(shí)際含義
- 變量名一般用小寫(xiě)字母
- 自定義類(lèi)名以大寫(xiě)字母開(kāi)頭
- 標(biāo)識(shí)符由多單詞組成,單詞間應(yīng)明顯區(qū)分(下劃線或駝峰)
2.2.4 名字的作用域
- c++作用域以花括號(hào)分割
- 名字有效區(qū)域:始于名字聲明語(yǔ)句,終于聲明語(yǔ)句所在作用域末端
- 全局作用域:定義在函數(shù)體外(花括號(hào)外);塊作用域
- 嵌套的作用域
- 內(nèi)層作用域:被包含(被嵌套)的作用域 (允許內(nèi)層作用域中重新定義外層作用域已有的名字)
- 外層作用域:包含著別的作用域的作用域
- 局部變量正在作用域內(nèi)(in scope)會(huì)覆蓋全局變量;域操作符左側(cè)為空如 ::g_cat即為全局作用域?qū)?yīng)變量
2.3 復(fù)合類(lèi)型
- 基于其他類(lèi)型定義的類(lèi)型:引用 指針
- 聲明語(yǔ)句: 數(shù)據(jù)類(lèi)型 變量名;基本數(shù)據(jù)類(lèi)型 聲明符列表
2.3.1 引用(左值引用)
- 為對(duì)象另起一個(gè)名字,定義引用&(必須初始化)時(shí),程序?qū)⒁煤统跏贾到壎ǘ皇强截?;引用本身不是?duì)象不能定義引用的引用;引用只能綁定在對(duì)象上,不能與字面值或表達(dá)式計(jì)算結(jié)果綁定在一起
2.3.2 指針
- 指向另外一種類(lèi)型的符合類(lèi)型(存放某個(gè)對(duì)象的地址);
- 和引用的不同
- 指針本身是一個(gè)對(duì)象,允許指針賦值和拷貝,可以先后指向不同的對(duì)象;
- 指針無(wú)須在定義時(shí)賦初值
- 獲取對(duì)象地址
- 使用取地址符&
- 除兩例外情況外,指針類(lèi)型都要與指向?qū)ο髧?yán)格匹配
- 指針值(地址)
- 指向一個(gè)對(duì)象
- 指向緊鄰對(duì)象所占空間的下一個(gè)位置
- 空指針
- 無(wú)效指針
- 利用指針訪問(wèn)對(duì)象
- 使用解引用符(*)(僅適用于指向某個(gè)對(duì)象的有效指針)訪問(wèn)對(duì)象,給解引用的結(jié)果賦值,實(shí)際上就是給指針?biāo)傅膶?duì)象賦值
- 在聲明語(yǔ)句中,
&和*用于組成復(fù)合類(lèi)型(引用 指針);在表達(dá)式中他們轉(zhuǎn)變成運(yùn)算符(取地址 解引用)
- 空指針
- 不指向任何對(duì)象,使用指針前先檢查其是否為空
- 初始化(nullptr(最好使用nullptr),0,NULL(盡量避免))
- 不能把int型變量直接賦值給指針 變量值恰好為0也不行
- 賦值和指針
- 定義引用后無(wú)法令其再綁定到另外的對(duì)象
- 給指針賦值令它存放一個(gè)新的地址,指向新的對(duì)象
- 賦值永遠(yuǎn)改變的是等號(hào)左側(cè)的對(duì)象
- 其他指針操作
- 任何非0指針的條件值都是true
- == 指針存放的地址值相同:都為空;都指向同一個(gè)對(duì)象;都指向同一對(duì)象的下一地址
- void*指針
- 可用于存放任意(類(lèi)型)對(duì)象的地址
- 與別的指針比較;作為函數(shù)輸入輸出;賦給另外一void指針;不能直接操作void指針?biāo)笇?duì)象
2.3.3 理解復(fù)合類(lèi)型的聲明
- 一條定義語(yǔ)句可能定義出不同的數(shù)據(jù)類(lèi)型,如
int 1=1024,*p=&i,&=i;
- 定義多個(gè)變量
- 類(lèi)型修飾符
&和*,對(duì)聲明語(yǔ)句中的其他變量不產(chǎn)生任何作用。建議將&或*與變量名連在一起
- 指向指針的指針
- 指針本身也有自己的地址,
**表示指向指針的指針,***表示指向指針的指針的指針
- 指向指針的引用
- 引用本身不是對(duì)象,不能定義指向引用的指針,但存在對(duì)指針(是對(duì)象)的引用
int *p;int *&r=p;
- 面對(duì)比較復(fù)雜的指針或者引用的聲明語(yǔ)句使,從右向左閱讀有助于弄清楚其真實(shí)含義
2.4 const限定符
- const對(duì)象一旦創(chuàng)建后值就不能再改變,必須初始化
- 初始化和const 只能在const類(lèi)型的對(duì)象上執(zhí)行不改變其內(nèi)容的操作
- 默認(rèn)狀態(tài)下 const對(duì)象盡在文件內(nèi)有效,多文件共享方法:const變量不管是聲明還是定義都添加extern關(guān)鍵字
2.4.1 const的引用
- 對(duì)常量的引用:引用及其對(duì)應(yīng)的對(duì)象都是常量const
- 引用的對(duì)象是常量還是非常量都不會(huì)影響引用和對(duì)象的綁定關(guān)系
- 初始化和對(duì)const的引用 引用類(lèi)型和引用對(duì)象類(lèi)型應(yīng)一致的兩個(gè)例外:初始化常量引用時(shí)允許用任意表達(dá)式作為初始值,只要表達(dá)式結(jié)果能轉(zhuǎn)換為引用類(lèi)型即可(綁定臨時(shí)量對(duì)象);
- 對(duì)const的引用可能引用一個(gè)并非const對(duì)象
int i=42;const int &r2=i;i可以改變,但不允許通過(guò)r2修改i的值
2.4.2 指針和const
2.4.3 頂層const
- 頂層const 指針/任意對(duì)象本身是個(gè)常量
- 底層const 指針?biāo)赶虻?引用對(duì)象是個(gè)常量(用于聲明引用的const都是底層const)
- 對(duì)象的拷貝操作,頂層const(被拷貝對(duì)象)不受什么影響,底層const拷入和拷出的對(duì)象必須具有相同的底層const資格/兩對(duì)象的數(shù)據(jù)類(lèi)型必須能夠轉(zhuǎn)換;非常量可以轉(zhuǎn)換為常量反之不行
2.4.4 constexpr和常量表達(dá)式
- 常量表達(dá)式:值不會(huì)改變并且在編譯過(guò)程中就能得到計(jì)算結(jié)果的表達(dá)式(如 字面值 用常量表達(dá)式初始化的const對(duì)象)
- constexpr變量:將變量聲明為constexpr以便由編譯器來(lái)驗(yàn)證變量的值是否是一個(gè)常量表達(dá)式;若認(rèn)定變量是一個(gè)常量表達(dá)式就將其聲明成constexpr類(lèi)型
- 字面值類(lèi)型:算術(shù)類(lèi)型 引用 指針; 不屬于字面值類(lèi)型: 自定義類(lèi) IO庫(kù) string
- constexpr指針的初始值必須是nullptr/0/存儲(chǔ)于某個(gè)固定地址中的對(duì)象
- 指針和constexpr:constexpr限定符僅對(duì)指針有效,與指針?biāo)傅膶?duì)象無(wú)關(guān),constexpr將其所定義的對(duì)象置為頂層const
2.5 處理類(lèi)型
- 復(fù)雜性:難拼寫(xiě) 不清楚需要的類(lèi)型是什么
2.5.1 類(lèi)型別名
2.5.2 auto類(lèi)型說(shuō)明符
- 讓編譯器通過(guò)初始值來(lái)推算變量的類(lèi)型
- 一條聲明語(yǔ)句中只能有一個(gè)基本數(shù)據(jù)類(lèi)型,同一條auto語(yǔ)句中所有變量的初始基本數(shù)據(jù)類(lèi)型都必須一致
- 復(fù)合類(lèi)型 常量 和 auto
- auto一般會(huì)忽略頂層const,保留底層const;如果希望推斷出的auto是頂層const須明確指出 即在auto前加const
- 設(shè)置一個(gè)類(lèi)型為auto的引用時(shí),初始值中的頂層常量屬性仍然保留
- &和*只從屬于某個(gè)聲明符而非數(shù)據(jù)類(lèi)型的一部分 因此初始值必須是同一種類(lèi)型
2.5.3 decltype
- 選擇返回操作數(shù)的數(shù)據(jù)類(lèi)型,編譯器分析表達(dá)式并得到它的類(lèi)型,卻不實(shí)際計(jì)算表達(dá)式的值
- decltype處理頂層const和引用的方式與auto不同,若decltype使用的表達(dá)式是一個(gè)變量則decltype返回該變量的類(lèi)型(包括頂層const 和引用在內(nèi))
- decltype和引用
- 引用類(lèi)型作為表達(dá)式的一部分結(jié)果將是一個(gè)具體值而非引用
- 若表達(dá)式內(nèi)容是解引用操作,decltype將得到引用類(lèi)型
- decltype((variable))的結(jié)果永遠(yuǎn)是引用
2.6 自定義數(shù)據(jù)類(lèi)型
- 數(shù)據(jù)結(jié)構(gòu):把一組相關(guān)的數(shù)據(jù)元素組織起來(lái)然后使用它們的策略和方法,c++允許用戶(hù)以類(lèi)的形式自定義數(shù)據(jù)類(lèi)型
2.6.1 定義Sales_data類(lèi)型
- struct 類(lèi)名 類(lèi)體(花括號(hào){}包圍形成一個(gè)新的作用域) 分號(hào);
- 類(lèi)數(shù)據(jù)成員 類(lèi)內(nèi)初始值 沒(méi)有初始化的成員將被默認(rèn)初始化
2.6.2 使用Sales_data類(lèi)
- 添加類(lèi)對(duì)象
- 對(duì)象讀入數(shù)據(jù)(使用點(diǎn)操作符.讀入對(duì)象成員)
- 輸出兩個(gè)對(duì)象的和
2.6.3 編寫(xiě)自己的頭文件
- 頭文件通常只包含那些只能被定義一次的實(shí)體 如類(lèi)/const/constexpr
- 預(yù)處理器概述(確保頭文件多次包含仍能安全工作)
- 編譯之前執(zhí)行的一段程序 可部分的改變我們寫(xiě)的程序
- 頭文件保護(hù)符 依賴(lài)于預(yù)處理變量
- #define 將一個(gè)名字設(shè)定為預(yù)處理變量
- #ifdef 變量已定義為真
- #ifndef 變量未定義時(shí)為真
- 一旦檢查結(jié)果為真,執(zhí)行后續(xù)操作直到遇到#endif指令為止
- 預(yù)處理變量無(wú)視c++中關(guān)于作用域的規(guī)則
- 預(yù)處理變量包括頭文件保護(hù)符必須唯一 一般預(yù)處理變量名字全部大寫(xiě)
- 一般習(xí)慣性加上頭文件保護(hù)符
小結(jié)
- 類(lèi)型 分為非常量和常量 常量對(duì)象必須初始化,一旦初始化就不能再改變
- 復(fù)合類(lèi)型(以其他類(lèi)型為基礎(chǔ)) 指針 引用
- 以類(lèi)的形式自定義類(lèi)型,c++庫(kù)提供高級(jí)抽象類(lèi)型如string
術(shù)語(yǔ)表
| | | | | |
|---|
| address | alias declaration | arithmetic type | array | auto | base type |
| bind | byte | class member | compound type | const | const pointer |
| const reference | const experession | constexpr | conversion | data member | declaration |
| declarator | decltype | default initiatialization | defintion | escape sequence | global scope |
| header guard | identifier | in-class initializer | in scope | initialized | inner scope |
| integral type | list initialization | literal | literal | local scope | low-level const |
| member | nonprintable character | null pointer | nullptr | object | outer scope |
| pointer | pointer to const | preprecessor | reference | reference | reference to const |
| scope | class | namespace | block | separate compilation | signed |
| string | struct | temporary | top-level const | type alias | type checking |
| type specifiler | typedef | undefined | uninitialized | unsigned | variable |
| void* | void | word | & operator | * operator | #define |
| #endif | #ifdef | #ifndef | | | |
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站標(biāo)題:c++primer第2章變量和基本類(lèi)型-創(chuàng)新互聯(lián)
文章網(wǎng)址:
http://m.jiaotiyi.com/article/pjjoh.html