#3
域運算符
new、delete運算符
重載
name managling與extern “C”
帶默認參數的函數
域運算符
C++中增加的作用域標識符::
用於對與局部變量同名的全局變量進行訪問
用於表示類的成員,這將在關於類的一節中詳細說明
new、delete運算符
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 managling與extern “C”
name managling這裏把它翻譯爲名字改編,C++爲了支持重載,需要進行name managling。
extern “C”實現C與C++混合編程
#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)語句產生二義性性,可以認爲該語句是調用第一個函數,也可以是第二個,因此編譯器不能確定調用的是哪一個函數。