域運算符 new、delete運算符 重載

#3

域運算符

newdelete運算符

重載

name managlingextern C

帶默認參數的函數

域運算符

C++中增加的作用域標識符::

用於對與局部變量同名的全局變量進行訪問

用於表示類的成員,這將在關於類的一節中詳細說明

newdelete運算符

new運算符可以用於創建堆空間

成功返回首地址;失敗返回NULL

語法:

指針變量=new 數據類型;

指針變量=new 數據類型[長度n];

例如:

        int*p; p=new int;

        char*pStr=new char[50];


delete運算符可以用於釋放某塊(例如:*p指向的)堆空間

語法:

        delete指針變量;

        delete[] 指針變量;

例如:

        deletep;

        delete[] pStr;


對於對象,new一個新對象,C++有如下動作:

a.內存分配(operator new)

b.調用構造函數

delete釋放一個對象,C++有如下動作:

a.調用析構函數

b.釋放內存(operator delete)


重載

函數重載的定義:

相同的作用域,如果兩個函數名稱相同,而參數不同,我們把它們稱爲重載overload(函數重載又稱爲函數的多態性)

函數重載不同形式:

a.形參數量不同

b.形參類型不同

c.形參的順序不同

d.形參數量和形參類型都不同

故,調用重載函數時,編譯器通過檢查實際參數的個數、類型和順序來確定相應的被調用函數。


合法的重載例子:

int abs(int i);

long abs(long l);

double abs(double d);

非法的重載例子:

int abs(int i);

long abs(int i);

void abs(int i);

注意事項:

如果返回類型不同而函數名相同、形參也相同,則是不合法的,編譯器會報"語法錯誤"

name managlingextern “C”

name managling這裏把它翻譯爲名字改編,C++爲了支持重載,需要進行name managling

extern “C”實現CC++混合編程


#ifdef __cpluscplus

extern C

{

#endif

...

#ifdef __cpluscplus

}

#endif


帶默認形參值的函數

函數聲明或者定義的時候,可以給形參賦一些默認值;調用函數時,若沒有給出實參,則按指定的默認值進行工作。

注意事項:

a. 函數沒有聲明時,在函數定義中指定形參的默認值;函數既有定義又有聲明時,聲明時指定後,定義後就不能再指定默認值。

b. 默認值的定義必須遵守從右到左的順序,如果某個形參沒有默認值,則它左邊的參數就不能有默認值。

void func1(int a, double b=4.5, int c=3);//合法

void func1(int a=1, double b, intc=3);  //不合法

函數調用時,實參與形參按從左到右的順序進行匹配

c. 重載的函數中如果形參帶有默認值時,可能產生二義性;故,對於重載函數賦形參默認值。

int add(int x=5, int y=6);

int add(int x=5, int y=6, int z=7);

int main() {

        intsum;

        sum=add(10,20);

        return0;

}


int add(int x, int y)

{

  return x+y;

}

int add(int x,  int y, int z)

{

  return x+y;

}

sum=add(10,20)語句產生二義性性,可以認爲該語句是調用第一個函數,也可以是第二個,因此編譯器不能確定調用的是哪一個函數。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章