c++ primer 學習漏洞總結區 ch3-ch4

ch3

ch3-1

頭文件中一般不會使用using,因爲頭文件需要被引入到其他的文件中,那麼using就會給源文件裏的名字帶來衝突。


ch3-2

string的直接初始化和拷貝初始化 前者是利用利用相應的構造器進行初始化,而後者則是通過等號對另一字符串進行拷貝

關於string的>> 通過鍵盤讀入存在緩存中,然後剔除前部多餘的空格,開始讀取字符串,直到遇到空格,非法輸入,或者結束標記。

getline方法 getline則會保留所有的空格,一直讀取知道遇到換行符或者結束標記,而且換行符會給扔掉,不會存進string裏面,如果讀取時碰到的第一個就是換行符,那麼就會得到一個空的字符串。

關於字符串的相加操作:二者相加,其中有一個必須是字符串,另一個可以使字符串也可以是由“ ”包圍的字符串字面值,而且整個相加過程爲從左往右


ch3-3

何爲類模板 類模板需要我們給他提供相應的信息,然後通過實例化創造出真正的類

vector作爲矢量容器,能夠容量大部分的對象,而引用不是對象,所以不能被存放在vector裏

對vector的初始化方式,有默認初始化,裏面啥也沒有,有利用構造器初始化的,還有拷貝初始化,最有特色的當屬利用列表初始化,利用{}擴住之後的成員
例如:vector v{“1”,“2”},同樣也有一種特殊的批量初始化方法vector v(len,val) 那麼裏面就會有了len個val

不建議在for循環遍歷vector成員時爲vector添加新的成員

對於vector來說,它能夠動態的增長,但是它動態增長的時候需要消耗時間,有時候因爲連續的空間不足,它可能還需要去尋找新的空間,這都要耗費大量的時間,所以建議若是一開始就知道整個vector大概會有多大時就給它初始化多大的空間

當仍未對vector對應位置進行初始化,那麼用下標訪問該位置就是非法操作


ch3-4

尾後迭代器 A.end()所返回的迭代器,將會指向A的最後一個元素的下一個位置
(注意,當A爲空時,那麼begin和end將會返回的迭代器將會指向同一個位置),注意該迭代器不能用來做遞增操作和解引用操作

關於== 當兩個迭代器指向同一個元素,或者他們指向同一個容器的end位置時,==就會返回true

關於iterator和const_iterator,前者只能夠指向非常量的成員,而後者既可以指向非常量成員也可以指向常量成員,後者要求僅能對成員進行讀取操作,而不能進行任何的修改操作,想要獲得後者,那麼我們需要運用的函數叫做cbegin,例如A.cbegin()就會返回一個常量迭代器

關於迭代器的運算 加法毫無意義,但是減法卻可以獲得兩個迭代器之間相差的成員個數,而這個個數可以是正的也可以是負的


ch3-5

關於數組 相較於vector,它的長度是固定的,而且會缺乏一點靈活性,但是它的性能還是非常好的,在我們聲明數組的時候,[ ]裏面用到的必須時常量表達式,任何auto型變量都不行

關於字符數組和字符串字面值,當我們要用=將後者賦值給前者的時候,我們需要預先增加一位的空間,以便存放字符串的結束字符\0

注意,數組是沒有辦法對數組進行直接的拷貝賦值的

☆☆☆關於複雜的數組聲明判定:
①int *p[10] 當沒有出現括號的時候從名字開始,名字叫p然後往右,好指向一個大小爲10的內存空間,然後每個空間存的是int指針,所有p是一個指針數組
②int (*parray)[10] 有括號先看括號裏的,好是一個指針,名字叫做parray,指向一個大小爲10的空間,空間存的是int變量,好了,parray是一個int數組的開頭指針
③int (&arrRef) [10] 好的首先arrRef是一個引用,引用的對象大小爲10,裏面裝的是int類型,所以arrRef是一個對於大小爲10的int數組的引用
注意:引用由於不是對象,所以引用是沒辦法成爲數組的成員的

當我們用auto i(array)時,i就會獲得一個指針,指針類型與array的的成員類型一致,例如array是一個int數組,那麼i就能獲得int指針。

數組用的begin和end函數:前者返回指向數組第一個成員的指針,而後者返回指向最後一個成員的下一個位置的指針。

關於指針的比較運算 與迭代器上類似,唯有是指向同一個數組當中的元素的指針纔有比較得價值。

可以通過過指針與下標結合,以現指針做相對尋址,找到對應的元素,而且指針的下標可以爲負數**(but,數組的下標必須不能是負數)**

c風格字符串: 即一個字符數組,而且末尾要以空字符結束
當我們使用strcat時,當最後結果的長度大於存放結果的字符數組的大小,那麼就會報錯

string與c風格字符串相互之間的賦值:
①string類型可以直接用字符數組來初始化 string s(arrary)
②但是c風格字符串要想用string來賦值則要經過一個函數 char *str= s.c_str()
(但是若果之後s發生了變化,同樣會影響到str,所以最後用拷貝複製一下字符串數組)


ch3-6

關於多維數組的遍歷: 最會採用下標去遍歷,也可用foreach循環,但是用auto去取的時候,要注意多維數組的上層維度裏面存的元素其實是數據類型的指針,要取其引用才能獲得對應下層元素的數組
在這裏插入圖片描述
例如這一part,row取到的是一個指針,指針本身無法執行foreach,所以內循環出編譯失敗


ch-4

ch4-1

重載運算符的特性:
我們可以決定其新的運算對象,返回類型,但是我們卻無法改變其固有的優先級,運算對象個數,還有是否適用結合律。

關於左值、右值:
前者可以作爲賦值運算的左邊而存在,右值則是非左值的存在,從本質上來看,前者提供的是一個位置,而後者提供的是一個值
規則如下:
在這裏插入圖片描述
當我們對一個指針解引用求decltype時,我們會得到一個指向該對象的引用,而對取地址求decltype時,我們則會得到一個指向該對象的指針

當我們在某個運算中的一部分改變了某個變量的值,那麼不適宜在運算的其他部分繼續使用該數值

ch4-3

各種邏輯運算符: 唯有邏輯非是右結合的
在這裏插入圖片描述
對於關係運算來說:一般來說,運算皆爲從左至右

ch4-4

賦值運算要求其左邊部分必須要是一個可以修改的左值

賦值運算符滿足的是右結合,即會先把=右側部分完成再交給左側,從右至左

例if(a=b) 中賦值運算符返回的是b的值,當以此值做判斷的時候,唯有0才爲假,其餘皆爲真。

ch4-6

關於選用前置遞增,後置遞增:一般來說,如果原值派不上用場,我們就會選用前置遞增,這樣能夠減少沒必要的運算。

ch4-9

關於sizeof 運算符: sizeof 並不實際去訪問對象或者類的內部,而是通過類型的定義直接獲得大小,一個未初始化或者無效的指針均可以,同時對該指針的解引用操作也可以進行sizeof,並不需要真正去解引用。

ch4-11

關於隱式轉換
在這裏插入圖片描述
除去算術轉換,還有這麼幾種隱式轉換:
①數值對指針進行賦值,那麼指針就會變成指向數組的首個元素的指針
②指針的轉換: void* 指針可以賦值給任意指針,而所有非常量指針也能轉換成void*,指向對象的指針可以轉換成爲const void*
③轉換bool類型: 任意數值皆可以轉換成bool
④轉化爲常量 任意數值均可以轉化成常量,但是不能用非常量引用去引用常量
⑤類類型的轉換: 字符串的字面值,就可以轉換成爲string類型
⑥關於is轉化爲bool類型,IO庫定義了從is轉換成爲bool的方法,當is上一次讀取成功時返回true,否則返回false

關於顯式轉換: 有三種
①static_cast 只要沒有底層const的都可以使用,知道並且不在乎潛在的精度損失。
格式 double dp = static_cast<double> p;
newtype a= static_cast <newtype#> b;
②const_cast 只能改變底層const,但是不能改變類型,想要強制改變類型則會到則編譯錯誤
③reinterpret_cast 用於將對應的內存部分,進行重新解釋,指鹿爲馬。

ch4-12

超級重點部分: 優先級從上到下降低
在這裏插入圖片描述

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