c++ primer 學習漏洞總結區 ch1-ch2

ch-1

1-2

輸出運算符 << :os<< A 其實就是把右側的內容傳到左側的流中,流則會將內容傳到待輸出的緩存區中,然後返回原來的輸出流,但是只有在流接收到endl(亦稱操縱符)時纔會將所有的內容輸出到輸出設備上

輸入運算符 >> :原理接近於前者,但是會有一定的匹配功能,比如 is>>int 那麼就會接受一個int類型,碰到非數字字符的時候就會停止,扔掉那個無關字符,然後返回is繼續完成第二個輸入。

作用域操作符 :: :指明想要用的庫,避免產生名字衝突。而且::A可以直接用來指示全局下所定義的A。

1-4

while(is>>A) :因爲輸入完之後會返回的流,此時while的條件就會檢測is,若是is成功輸入,那麼爲真,若是遇到文件結束符(當鍵盤的輸入的時候,crtl+z就是結束符),或者讀取的是整型,卻傳來一個字母,就會返回無效狀態,然後爲假,結束循環

1-6

關於c++的類型檢查,c++作爲一種靜態數據類型語言,會在編譯的時候就檢查數據類型,而Python則會在運行過程中才檢查,它是數據不嚴格的,動態進行調整。


ch-2

2-1

char與unsigned char,signed char : 前者用來表示的是字符,而後面兩者則使用表示較小的有符號數和無符號數

無符號與有符號的運算:將會將有符號轉化無符號再進行運算

cout<<“A”“B”<<endl : "A"被視作常量字符組成的數組,可以連用 ;而且轉義字符可以用數字去替換其\後的字母
例如:\12等同於\n
注意!在反斜槓後面只有8進制或者16進制,帶x的是16,其餘不管前面補0與否都是八進制,最大三位

各種字面值的前後綴:
在這裏插入圖片描述
例子:
練習2.5 中的:L“a” 表示的是一個裏面元素全是寬字符類型的常字符數組,有一個元素a,還有一個元素\0

2-2

賦值與初始化: 二者要區分開來,前者是抹除當前的值再用新值代替,而後者則是在創建的初期賦予一個初始值。

關於列表初始化:
傳統的初始化流程 int A=val; 會將val自動轉化爲A的數據類型再賦予爲A的初值
列表初始化流程 int A{val}; 不會轉化,若是數據類型對不上就會報錯
關於全局賦值和局部賦值:c++中規定,全局的數字類型變量將都會賦值爲0,而局部的則不會給他初始化,若不初始化就用就會報錯。
字符串的初始化 :字符串本身具有無參構造函數,會自動生成一個空串,僅有一個\0

關於聲明與定義:
在這裏插入圖片描述
前者用於聲明,後者用於定義,聲明可以有多次,但定義只能有一次,
重複定義會報錯;而關於聲明,其實他的作用是爲了作爲一個接收器,去接收別人文件已經定義了的變量
(注意,不能給聲明做顯式初始化,否則將會把它變成定義)

2-3

何爲引用: int &r= v; 在此定義之下,將會將r作爲v的別名,對r操作等同於對v操作,引用類型r的類型爲int,則v必須也要是int類型,且要是一個int的對象,或者int的引用也可以,不能沒有。(引用一旦初始化將沒辦法再綁定其他對象)

何爲預處理變量:即由預處理器管理的變量,不屬於任何命名空間,如NULL,現如今對指針進行初始化最好使用nullptr。

不能通過void*指針來操作它所指的部分,因爲當不清楚類型時,無法決定操作,但可以指向任何類型的地址。

int是不能直接傳給int*的,即便int裏面本身存的是個地址,必須用地址符告訴指針這是個地址

當定義變量的時候公式(簡單版)如下 基本類型(複雜類型) 修飾符(&,*) 變量名。
例如int * p1,p2,其實本質上是p1爲int指針,p2是int類型

引用的本身不是對象,所以指針不能指向引用;指針是對象,所以引用可以引用指針
例如:int *&r=p; p是一個指針,而r就是對其的引用

2-4 ☆

const對象必須要進行初始化,因爲const需要鎖定這初始值,但是可以用字面值或者普通的對象去對它進行初始化

默認情況下,const只在自己的文件底下有用,但是有一種特殊情況,可以使得const常量可以在多個文件下共用,則要在其聲明和定義的語句上都加上extern
在這裏插入圖片描述
const常量只能被const常量所引用,所以無法被引用所改變(但是常量引用可以引用非常量對象,字面值,甚至一般表達式,而且形式不一時,會將其傳到臨時量上,再傳給常量

常量只能由常量指針來指向,但是常量指針可以指向非常量,在這種情況下,不能通過指針去改變所指的數值,但是可以通過其他手法去改變。

指向常量的指針和常指針之別:(常指針即指定的對象不變,不是對象的值不可變)
前者的定義方式 const type p=adress;
後者的定義方式 type * const p=adress;
閱讀的方式 從右往左,例如指向常量的指針,先是名字是p,然後是,所以是一個指針,然後是其所指向的內容是一const的type,所以p是一個指向常量的指針

何爲頂層const和底層const:頂層則是你自己不能變,而底層則是你所指的或引用的不能變。頂層靠右,底層靠左。(執行拷貝操作是要求有具有相同的底層類型)

區分常量表達式與常量:
常量只要求定義爲常量,但是前者則需要在編譯的時候就給出計算結果的表達式,且值在後續不會發生改變。

constexpr定義的量要求是常量,而且必須用常量表達式來初始化(C++11標準下,允許用一個足夠簡單的函數,在編譯的過程就能得出結果,來初始化constexpr)。

2-5

typedef typedef double *p means:p是一個double指針的同義詞

using using A = B 即將A看作是B的別名

在這裏插入圖片描述
如何去理解第二行,按從右往左,首先名字叫做cstr,其是cstr,也就是一個字符指針,然後再到const,就是該指針是常指針**(不能拆開pstring來進行理解,這是一個獨立的類型)**

☆auto:通過輸入的值去推斷輸出的值的類型,而且auto還會略過別名,直指你的本質,如用int引用類型賦值給auto類型,就會得到int類型**(而且在轉化過程會忽略你的頂層const,就是auto定義出來的是一個變量,除非你在前面給他帶個const的帽子,保留你的底層const,原來指的是常量,之後也會是)**

在這裏插入圖片描述
第一行ci是一個常量int,g是一個對常量int的引用
第二行42是一個字面值,要用引用綁定字面值,則必須要是常量類型的引用,給帶個帽子
總結:對於auto引用來說,若是後面是常量,能檢測到(頂層const被保留下來),自動變換,不用戴帽子,若是字面值,則需要帶個帽子

decltype:通過獲取操作數的返回類型去定義其他量,如果操作數裏是解引用操作,那麼就會返回引用的類型,如果操作數裏還有一層括號那麼就會返回引用類型。

auto與decltype的差別:①前者需要通過編譯器計算初值,從而確定類型,後者不用 ②前者可能會得到與初始值不同的類型,比如給的是int的引用,auto就會變成int,而後者則會完全依照類型,得到int引用 ③前者一般都會忽略掉其頂層const,而後者會保留下來哦

關於頭文件保護符:起到一個防止一個頭文件被重複地包含進來,同預處理變量來實現的,若是已經進來過了,那麼已經被定義過,則條件返回爲否。
相關知識

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章