C和C++區別
1.const * 和引用&
const
常量 常變數
常變數就是不能做左值,其他都和變數性質一樣的。
常量在編譯時候所有用到常量的地方都替換成常量的初始值。
1.C和C++第一個區別:
我們什麼時候要加常引用呢?
很明顯就是在引用我們常量的時候需要我們常引用。
函式返回值
內建型別產生的臨時量都是常量 不可更改 通過eax 暫存器
自定義型別產生的臨時量是變數 可以修改
<= 4 eax 暫存器帶回
>4 <=8 eax edx兩個暫存器帶回
> 8 產生臨時量
int GetInt() { int data = 10; return data; // mov eax,dword ptr[ebp-4]; //通過暫存器帶回 } int main() { int &a = GetInt(); //不能直接引用,因為右邊不能取地址 const int &a = GetInt(); //加了const 是可以的,產生一個零時量 cosnt int *p = &GetInt(); //這樣是產生不了零時量 //const & 不可定址的常量 return 0; }
2.動態記憶體開闢
malloc free
new delete
int main()
{
int *p = (int *)malloc (sizeof(int));
int *p = new int(10);
return 0;
}
malloc
作用:分配長度為num_bytes位元組的記憶體塊。如果分配成功則返回指向被分配記憶體的指標,分配失敗返回空指標NULL。當記憶體不再使用時,應使用free()函式將記憶體塊釋放。
malloc 向系統申請分配指定size位元組記憶體空間,返回void*型別,在強轉成自己要的型別。
free
作用:該函式是將之前用malloc 分配的空間還給作業系統,也就是釋放這塊記憶體,讓它重新得到自由。
注意
1)申請了記憶體空間,必須檢查是否分配成功
2)當不需要這塊申請的記憶體時候,記得釋放。釋放後記得把它置為NULL。
3)同一塊記憶體不能釋放兩次。
new運算子
C++中,用new和delete 動態建立和釋放陣列或單個物件。
動態建立物件時,只需指定其資料型別,而不必為物件命名,new表示式返回值向該建立物件的指標,我們可以通過指標來訪問此物件。
初始化問題
int *p = new int(); //初始化為0
int *p = new int ; //p指向一個沒有初始化的int
malloc 失敗返回NULL
new失敗是丟擲ad_alloc 異常
malloc 是需要我們計算出申請記憶體的位元組數,並且在返回強行轉換為實際型別的指標。
new 返回是指定型別的指標,並且可以自動計算所需大小。
int *p = (int *) operator new(sizeof(int));
p = new(p) int (10); //init
//定位new
第三個作用域
C作用域
區域性作用域
全域性作用域
C++的作用域
區域性作用域
類作用域
名字空間作用域namespace
這個是為了解決同一變數名在統一作用域下的名字衝突問題。