2.枚舉類型的每個元素都有一個整型值。如果你沒有明確地為某個枚舉常量指定值,編譯器就會自動地為它們賦予不同的值。賦值方法是為第一個枚舉常量賦值0,以後的常量值是它前麵的常量值加1。
所以在缺省情況下,Monday的值為0;Tuesday的值為1;Sunday的值為6。
3.在說明枚舉類型時,可以為某些枚舉常量賦予特定的值。而對沒有給出值的枚舉常量,編譯器仍按前麵的規則為它們賦值,即它的值等於它前麵的枚舉常量的值加1。
4.不同枚舉常量的值可以相同。即可以為枚舉常量指定重複值。下麵的說明是合法的。
其中,mycolor是個枚舉變量,把整數值2賦給該變量財必須進行強製的類型轉換。如果該整數超出了枚舉常量的取值範圍,或在枚舉類型中包含有重的值,那麼強製類型轉換的結果是無意義的。
4.15new和delete
在程序開發過程中,動態內存匹配是使用的一個技巧。c語言中的所有動態內存分配都是通過malloc()和free()這樣的庫函來進行的。然而,raalloc()函數對待分配變量的類型是不知道的,它需要取變量的大小作為參數來決定分配空間的大小。所以,作為替代,在C++中用new運算符來取代malloc()函數;用delete運算符來取代fbe()函數。要注意的是new和delete是運算符而不是庫函數。與malloc()不詞new運算符本身知道要分配的對象所需內存空間的大小。
注意,為數組分配空間是將數組尺寸放在類型名後的方括號內,而釋放數組空間是在指針名前放上一對空的方括號。
2.為多維數組分配內存空間。例如:
在編寫C++程序時,malloc()和free()與new和delete要配套使用。最好不要混用。即delete僅能作用於new返回的指針,且隻可以將它們刪除一次。如果刪除不是由new獲得的指針或刪除一個指針兩次以上,程序可能會出現奇怪的現象,甚至死機。我們應該避免犯這樣的錯誤。
4.16函數的載重
在c語言中,每個函數的名字應該是唯一的,否則在調用以該名字名的函數時,編譯器無法知道你要調用哪個函數。例如,有三個函數的功能實際是相同的,是返回一個數的絕對值,隻不過是它們的作用對象不同。對這種功能相同的函數用相同的函數名去定義,這在C語言中似乎是不可能的,但在C++中卻能很好地解決。
在C++中,幾個函數可以共享同一個名字,隻要這些同名函數的參數表有所區別。這就是函數重載的概念。
雖然這幾個函lie的參數個數相詞,但它們類型不同。通過對函數調用表達式中實際參數與形式參數的類型進行匹配,編譯器可以確定在一個函數調用表達式中的abs()指的是哪個函數。
函數調用表達式abs(-4L)將調用那個帶有long類型參數的函數。
函數調用表達式abs(8.5)將調用那個帶有double類型參數的函數。
函數重載的特性使程序的可讀性更好了,但要注意下麵幾點:
1.多個函數共享同一個名字時,這些函數的參數說明必須能互相區別,要麼參數個數不同,要麼參數個數雖然相同,但類型不同。
2.同名函數的參數類型和個數都相同,但返回類型不同,不能用於重載函數。因為編譯器不能依據返回類型區分函數。
3.對函數功能不相幹的函數,最好不要用重載函數。
4.編譯器在選擇使用哪一個重載函數時,有時不得不處理一些模糊問題。處理這些模糊問題的原則是“就近匹配”。例如,對於前麵介紹的重載函數abs(),如果程序中出現abs.的調用形式,編譯器把該函數調用的參數情況與ab8()的所有重載形式進行比較,發現都不能匹配,那麼就調用最便於進行類型轉換的那個函數。因為,字符型數據最容易轉換成整數。所以,編譯器將調用以int為參數的abs(inti)函數。
4.17鏈接說明
如果在C++程序中去調用C語言的函數,就必須設法讓C++編譯器知道。鏈接說明將能完成這一工作。
例4.16利用鏈接說明,告訴C++編譯程序MYUB.H中的函數是由C編譯程序編譯的。
Extern“C”語句指出了花括號內的所有內容都是C編譯程序編譯的。如果沒有花括號,鏈接作用就僅作用於同一行上的extern語句後的聲明。
鏈接說明不僅能作用於C語言的頭文件,它還能使C語言的函數既適合於C程序,又適合於C++程序。
上麵花括號中的三個函數本來是C語言的函數,但經過上麵的定義後,它們就能適合於C++程序。