From C to Cpp
- 從C到C++,加了哪些東西進去
1.In-line function
2.Reference type
在C裡要把兩個變數對調,pointer要傳過去,裡面放的數值交換後便可。而在C++提供類似功能,但更簡潔,稱reference
3.Parametric polymorphism through templates
templates : 模板,函數可以是任何資料型態,只要滿足兩個函數可以處理如相加,便可以用相加來處理所有進來的data type
4.Exception handling
C裡不會告訴發生什麼錯誤,C++多少會想辦法說發生什麼錯誤
5.Default function arguments
預設值,自動決定
6.Object-oriented programming
定義各種class
-->C為很有效率的語言,但變為C++希望能又有效率,又可以做更多事情,寫起來精簡易懂。
C++其實也為複雜的programming
- Pointers and Arrays
在C中,pointer非常容易發生問題,方便,卻危險。
方便: 若要一個一百萬的記憶體空間:
Array:需要連續的記憶體空間
Pointer:可以使用零散的空間方便
危險:
1.int* x, y, z 並不是指x, y, z皆為指到int的pointer,而是相當於 int *x, y, z,意思為x為指向int的pointer,而y, z為int
2.刪除沒宣告過的記憶體空間 --> segmentation fault
3.若宣告的矩陣或向量太大,則回傳不會為pointer而是錯誤 --> NULL
4.memory leak --> 會考
5.若矩陣長度為10,把值設定到11、12以上 --> out-of-bound indexing for arrays
--> 避免:利用C++的STL,vec.at()可以檢查access有沒有錯誤,但因為每次都會檢查,效率會變差。
- Memory Leak
呼叫一個new(C++ for allocate memory),而做完後要free掉,用delete,若無則會發生memory leak。
如何避免memory leak:
C++:new跟delete要成對出線
C:malloc or calloc or realloc後要有free
--> 或是在new一個pointer變數後,在delete前把pointer變數設為0或其他值,則此pointer原先指向的記憶體空間會無法delete(因為把原先的值蓋掉了,而造成不知道該如何釋放)
- How to Tackle Memory Leak
1.良好的programming style
Nwe/delete要成對放在同個空間(如不要new在function內而delete在外面)
Avoid shallow copy
2.用比較好的library
如STL或Smart pointer
--->若使用別人程式庫,需要去了解它、且程式會比較肥大,這是必須付出的代價
3.Tools for debugging
Windows:Purify
Linux/Unix:Valgrind