《C++ Primer》讀書筆記

      拿起《C++ Primer》打算重溫下C++,感覺自己大二時學的c++基礎還是可以,但那些基礎只是c++的皮毛,一直感覺沒有領悟到c++的精髓。下面會邊讀邊記錄我覺得要特別注意或者是我已經不太熟悉的知識點,寫讀書筆記主要是爲了讓自己感覺到一本書沒有白讀,也爲了以後的溫習。

第1章 開始

1.讀取數量不定的輸入數據:while(cin>>value)。

2.編譯器無法檢查邏輯錯誤,可以發現語法錯誤,類型賦值錯誤,未聲明錯誤等。

第一部分    C++基礎

第2章 變量和基本類型

1. 算數類型:(至少) char:1個字節; short:2個字節; int:2個字節;long:4個字節;long long:8個字節;float:6位有效數字;double:10位有效數字; 1個字=4個字節。

2.類型轉換:unsigned char c = -1  //假設char佔8位(0-255),c的值是255; signed char c2=256  //假設char佔8位,c2的值是未定義的。總結:(1)賦給無符號類型一個超出它表示範圍的值時(如負數),結果是所賦的值對該無符號類型表示數值總數(256個)取模後的餘數,賦給帶符號類型一個超出它表示範圍的值時,結果是未定義的;(2)給無符號數加上一個負數,結果是先將負數按照(1)的方法轉化成無符號數再相加; (3) for(unsigned u=10 ; u>=0 ; --u){} 這是一個死循環。

3.轉義序列:如果反斜線\後面跟着的八進制數字超過3個,只有前3個與\構成轉義序列,例如“\1234”表示2個字符(‘\123’和‘4’),相反\x要用到後面跟着的所有十進制數。

4.默認初始化:如果內置類型(例如int ,double等)的變量未被顯示初始化,值由定義的位置決定:定義在任何函數體之外初始化爲0,函數體之內則不被初始化;對於類對象而言,是否默認初始化取決於類定義,例如string類規定未顯示初始化則聲稱空串。

5.聲明和定義:extern int i ; //extern關鍵字表示聲明而非定義i(定義會分配內存病給初值);int j ; //聲明並定義j。

6.引用:int ival=0 ; int &refVal=ival ;//引用必須被初始化,以後改變refVal也會改變ival的值,但引用本身不是對象。int &refVal2=refVal ; //refVal本身不是對象不能創建引用的引用,故refVal2仍是ival的引用。另外,引用的初始值只能是對象(不能是字面量),下面是錯誤的寫法:int &refVal3=0 ; //錯誤。

7.指針:int ival = 0 ; int *p = &ival ; //指針指向的是對象的地址,故要用取地址符&,另外因爲引用不是對象,沒有地址,故不能創建引用的指針。若要訪問指針p的值,要用“*”號解引用符:例如cout<<*p;指針與引用不同點:(1)指針本身是對象,允許對指針賦值和拷貝,且可以先後指向不同對象;(2)指針無須在定義時賦值。

8.符號:&緊隨類型名出現:int &refVal=ival表示聲明引用;&出現在表達式中:p=&i 表示取地址符;                                                        *號緊隨類型名出現:int *p表示聲明指針;*號出現在表達式中:*p=i表示解引用符。 在int &r = *p中,&是聲明引用,*  號是解引用符。

9.指針的定義:int* p1,p2; *號只用來修飾與它緊挨着的變量名,故p1是int指針,p2是int變量;另外int* p1和int *p1是一樣的意思,只是寫法的不一樣而已,數據類型是int而非int*, *號只用來修飾後面的p1。

10.const與指針:1.(底層const)想要存放常量對象的地址,只能使用指向常量的指針:const int *p=&i; // 其中 i 是const變量,p不能用來改變 i 的值,例如不能 *p=100,但可以改變p本身的值(即地址),例如可以p=&j;      2.(頂層const)const指針:int *const p=&i; //其中i是非const變量,指針本身是常量,而非指向的值,不變的應該是指針本身(即地址)。

11.類型別名typedef: typedef double d,dou; //double是被取別名的類型,d和dou都是爲double取的別名。

12.預處理器之頭文件保護符:#define指令把一個名字設定爲預處理變量,#ifdef當且僅當變量已經定義時爲真,#ifndef當且僅當變量未被定義時爲真,一旦檢查爲真,則會順序運行直至遇到$endif,一旦檢查爲假,則會忽略#endif之前的所有內容,例如Sales_data.h內容如下:      #ifndef SALES_DATA_H                                                                                                                                                                  #define SALES_DATA_H                                                                                                                                                                  #include <string>                                                                                                                                                                              struct Sales_data{....};                                                                                                                                                                      #endif                                                                                                                                                   第一次包含Sales_data.h時,#ifndef檢查爲真,隨後定義預處理變量SALES_DATA_H,順序執行直到#endif,後面如果再一次重複包含Sales_data.h時,SALES_DATA_H已經被定義,#ifndef檢查爲假,故#ifndef到#endif之間的語句都會被忽略。

第3章 字符串、向量和數組

1.vector對象(以及string)的下標運算符只能用來訪問已經存在的元素,不能用來添加元素。

2.迭代器:begin()表示容器的第一個元素,end()表示尾元素的下一個位置,end()實際上只是一個標記,叫做尾後迭代器 ;            一般用法:for(auto it = s.begin() ; it!=s.end() ; i++){}。如果容器爲空,則begin()和end()返回的是同一個迭代器,都是尾後迭代器 ;迭代器的運算符:*iter(返回迭代器iter所指元素的值,跟指針用法一樣,且iter->mem和(*iter).mem是一樣的意思),item->mem(解引用iter並獲取鈣元素的名爲mem的成員),--iter,++iter,iter1==iter2。

3.迭代器的泛型思想:for循環中使用!=而非<進行判斷,因爲所有標準庫容器都定氮儀了==和!=,但是大多數都沒有定義<,因此只要我們養成使用迭代器和!=的習慣,就不用太在意用的是哪種容器。

4.string和vector是兩種最重要的標準庫類型,string是一個可變長的字符序列,vector對象是一組同類型對象的容器

5.緩衝區溢出指一種嚴重的程序故障,主要原因是試圖通過一個越界的索引訪問容器內容。

6.類模板:用來創建具體類模型的模板

第4章 表達式

第五章 語句

1.try語句塊和異常處理:異常檢測部分-throw :  throw+異常類型;例如throw runtime_error("input is error!");//runtime_error是標準庫異常類型中的一種,括號裏是對它的初始化。try{} catch(runtime_error err){} //try後面可以跟多個catch語句,根據括號裏的異常聲明類型來匹配執行不同的catch語句

2.常用異常類:exception(最常見的問題),runtime_error(只有在運行時才能檢測出的問題),range(運行時錯誤:結果超出值域範圍),overflow_error(運行時錯誤:計算上溢),underflow_error(運行時錯誤:計算下溢),logic_error(程序邏輯錯誤),invalid_argument(無效參數)

3.異常安全指:拋出異常後,程序能執行正確的行爲。

第六章 函數

1.分離式編譯:fact函數被定義在 fact.cc中, factMain.cc中創建main函數,main調用fact函數

                           $ CC factMain.cc fact.cc  //生成 factMain.exe或a.out

                           $CC factMain.cc fact.cc -o main   //生成main或main.exe

2.函數重載:同一作用於內,函數名字相同但形參列表不同

3.一個形參被賦予了默認值,那它後面的所有形參都必須有默認值;當一個函數有多個帶有默認值的形參,但調用時有的形參想用默認值,而有的不想用默認值時,只能省略尾部的實參,尾部的使用默認值。

 

 

 

 

 

 

 

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