看C 的一些瑣碎(第一部分2 8章)

2021-06-27 17:43:00 字數 4531 閱讀 4092

看c++的一些瑣碎(隨時更新)

之前寫的從物件導向看c++系列暫時告于段落了,將的基本上是c++的一些oop設計機制。但是,c++是一門強大的語言,不僅僅是

oop的,還有很多其他方面的,具體的應用。在這裡,記錄一些我在可能《c++primer》時感覺比較好的地方,或者自己沒有注意的地方,沒什麼邏輯。

1.標準庫string型別和字串字面值:字串常量是儲存在記憶體的常量區,不可以修改;

2.下標操作: 下標操作可以作為左值,也可以作為右值;有c語言基礎的人很容易習慣用它來給vector<>新增新元素,這其實是不對的!因為下標操作僅可以已經存在的元素賦值!正確的做法應該是使用push_back()來進行元素的新增。

3.對於語句for(vector:: size_type ix=0;ix!=invec.size();ix++),有沒有什麼想法?從我個人的第一反應就是,為什麼中間的判斷是!=invec.size(),而不是

4.關於迭代器iterator型別。我發現我一直不知道迭代器型別,亦如我不知道容器類的存在。這個型別是依附於容器存在的,到現在,我突然有種恍然大悟的感覺,這就是把指標給封裝了啊!所以才會有迭代器的判等操作是intr.begin()!=intr.end();才會有迭代器的自增和解引用。

5.關於bitset類。這個類和vector類似,也是類模板,只不過這個變化的型別是是個數而不是物件的型別。在bitset類中,物件只是0,1這兩個位。它的初始化方法有很多種,可以用unsigned long,可以用string;比如: bitset<32> bitvec3(0xffff);那麼bitvec3顯示的是0000,,,111,,,從低位開始,不夠的用0補齊;而用string型別也是類似,比如乙個string s="1100", bitset<8> bitvec4(s);那麼輸出就應該是00001100。

從這個小**裡面可以可看出,bitset型別是從左向右儲存的,即左邊是高位,右邊是低位;而其他的比如string,vector等則是左邊是反的。其實bitset型別更像是我們寫的數字,越左,位越大。

5.1 第三章裡面介紹了4個標準庫:string,vector,iterator和bitset;他們都可以使用和.size()。其中表示取下標操作,可以作為左值;但是vector通常不使用賦值,而是使用push_back(),

6. c++中強調盡量不使用陣列和指標。在c++中,推薦使用vector和iterator來替換陣列和指標。vector比陣列好在:可以通過size()得到大小,長度可變,可以通過push_back新增元素;此外,iterator把指標封裝了,使用的時候不用擔心越界。來看這樣一段程式:

const int size_t arry_size=5;

int int_arr[arr_sz]=;

//在遍歷陣列的時候可以這麼來:

for(int *pbegin=int_arr, *pend=int_arr+zrry_size; pbegin!=pend; pbegin++) //這樣就可以防止陣列的越界,pend是個哨兵(因為把指標使用的很像迭代器!)

還有,c++裡面的string類也是用來替換c裡面的字元陣列的;使用字元陣列的時候,可以採用兩種初始化方式:和「123」;但是這兩者的長度不一樣,後者等價於.

7.void * 型別只允許以下幾種存在:作為函式的引數或者返回值;與另乙個指標進行比較;絕對不允許使用void* 操縱他所指向的物件!

8.必須初始化的東西:引用和const指標。 這兩個東西都必須有初始化是因為,引用是乙個物件的別名,對引用變數的操作實質上都是對這個變數的操作,因此必須初始化;而const指標是,這個指標不能改變,即一旦初始化之後就不能再改了,只能指向這個物件,因此也必須初始化。

9. c風格的字串(char *)可以使用很多函式 strlen, strcmp, strcpy等,注意他們的使用都是以\0作為結束標誌的,在動態申請的時候注意+1。

10 .動態陣列。 我們常說的陣列是陣列變數,是個變數,他有變數名,儲存在記憶體的棧裡面; 而所謂的動態陣列, 則是存放在堆/自有儲存區(c裡面用 malloc, free; c++裡面用new delete)裡面,沒有名字;

11. 終於看到第五章了,這一章講的是表示式。表示式是指:運算元通過操作符組合而成;每個表示式都有個結果,最簡單的表示式可以是個字面值常量。有些表示式的值是依賴於機器的,比如,除法和取模運算,在有乙個運算元是負數的時候,其運算結果是machine-dependent。

12.位操作,是應用在整形運算元上的低階操作,推薦使用 bitset。

13. 自增操作,有前置和後置之分;前置比後置運算更高效:只需要+1後返回+1的結果即可(修改後的結果直接作為表示式的結果);但是後置則需要先儲存當前的值,然後再加1,因為要返回之前的值。還有自增操作的優先順序高於解引用,所以,如果看到類似於*itr++的操作,就是先自增,再解引用。

13.1 看到了乙個很好玩的題目: 為什麼c++不叫做++c?答案也就是自增操作的優先順序問題。c++說明可以向下相容c,而++c則說明c用不了了。

14. sizeof()操作符是 用來返回乙個物件或者型別名的長度的,返回值的型別是size_t。 size_t是乙個machine-dependent 的unsigned型別,單位是位元組,定義在cstddef標頭檔案中。sizeof 後面可以跟 物件, 型別名, 某種型別的變數以及表示式,但是在計算表示式的時候,並沒有真正計算表示式,只是計算他的返回值的型別。

15. 動態建立物件的初始化問題: 

string *ps=new string; //ps 會自動自動呼叫string類的建構函式,所以ps已經初始化了,不用在string後面寫()

int *pi=new int 和 int *pc=new int() //這兩個不一樣,前者公尺有初始化,只是指向了乙個整數,後面的初始化了,只像乙個值為0的整數

所以說,()只是顯示的說明有初始化這個步驟。  

16.delete操作: 在使用new動態建立指標後,一定要記得釋放,否則記憶體會洩露。但是delete也不是什麼都可以釋放的:只能釋放new出來的指標(或者0指標);一旦被釋放,他就變成了不確定的指標 dangling pointer,雖然仍然指向以前的物件,但是因為以前的物件沒有了,所以就沒有意義,因此他的存在也就很危險,最好是在delete 了以後,將他置為0,這樣就說明他不在指向任何東西了。

17. 關於型別轉換:有隱式轉換(implicit type convertion)和顯示轉換(cast)。個人覺得隱式轉換不用管,而顯式轉換(強制型別轉換)有:dynamic_cast,const_cast(轉換掉表示式的const性質),static_cast(所有的隱式轉換都可以由這個完成,並且不會有警告),使用的時候類似:

double a =97.0;

char c=static_cast(a);//此時,c就變成了'a'

還有個reinerpret_cast,將運算元解釋為另外一種型別 (用於提供運算元為模式的重新解釋)。

在引入這4種操作符之前,c++曾經使用()將強制型別轉換放進去的;但是這樣可視性差,難以跟蹤錯誤。此外,應該盡量避免使用強制轉換,因為他們的使用意味著設計缺陷。

18:函式由函式名和一組運算元(引數)唯一的表示,他就像是內建的操作符一樣,區分他們的時候注意,編譯器對於const形參和非const的形參視為一樣的。

19: 關於引用傳參,他有兩個明顯的作用:

第一是,可以讓函式多返回乙個值

第二是,可以提高效率,這一點主要針對引數物件很大的時候,引用傳參不用複製物件,而是直接操作它;如果僅僅是為了不複製引數,那麼應該將形參定義為const引用。

20:關於const引用。如果,使用引用傳餐的唯一目的是 避免複製實參, 那麼就應該 使用const引用。如果把它弄成普通引用的話,會不能使用右值和const物件。比如字面值常量等。

21:關於容器型別和陣列型別的引數:通常,函式選擇引數不會選擇vector等類似的容器;因為選擇容器作為引數通常意味著要賦值元素,而實際通常選擇迭代器;也不會選擇陣列作為引數,因為陣列不能複製,並且陣列名作為引數傳進去會被自動轉換成指標

22: 如果使用陣列作為引數,並且不想素組越界,有三種常用的方法:

c風格的:就是使用某個特殊符號作為結束符(比如string裡面是\0)

c++風格的(標準類庫,強調封裝性):類似迭代器,將首尾指標封裝起來

顯示定義陣列的長度

23:引數裡面指標和引用有什麼差別呢?當函式需要處理陣列,且函式體不依賴陣列的長度的時候;這樣可以使用任意長度的陣列,而引用,則只能使用長度匹配的陣列才可以,限制了函式的使用,但同時也是安全的。

24:函式指標,這句話啥意思ne :

int  (*ff(int)) (int*, int )

意思是:函式ff(int)的返回值是乙個指向引數為(int*, int),返回值為int 的函式

C 第一部分總結

c 一 一丶復合型別 1指標與引用 一 指標 1 指標的特點 指標持有乙個物件的位址,稱為指標 指向 該物件 通過指標可以間接操縱它指向的物件 2 指標的定義 型如int a char a,b 3 取位址符 使用取位址符 型如int pi ival 4 特殊 void型別 可以持有任何型別的位址值,...

第一部分 C 語言

第一部分 c 語言 330頁 10 33天 第一章 c 與.net框架 一 net框架 cts common type system 公共型別庫 cls common language system 公共語言規範 fcl framework class library 框架型別庫 clr提供程式執行...

Axure RP 第一部分

axure rp是乙個專業的快速原型設計工具。axure 發音 ack sure 代表美國axure公司 rp則是rapid prototyping 快速原型 的縮寫。axure rp是美國axure software solution公司旗艦產品,是乙個專業的快速原型設計工具,讓負責定義需求和規格...