auto
存儲類型:採用棧堆方式分配內存空間,屬於一時性存儲,其存儲空間能夠被若干變量屢次覆蓋使用。register
存儲類型:存放在通用寄存器中externa
存儲類型:所用函數和程序段中均可以引用static
存儲類型:在內存中是以固定地址存放的,在整個程序運行期間都有效。定義時使用關鍵字 inline 的函數叫內聯函數,編譯器在編譯時在調用處用函數體進行替換,節省了參數傳遞,控制轉移等開銷,內聯函數體內不能有循環語句和 switch 語句,內聯函數的定義必須出如今內聯函數第一次調用以前,對內聯函數不能進行異常接口聲明。ios
重載函數的函數名是相同的,但它們的參數的個數和類型不一樣,編譯器根據實參和形參的類型和個數的最佳匹配,自動肯定調用那一個函數。c++
公有類型成員用public
關鍵字聲明,共有類型定義了類的外部接口;私有類型的成員用private
關鍵字聲明,只容許本類的函數成員來訪問,而類外部的任何訪問都是非法的,這樣,私有成員就整個隱蔽在類中,在類的外部根本就沒法被看到,實現了訪問權限的有效控制。
數據成員和成員函數均可覺得公有的或私有的,但數據成員最好是聲明爲私有的。算法
protected
用來聲明保護類型的成員,保護類型的性質和私有類型的性質類似,其差異在於繼承和派生時派生類的成員函數能夠訪問基類的保護成員。數組
構造函數的做用就是在對象被建立時利用特定的值構造對象,講對象初始化一個特定的狀態,使此對象具備區別於彼對象的特徵,完成的就是一個從通常到具體的過程,構造函數在對象建立的時候由系統自動調用。
析構函數與構造函數的做用幾乎正好相反,它是用來完成對象被撤出前的一些清理工做,通常狀況下,析構函數是在對象的生存週期即將結束的時刻由系統自動調用,它的調用完成以後,對象也就消失了,相應的內存空間也被釋放。安全
拷貝構造函數是一種特殊的構造函數,其形參是本類的對象的引用,其做用是使用一個已經存在的對象,去初始化一個新的同類的對象。在如下三種狀況下會被調用:
當用類的一個對象去初始化該類的另外一個對象時;
若是函數的形參是類對象,調用函數進行形參和實參結合時;
若是函數的返回值是類對象,函數調用完成返回時。閉包
普通數據成員屬於類的一個具體的對象,只有對象被建立了,普通數據成員纔會被分配內存。而靜態數據成員屬於整個類,即便沒有任何對象建立,類的靜態數據成員變量也存在。由於類的靜態數據成員的存在不依賴與於任何類對象的存在,類的靜態數據成員應該在代碼中被顯示的初始化,必定要在類外進行。外部訪問類的靜態成員只能經過類名來訪問。類的靜態成員函數沒法直接訪問普通數據成員(能夠經過對象名間接的訪問),而類的任何成員函數均可以訪問類的靜態數據成員。靜態成員和類的普通成員同樣,也具備public、protected、private
三種訪問級別,也能夠具備返回值、const
修飾符等參數。函數
靜態成員函數的地址可用普通函數指針儲存,而普通成員函數地址須要用 類成員函數指針來儲存。靜態成員函數不能夠調用類的非靜態成員。由於靜態成員函數不含this指針
。靜態成員函數不能夠同時聲明爲 virtual、const、volatile
函數。this
友元是不一樣的類之間、類與類外的函數之間的共享數據的機制。使用friend關鍵字聲明,友元函數能夠訪問相應類的保護成員和私有成員。友元類它的全部成員函數都是相應類的友元函數。友元關係不具備交換性、傳遞性,也不能被繼承。設計
*
稱爲指針運算符,是一個一元運算符,表示指針所指向的對象的值;&
稱爲取地址運算符,也是一個一元操做符,是用來獲得一個對象的地址。
我的認爲它們是一對做用相反的運算符。指針
引用是給另一個變量起別名,因此引用不會分配內存空間。聲明方法:(類型標識符 &引用名=目標變量名;(如int &r = num;)
)。指針是一個存放地址的變量,須要分配內存空間,聲明方法:(類型標識符 *指針名 = 目標變量地址(int * p = &a;)
)。對於聲明後的指針,p指向的是變量a的地址,*p 表示的是變量a的內容。在C++中使用引用代替指針能夠提升程序的安全性,但當須要對變量從新賦值以另外的地址或賦值爲NULL時只能使用指針。
const int * p1
聲明瞭一個指向整型常量的指針p1,所以不能經過指針p1來改變它所指向的整型值;int * const p2
聲明瞭一個指針型常量,用於存放整型變量的地址,這個指針一旦初始化後,就不能被從新賦值。
(理解方法:主要是參考const
修飾的誰)。
空指針:通常聲明一個指針變量賦值爲NULL,這就是空指針,各個類型的空指針都存在確確實實的內存地址,可是不會指向任何有效的值的內存地址,對空指針操做,例如訪問屬性和方法,會拋出空指針異常,由於空指針指向的內存地址沒有對應的物理地址。
野指針:指那些釋放內存,可是指針賦值爲空,這時候的指針指向任意地址,好可怕,例如指向內核地址或不屬於本程序的內存地址,程序會被kill,即奔潰。
內存泄漏:分爲堆泄露和資源泄露 兩種,內存分配失敗或者內存分配成功卻沒有指針指向它(即沒法操做該內存),會致使內存分配的愈來愈多,致使系統內存不夠而終止程序。
用malloc
或者 new
申請內存以後,應該當即檢查指針值是否爲 NULL ,防止使用指針值爲NULL的內存;
不要忘記數組和動態內存賦初值,防止未被初始化的內存做爲右值使用;
避免數組或者指針下標越界,特別要小心「多1」或者「少1」的操做;
動態內存的申請與釋放必須配對,防止內存泄露;
用free
或者delete
釋放了內存以後,當即將指針設置爲NULL,防止產生「野指針」;
首先要明確從基類繼承的成員的訪問控制屬性受兩方面因數的影響(一、成員在基類中原來聲明的訪問控制屬性;二、繼承方式)。在運用常常關係時,要注意基類的構造函數和析構函數都不能繼承,可是在創建派生類對象時基類的構造函數會被自動調用,派生類消亡時,會自動調用基類的析構函數。在多繼承的狀況下,若是存在公共基類,就會出現成員標識二義性的問題,這是將公共基類做爲虛基類繼承是一個比較好的解決方案(虛基類繼承的語法格式:class 派生類名:virtual 繼承方式 基類名
)。
多態是指一樣的消息被不一樣類型的對象接收時致使徹底不一樣的行爲,是對類的特定成員函數的再抽象。C++支持的多態有多種類型,重載(包括函數重載和運算符重載)和虛函數是其中主要的方式。
帶有純虛函數的類是抽象類,抽象類的主要做用是經過它爲一個類族創建一個公共的接口,使它們可以有效的發揮多態特性。抽象類聲明瞭一組派生類共同操做接口的通用語義,而接口的完整實現,即純虛函數的函數體,要由派生類本身給出。但抽象類的派生類並不是必定要給出純虛函數的實現,若是派生類沒有給出純虛函數的實現,這個派生累仍然是一個抽象類。
在C++中,不能聲明虛構造函數,多態是不一樣的對象對同一消息有不一樣的行爲特性,虛函數做爲運行過程當中多態的基礎,主要針對對象的,而構造函數是在對象產生以前運行的,所以虛構造函數是沒有意義的。能夠虛析構函數,析構函數的功能是在該類對象消亡以前進行一些必要的清理工做,若是一個類的析構函數是虛函數,那麼由它派生而來的全部子類的析構函數也是虛函數,析構函數設置爲虛函數以後,在使用指針引用時能夠動態連編,實現運行時的多態,保證使用基類的指針就可以調用適當的析構函數針對不一樣的對象進行清理工做。
STL的容器庫包括7種基本容器:向量(vector)、雙向隊列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。這7種容器能夠分爲兩種基本類型:順序容器好關聯容器。
STL根據迭代器的功能,將它們分爲5類:輸入迭代器、輸出迭代器、前向迭代器、雙向迭代器、隨機訪問迭代器。
STL標準模板庫中的算法大體分爲4類:非可變序列的算法(不會改變容器的內容)、可變序列的算法、排序相關的算法、通用數值算法。
I/O 流類庫是一個提供輸入/輸出功能的、面向對象的類庫。
流是對輸入/輸出的一個抽象表述、程序經過從流中提取字符和向流中插入字符來實現輸入輸出。通常來講、流是與實際字符源或目標相關的,例如磁盤文件、鍵盤或顯示器,因此對流進行的提取或插入操做實際上就是對物理設備的操做。
標準輸入/輸出流對象時鏈接程序與標準輸入/輸出設備的,經常使用的標準輸入流有cin
,標準輸出流有:cout、cerr、clog
。標準流對象都是在<iostream>
中預先聲明好的。
當一個函數在執行的過程當中出現了一些不日常的狀況,或運行結果沒法定義的狀況,使得操做不得不被中斷時,這就是所謂的異常。異常一般是用throw關鍵字產生的一個對象,用來代表出現了一些意外的狀況。C++的異常處理機制有不少優勢,可使的異常的引起和處理沒必要在一個函數中,這樣底層的函數能夠着重解決具體問題,而沒必要過多的考慮異常的處理。上層調用者能夠在適當的位置設計對不一樣類型異常的處理。C++提供了三個關鍵字來對異常進行處理:
try
:可能拋出異常的程序段必須以try開。緊跟着try的是一段包含在大括號中的程序,這段程序有可能拋出異常。
throw
:異常要經過關鍵字throw來拋出。異常對象的類型決定那一個catch語句能夠捕獲這一異常。
catch
:處理異常的程序必須以catch開始。跟隨在catch後面的是一段包含在大括號中的程序。
#define
是C語言提供的宏定義命令,其主要目的是使程序編寫規範,修改調試容易,並在必定程度上提升程序的運行效率。使用#define
命令將一個標識符定義爲一個字符串,該標識符被稱爲宏名,被定義的字符串稱爲替換文本。該命令有兩種格式:一種是簡單的宏定義,另外一種是帶參數的宏定義。
C++中lambda函數是做爲C++11新特新添加到C++中的,其主要是以匿名函數捕獲scope內變量的方式構造閉包(closure)。相關標準參考:c++ reference