1. 程式人生 > >C和C++區別

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  

這個是為了解決同一變數名在統一作用域下的名字衝突問題。