C 基礎(一)建構函式 析構函式 拷貝建構函式

2021-06-21 09:26:55 字數 1074 閱讀 9314

在c++中你寫乙個空類,什麼都不做,編譯器會給你生成乙個建構函式,乙個拷貝建構函式,乙個拷貝賦值函式(運算子過載),乙個析構函式,而且是當他們被呼叫的時候才生成。這說明這四個函式的重要;這裡主要說他們其中的三個:

c++中的建構函式用來產生物件,他告訴編譯器如何初始化乙個物件,以及其它一些前期工作;相對應的析構函式告訴怎麼銷毀乙個物件;

關於物件的初始化:

1)初始化列表,相當於定義的同時就初始化。

2)函式內初始化,相當於申請空間,再賦值,效率較低。

關於初始化列表,要知道有些資料成員是不能在初始化列表中初始化的:

1)陣列  

2)static類資料成員:因為static資料成員屬於整個類,不屬於哪個物件,如果每個物件都來初始化一次,那麼static資料成員就沒有意義了;

3)非static的const成員,必須要在初始化列表初始化:這個其實很好理解:我們對於const成員在定義的時候就要初始化,當然在物件申請空間的時候也是。

建構函式是沒有返回值的,他是給編譯器用的,但是他可以有引數,或者不帶引數,這就說明,乙個類可以有多個建構函式,這就是建構函式的過載;

那析構函式可不可以過載呢?如果上面說建構函式是給編譯器看的,至少人還能進行干預,比如我可以決定使用上面引數來進行初始化;對於析構函式人則完全無法干預了,析構函式不帶引數,所以析構函式只能有乙個,沒法過載。

關於析構函式:

析構函式主要用來「善後」,而且是系統自動執行,程式設計師不能在這個過程中顯式的進行干預,析構函式只有乙個,且不帶引數;

預設的析構函式無法釋放堆資源,如果在建構函式中申請了堆資源,要記得在析構中釋放,這裡涉及深淺拷貝的問題;

如果兩個物件中都有乙個指標,指標指向的是同一塊資源,那麼兩個物件被析構的時候,會兩次釋放同一塊資源,就會有問題;

關於拷貝建構函式:

拷貝建構函式顧名思義,首先他是建構函式,他也沒有返回值,他可以看成是有引數的建構函式,他告訴編譯器以另外乙個物件為藍本,創造乙個新物件;

預設的拷貝建構函式是按位複製的,有時候這樣會出問題,所以有時候我們要自己定義拷貝建構函式,這就是深拷貝,比如上面說的問題,我們要複製指標,還是要複製指標指向的堆空間?這個需要顯式的定義,編譯器不會幫你。

C 建構函式 拷貝構造 析構函式

建構函式 constructor 在例項物件時,系統自動呼叫,用來初始化物件的資料成員 建構函式宣告語法 類名 引數列表 建構函式注意點 include include using namespace std class computer 上面的建構函式也可以寫成引數列表初始化的形式 compute...

C 建構函式 析構函式 拷貝建構函式

建構函式 析構函式 拷貝建構函式 如果類成員變數有初始值,用這些初始值初始化成員變數 如果類成員變數沒有初始值,則預設初始化該成員變數 class student int main 使用注意事項 語法 這個預設建構函式之所以對student有效,是因為我們為內建型別的資料成員提供了初始值 如果你的編...

c 基礎學習 析構函式 拷貝建構函式

字串函式 string類是c 提供的字串類,其主要功能是對字串進行操作。string類定義的變數稱為字串物件,該物件可以直接用字串常量賦值,也可呼叫string類中定義的成員函式。常型別是指使用型別修飾符const說明的型別,常型別的變數或物件的值不能被更新。c 中引入const的目的是為了取代巨集...