C++是面向對象的編程語言,編程中我們不可避免的需要自定義的類,在定義自己的類時我們應該關注類中的幾個基本函數的定義——構造函數,復制構造函數,析構函數,賦值操作函數。現在簡單介紹一下以上幾個函數,由于水平有限,不足之處歡迎大家指正,以便互相學習,本人博客http://blog.csdn.net/IAccepted。
### 一.構造函數
我們在定義類時必須存在構造函數,但這里的必須存在并不是說程序員自己必須定義自己的構造函數,因為如果程序員不顯示定義,編譯器會生成一個默認構造函數。構造函數是一個特殊的成員函數,創建類類型的對象時都會調用構造函數。我們可以重載構造函數來實現不同的初始化規則。但是值得注意的是一旦顯示定義了有參構造函數,系統就不會再生成默認無參構造函數。這通常會帶來以下不便:
1.生成該類的每個對象都必須傳遞初始化參數進行初始化;
2.該類型不能用作動態分配數組的元素類型;
3.該類類型的靜態分配數組必須為每個元素提供一個顯示的初始化式;
實際上,如果定義了其他的構造函數,則提供一個默認構造函數幾乎總是對的【C++ primer】http://blog.csdn.net/IAccepted
當然我們還可以編寫構造函數來實現類類型對象的隱式轉換,著相對較簡單不再詳述,歡迎訪問本人博客:http://blog.csdn.net/IAccepted?
### 二.復制構造函數
一般情況下利用一個同類對象初始化一個對象和簡單的復制一個對象很簡單。很多時候復制構造函數我們并不顯示使用,在實參為類對象類型或返回值為類對象類型的值時都會調用復制構造函數,與構造函數類似,如果程序員不顯示的定義復制構造函數,編譯器也會為我們合成一個復制構造函數。一般情況下,類中如果只包含類類型成員或C++內置除指針外的類型的話,編譯器為我們合成的默認復制構造函數就可以實現復制,無需顯示定義復制構造函數,對于類中的類類型成員,會再調用自己的復制構造函數進行復制,類似與解箱操作,一層層的復制,知道最終全部為值類型。
注意指針類型是個特例,因為默認的復制構造函數只進行簡單的值復制,所以如果類中存在指針,則經過復制,兩個對象的指針成員就會指向同一個內存地址,這樣是很危險的,首先兩對象變的不再獨立,任何一個對象修改了其中指針變量指向的內存中的值,另一個對象也會受到影響,另外,刪除一個對象時,析構函數會釋放其中指針類型所指向的內存空間,這樣會造成另一個對象中的指針變成懸垂指針,有關指針的介紹大家可以查看本人的另一篇博客http://blog.csdn.net/iaccepted/article/details/6741600 。通常實現帶指針類型對象的復制構造我都是使用類似值類型的方式來實現的,即為每個副本都重新new一個指針類型的對象然后進行值拷貝。當然也可以使用智能指針。
### 三.析構函數
析構函數就相對比較簡單,主要針對的就是分配了系統資源的類對象在生命周期結束是回收資源,這里的生命周期可以是程序結束或者delete一個動態分配內存的對象。
如果類需要析構函數,則它也需要賦值操作符和復制構造函數。這是因為本類涉及到非值類型的成員,根據前面說的復制構造函數的內容,這點很容易理解,這是一個非常有用的規則,歡迎訪問本人博客:http://blog.csdn.net/IAccepted
### 四.賦值操作符
可以重載賦值操作符=,賦值操作符不需要分配新對象,只是抱枕給其中的指針所指向的對象賦新值,而不是給指針本省復制。其返回值必須為*this的引用
即?
~~~
classA classA::operator=(const classA& a){
……
……
return *this;
}
~~~
一般而言,賦值操作符與復合賦值操作符都應返回這樣的做操作數引用。
歡迎訪問本人博客:[http://blog.csdn.net/IAccepted](http://blog.csdn.net/IAccepted)
轉載請注明出處!