C++知識點回顧

C++知識點回顧

第二章 基本內置類型
  類型轉換 無符號類型的表達式
  無符號數減去一個數要保證不能是負數。
 定義在函數體內部的內置類型將不被初始化
 聲明一個變量而不是定義一個變量可以在變量名前面加上extern。
嵌套的作用域,使用 :: 來顯示的說明全局變量。

//顯示說明使用全局變量reused
cout<<::reused<<endl;

複合類型
 引用:對象的另外一個名字,引用本身不是一個對象,所以不能定義引用的引用。
 指針:指向另外一個種類型的符合類型。
void* 指針:可以存放任意對象的地址。

定義多一個變量:

int *p1,p2;	//p1是指向int的指針,p2是int

指向指針的引用:(從右向左閱讀r的定義)

int i = 4;
int *p;
int *&r = p;	//r是一個對指針p的引用

頂層const:表示指針本身是個變量
底層const:指針所指對象是一個變量
類型別名:

typedef double wages;	//wages是double的同義詞
// 新標準可以使用新的方法,別名聲明
using SI = Sales_item;	//SI是Sales_item的同義詞

decltype類型說明符
可以分析一個表達式,並得到其類型。
例外:

int i = 42,*p = &i, &r = i;
decltype(r+0) b; 	//b是一個int
decltype(*p) c;		//錯誤,c是一個int&,必須初始化

decltype((i)) d;		//錯誤,d是一個int&,必須初始化

如果表達式的內容是解引用操作,將得到引用類型。
decltype((variable))得到的結果永遠是引用。
C++11新規定,可以爲數據成員提供類內初始值。

第三章 字符串向量和數組
頭文件一般不使用using聲明。
getline讀取一整行,直到遇到換行符,換行符也被讀進來。
字符串字面量和string是不同的類型。

string s1 = "hello";
string s4 = s1 + ", ";		//正確
string cc = "23" + "234" + s;;	//錯誤,不能把字面量直接相加

處理string中的字符

isalnum(c)	c爲數字或者字母時爲真
ispunct(c) 	c爲標點符號時爲真
isspace(c)	c爲空白時爲爲真

tolower(c) 	輸出c對應小寫
toupper(c)	輸出c對應大寫

迭代器運算:
vector和string的迭代器可以直接接一個數

iter + n
iter - n

數組:
 其維度必須是一個常量表達式。
 數組不允許拷貝和賦值。
 對於複雜的數組聲明:
 由內向外閱讀要比從右向左好。

int *ptrs[10];
int (*Parray)[10] = &arr;	//Parray指向一個包含10的整數的數組

指針與下標:

int ia = {2,3,4,5,7};
int *p = &ia[2];	//p指向ia中索引爲2的元素
int j = p[1];	//j等於ia中索引爲3的元素
int k = p[-2];		//k等於ia中索引爲0的元素

第四章 表達式
左值和右值:
 當一個對象被用作右值的時候,用的是對象的值;當一個對象被用作左值的時候,用的是對象的身份(內存中的位置)。
 命名的強制類型轉換:
 static_cast, dynamic_cast, const_cast 和 reinterpret_cast

第六章 函數
  形參可能的情況下,進行使用常量引用,這樣擴大了接收實參的範圍
數組形參
  當爲函數傳遞一個數組時,實際上傳遞的是指向數組首元素的指針。所以函數並不知道傳遞過來的數組的大小是多少。
  因爲數組不能被拷貝,所以函數不能返回數組。但是可以返回數組的指針和引用。
  函數重載同一個作用域中,幾個函數有相同的名字,但形參列表不同
調試幫助:
預處理變量

__func__	存放函數的名字
__FILE__	存放文件名的字符串字面值
__LINE__	存放當前行號的整形字面值
__TIME__	存放文件編譯時間的字符串字面值
__DATE__	存放文件編譯日期的字符串字面值

第七章
  class關鍵字與struct關鍵字的區別:唯一區別是默認訪問權限不同。
  類允許其他類或者函數訪問它的非公有成員,方法是令其他類或者函數成爲它的友元。
  一個類指定了友元類,那麼友元類的成員函數可以訪問此類包括非公有成員在內的所有成員。友元關係不存在傳遞性。
  內聯函數,最好只在類的外部定義的地方說明inline,可以使得類更容易理解。
  使用mutable關鍵字聲明的變量,在const函數內也可以修改某個數據成員。
  構造函數成員初始化順序:按在類中出現順序初始化。如果成員時const或者引用的話,必須將其初始化。
  如果構造函數只接受一個實參,則實際上定義了轉換此類類型的隱式類型轉換機制。但是可以使用explicit關鍵字來抑制隱式轉換。
  指針成員可以是不完全類型,靜態成員可以是不完全類型。

第八章 IO庫
 iostream 處理控制檯io
 fstream 處理命名文件IO
 stringstream完成內存string的IO

第九章 順序容器
順序容器包括:

vector			可變大小數組,內存連續
deque			雙端隊列,內存看上去連續
list			雙向鏈表,內存不連續
forward_list	單向鏈表
array			固定大小數組
string			與vector相似,專門用來保存字符

forward_list中插入和參數元素與其他順序容器不同,因爲刪除的是有元素沒有指向其前驅的指針,所以添加刪除的時候,必須關注兩個迭代器,一個指向要處理的元素,一個指向其前驅。
容器操作可能使迭代器失效
添加元素:

  • 如果容器是vector或者string,且存儲空間重新分配,則指向容器的迭代器、指針和引用都會失效。若沒有重新分配,插入位置前的迭代器不會失效,但插入位置之後的迭代器、指針和引用都會失效。
  • 對於deque插入到收尾位置之後的任何位置都會導致迭代器、指針和引用失效。首位位置添加元素,迭代器會失效,但是指向存在的元素的指針和引用不會失效。
  • 對於list和forward_list,指向容器的迭代器、指針和引用任然有效。
    刪除元素:
  • list和forward_list指向容器其他位置的迭代器引用和指針任然有效
  • 對於deque刪除首尾元素,其他迭代器、引用和指針不會失效。刪除其他位置的元素,都失效。
  • vector和string,刪除元素後,位置之後的迭代器、引用和指針都失效,之前的仍然有效。
    可以在while循環中,使用end每一次都計算尾後迭代器判斷是否到達了最後。
    string 的其他操作:可以參考 標準C++string類用法總結

三個順序容器適配器:stack、queue、priority_queqe

第十章 泛型容器算法
 標準庫算法對迭代器而不是容器進行操作,因此,不能(直接)添加或刪除元素。
lambda表達式

[capture list](parameter list) -> return type { function body }

[=] 隱式捕獲列表,採用值捕獲方式
[&] 隱式捕獲列表,採用引用捕獲方式
當doby只有一條return語句時,可以推斷出返回類型。
bind函數,可以看成一個通用的函數適配器
額外的幾種迭代器:
插入迭代器
流迭代器
方向迭代器
移動迭代器

對於list和forward_list應該優先使用成員函數版本算法,而不是通用版本算法。
例如:reverse(), remove(),merge(),sort(),unique()
鏈表特有版本與通用版本間最大的區別是鏈表版本不會改變底層的容器。

第十一章 關聯容器
 有序關聯容器:(底層使用紅黑樹實現)
map
set
multimap
multiset
 無序集合:(底層使用哈希表實現)
unordered_map
unordered_set
unordered_multimap
unordered_multiset
在multimap或multiset中查找元素可以使用lower_bound和upper_bound

第十二章 動態內存
智能指針:
shared_ptr
unique_ptr(早期的auto_ptr具有unique_ptr的部分特性,但不是全部,不能在容器中保存auto_ptr,也不能從函數返回auto_ptr)
weak_ptr 不控制指向對象生存期的智能指針,無法直接訪問對象,要調用lock,返回一個指向共享對象的shared_ptr
unique_ptr直接支持對動態數組的管理,shared_ptr不支持管理動態數組,如果希望使用shared_ptr管理一個動態數組,必須提供自己定義的刪除器shared_ptr未定義下標運算符。而且智能指針不支持指針算數運算。

第十三章 拷貝控制
 拷貝構造函數
 拷貝賦值函數
 移動構造函數
 移動賦值函數
 析構函數:函數體自身並不直接銷燬成員,成員是在析構函數體之後隱含的析構階段中被銷燬的。
 使用 =default 可以顯示的要求編譯器生成合成版本。
 使用 =delete 定義刪除函數,指出我們希望將它們定義爲刪除的。
 析構函數不能是刪除的成員。
 如果一個類有數據成員不能默認構造、拷貝、複製或銷燬,則對應的成員函數將被定義爲刪除的。
 具有引用成員或默認構造的const成員的類,編譯器不會爲其合成默認構造函數。有引用成員的類,合成拷貝賦值運算符被定義爲刪除的。

右值引用,必須綁定到右值的引用,通過&&獲得右值引用。
 可以將一個const的引用綁定到一個右值上。
 變量表達式都是左值。
 move標準庫函數可以獲得綁定到左值上的右值引用。

第十四章 重載運輸符與類型轉換
有些運算符必須作爲成員

  • 賦值,下標,調用和成員訪問箭頭運算符必須是成員
  • 符合賦值運算符應該是成員
  • 改變對象狀態的運算符與給定類型密切相關的算符應該是成員
  • 具有對稱性的運算符可能轉換任意一端的運算對象,通常應該是普通的非成員函數(提高適用性)

區分前置和後置遞增遞減運算符,用一個int形參來區分。

class str{
public:
str& operator++(); //前置運輸符
str& operator--();	//前置運輸符

str& operator++(int); //後置運算符
str& operator--(int);	//後置運算符
}

定義了調用運算符,該類的對象稱作函數對象。
標準庫定義的函數對象:
例如

plus<type>		greater<Type>
minus<type>		less<Type>

標準庫function類型

第十五章 面向對象程序設計
 繼承 封裝 多態
 c++的多態,通過虛函數機制,實現了多態
 使用override說明符,可以防止不小心出錯。
 函數定義爲final後,不允許後續覆蓋此函數。
 可以使用作用域運算符來回避虛函數機制。
 可以使用using聲明改變派生類繼承的某個名字的訪問級別。
名字的查找先於類型檢查。
 靜態類型決定了該對象哪些成員可見。
 一條基類成員函數的using聲明語句就可以把函數的所有重載實例添加到派生類作用域中。

第十六章 模板與泛型編程
 函數模板
 類模板
 普通類的成員模板
 類模板的成員模板
 使用尾置返回類型聲明返回類型。
 引用摺疊
 可變參數模板
 一個特例化版本本質是一個實例,而非函數名的一個重載版本

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