C++與C的區別
1. 動態分配內存
1)C語言
a. malloc函數:在內存的動態存儲區中分配一個長度為size的連續空間; void *malloc(unsigned int size);
b. calloc函數:在內存的動態存儲區中分配n個長度為size的連續空間; void *calloc(unsigned n, unsigned size);
c. free函數:釋放由p所指向的內存區 void free(void *p);
d. void指針類型:在將它的值賦給另一指針變量時要進行要進行強制類型轉換使之適合於被賦值的變量的類型
e. realloc函數
2)C++
a. new:只需指定其數據類型; 與在函數內定義的變量的初始化方式相同 動態創建對象:int *pi=new int; 動態創建數組:int *pia=new int[10];
b. delete:對於動態創建的對象或數組,必須要顯示釋放; 釋放對象:delete pi; 釋放數組:delete [] pia;
c. 在delete之後,重設指針的值; delete命令釋放了指針所指向對象所占用的內存空間; 在刪除指針後,該指針變成懸垂指針; 一旦刪除了指針所指向的對象,立即將指針置為0;
d. 用new創建多維數組
1)new 類型名T[下標表達式1][下標表達式2]……;
2)如果內存申請成功,new運算返回一個指向新分配內存的首地址的指針,但不是T類型指針,而是一個指向T類型數組的指針,數組 元素的個數為除最左邊一維外各維下標表達式的乘積。
2. 輸入與輸出
1)C語言: printf, scanf <stdio.h>
2)C++:cin,cout <iostream>
3. 重載:C++中允許對於符號和函數的重載;
1)重載函數:相同作用域內形參個數或類型不同的函數 ;
a. 重載確定的三個步驟:候選函數;選擇可行函數;尋找最佳匹配;
b. 僅當形參是引用或指針時,形參是否為const才有影響;
const引用或指針只能傳給const對象;
非const引用或指針可以傳給非const對象,也可以通過類型轉換後傳給const對象;
2)重載操作符:具有特殊名稱的函數:保留字operator後接所需要定義的操作符符號;
a. 不能通過連接其他合法符號來創建任何新的操作符;
b. 重載操作符必須具有至少一個類類型或枚舉類型的操作數;
c. 優先級和結合性是固定的;
d. 不再具備短路求值特性,尤其是對邏輯操作&&,||
4. 引用&:一種復合類型(復合類型是指用其他類型定義的類型);
a. 非const引用必須用與該引用同類型的對象初始化,定義後不能再指向其他對象。
b. "const引用"是指向const對象的引用,可以初始化為不同但相關的類型的對象或者初始化為右值,如字面值常量,定義後不能再指向其他對象。
5. inline函數:編譯時,將定義為內聯函數的函數在程序中每個調用點上“內聯的”展開;
a. 內聯函數應在在頭文件中定義;
b. 與宏替換的區別:宏替換:編譯前由預處理程序進行處理,只作簡單的字符替換而不做語法檢查;
內聯函數:在編譯時處理,進行語法檢查;
6. 作用域操作符與命名空間:一個命名空間是一個作用域;
a. 命名空間的定義:可以在全局作用域或其他作用域內部定義,但不能在函數或類的內部定義;
namespace cplusplus_primer{};
b. 全局命名空間:定義在全局作用域的名字是定義在全局命名空間中的;
c. 未命名的命名空間:定義局部於特定文件,從不跨越多個文本文件;
未命名的命名空間用於聲明局部於文件的實體;
在C語言中,程序必須將名字聲明為static使之局部於一個文件;
d. 從命名空間外部使用命名空間成員:作用域操作符::
1).簡化方法:using 聲明;using std::cin;
2).命名空間別名:namespace primer=cplusplus_primer;
using指示: using namespace std; (要避免這種用法)
7. 變量定義位置:
1)C語言:要求變量定義在程序的開始;
2)C++:要求在需要用到變量的時候再去定義;
8. 帶缺省值的函數:C++支持給函數定義一些默認值
9. 類與對象:C中的結構體類型就相當於C++中的類,結構體相當於C++中的對象
10. 繼承與派生:C++與C最大的區別
11. 多態性:在一般類中定義的屬性和行為,被特殊類繼承之後,可以具有不同的數據類型或表現出不同的行為;
1)面向對象編程所依賴的多態性稱為運行時多態性:應用於存在繼承關系的類;
2)泛型編程所依賴的多態性稱為編譯時多態性或參數式多態性:將程序所處理的對象的類型參數化,使一段程序可以用於處理多種不同類型的對象;
12. 面向過程和面向對象;
1)C語言:面向過程,
2)C++:面向對象;
13. 模板與泛型編程:
1)泛型編程:以獨立於任何特定類型的方式編寫代碼;使用泛型編程時,我們需要提供具體程序實例所操縱的類型或值;
2)函數模板:typedef <typename 標識符> 函數定義
3)類模板: