C與C++的不同點
首先聲明一下我這裡的不同點不是那些C有C++沒有或者C++有而C沒有的,而是一些都有的内容的不同的存在意義
1.記憶體管理
new/delete 是C++中具備申請釋放記憶體功能的運算符,功能相當于C中的malloc和free。
new類型:會自動計算類型所需要位元組數,然後從堆配置設定對應位元組數的記憶體,并傳回記憶體的首位址(具備類型)。
delete類型:delete 指針:會自動釋放堆記憶體
注意:new/delete 和malloc/free不能混用,因為在new和delete會自動調用類、結構的構造函數和析構函數,但其實new和delete的底層還是調用了malloc和free。
下面用一張表格來總結一下:
特征 | new/delete | malloc/free |
本質 | 運算符 | 标準庫函數 |
參數 | 類型 | 位元組數 |
構成調用 | 自動調用 | 不調用 |
配置設定記憶體大小 | 自動計算 | 手動計算 |
傳回值 | 完成類型指針 | void*類型指針 |
配置設定記憶體失敗 | 抛出異常 | NULL |
2.static關鍵字
C語言中static 關鍵字
- 修飾函數名時,稱為靜态函數,隻允許該檔案在源檔案中調用,不能被其他檔案所調用
- 修飾局部變量時,稱為靜态局部變量,該變量隻能在局部函數内,但出了作用域也不會釋放。
- 修飾全局變量時,稱為靜态全局變量,該變量隻能在該檔案中調用,出了該檔案不能被調用
簡單的來說static的作用在C語言中可以分為隐藏和增加變量的内容的持久性
C++中static關鍵字
保留了C檔案的功能,增加了一些C++的獨有功能,可以修飾類的成員變量和成員函數,形成靜态成員和靜态成員函數。
3.const關鍵字
首先C/C++中const都是一種修飾符,表示具有隻讀屬性,一旦我們嘗試去修改這些被修飾的變量或者代碼時,編譯器就會給我們報錯,是以可以用來給我進行報錯。
C語言中const的使用一些規則:
- 被const修飾的變量可以初始化,也可以不初始化
- 被修飾的量不能被當做常量來使用,而是一種常變量,簡單來說還是一種變量隻是帶了常屬性,不能真的當做一個比如數組的長度來了解
- 被const修飾的變量不能用于左值,就是不能被修改,因為是具有隻讀屬性
- 常變量的編譯模式和普通變量時一樣的
C++語言中const的一些使用:
- 被const修飾的一定要初始化
- 被const修飾的變量可以被當做常量使用
- 被const修的變量也可以變為常變量
- 編譯模式,若在編譯時立即給出立即數,則變為常量,否則則是常變量
代碼例子:
const int a= 20;//常量
//----------------------
int b = 20;
const int a= b;//常變量
- 由于C++對于類型的檢查會很嚴格是以在函數的傳參時,若直接以字面值傳輸在函數的參數表要加const,因為字面值具有常屬性
- 在類中可以作為常函數,const是給this指針加的,在常函數内不能修改成員變量的值,普通的成員函數可以調用常函數,而常函數隻能調用常函數,如果真的需要在常函數中修改某個成員變量的值,則需要在該成員變量前加mutable修飾符
class A
{
public:
void show(void) const
{
}
}
- 常引用,在無名引用時必須使用無名引用或者在引用臨時變量
const int& b = 20;
const int& c = 10+20;
4.void*
C語言中 void* 可以與任意類型進行轉換
而C++中必須進行強制類型轉換才能給其他類型進行指派,而其他類型可以給void*類型進行自動指派
因為C++可以自動擷取類型是以對于萬能指針的需求不是很大。