c++由c語言衍生而來,最大的特色就是它是一門面向對象的語言,面向過程(c)即須要咱們去按照步驟去一步一步寫代碼,而c++提供的面向對象機制幫助咱們更有效更方便的開發。
1.關鍵字:根據版本的不一樣關鍵字的個數有所不一樣,c中有咱們熟悉的32個關鍵字,而在c++98這個版本中有63個關鍵字,不少都是和c中關鍵字相似,之後遇到會細說
2.命名空間
概念:使用namespace關鍵字對標識符的名字本地化,以免命名衝突或名字污染c++
命中空間的定義方式:namespace N1,命名空間是能夠嵌套且能夠有相同名稱的命名空間出現,編譯器在編譯時會將其合併爲一個命名空間,而在命名空間中定義的變量做用域只限於這個命名空間。數組
命名空間的三種使用方式:N1::a、using N1::b、using namespace N1;
3.缺省參數:缺省參數就是在定義或聲明函數時爲函數的參數指定一個默認值,若沒有傳遞實參則用默認值。
分類:全缺省參數(每一個參數都有默認值),半缺省參數安全
- 注意:在半缺省參數定義時必須從右向左賦值,這種狀況下傳遞的實參優先匹配最左邊的缺省參數。
- 缺省參數不能在函數定義和聲明中同時定義,最好在聲明。
4.重載函數:在同一做用域中定義幾個功能相似的函數,其參數列表(參數個數,參數類型,參數順序)必須不一樣才能構成重載函數。
在這裏就要說一下爲何在c++中能夠構成函數重載而在c語言中不行了,c中編譯器對函數的命名是在函數名前加,c++根據編譯器的不一樣有不一樣的命名規則,但相同點是都對函數的參數列表在命名時進行了修飾,固然,在c++工程中也能夠根據本身的需求加入「extern」關鍵字讓編譯器看成c風格來編譯,如:
#### extern "C" int Add(int x,int y);
這裏編譯器就按照C的風格進行編譯了。
5.引用(&):引用不是新定義了一個變量而是給以有的變量起了一個別名,與所引用的變量公用一塊內存空間。
引用做爲函數參數和函數的返回值
- 做爲函數返回值時,離開函數做用域後,其棧上空間已經還給系統,所以不能用棧上的空間做爲引用類型返回。若是以引用類型返回,返回值的生命週期必須不受函數的限制(即比函數生命週期長)。
- 引用作參數效率比傳值傳參效率高,由於沒有空間的開闢,但引用在底層上的實現與指針相同,即傳址和引用的效率差很少,但引用比指針用起來更加安全。
- 傳引用時若不想修改實參則用const修飾的引用
- const int &&a=10;不是多級引用,叫作右值引用。
6.內聯函數:以inline修飾的函數叫作內聯函數,編譯時C++編譯器會在調用內聯函數的地方展開,沒有函數壓棧的開銷,內聯函數提高程序運行的效率。
那麼內聯函數和宏函數在功能上時相似的,那爲何還要引入內聯函數呢?在c中使用宏函數時須要對全部變量帶上括號,否則表達式所求結果可能會會與預期有所不一樣,這樣就增長了代碼的風險性,其二宏是在預處理是進行替換,很不方便調試,沒有類型檢測的過程,而內聯函數則在編譯時進行替換,因此相對宏函數更加安全。
- 在c++中用const定義的常量替換宏,用內聯函數替換宏函數。
- 內聯函數是用空間換時間的作法,因此當代碼很長或有遞歸時不建議使用內聯函數,inline關鍵字對於編譯器也只是一個建議,當不適合做爲內聯函數時編譯器就會忽略內聯。
- inline不建議分開定義和聲明,內聯函數時具備文件做用域的。
7.auto關鍵字(c++11)
auto修飾的關鍵字編譯器會自動推倒其類型。
- auto在一行定義多個變量時類型必須相同。
- auto不能做爲函數的參數也不能夠定義數組
auto的第二個用法:基於範圍的for循環 int arr[]={1,2,3,4,5};
for(auto & e : arr)
e*=2;