默認狀況下編譯器給一個類添加三個函數:c++
1.默認構造函數(無參,函數體爲空) 2.默認析構函數(無參,函數體爲空) 3.默認拷貝構造函數,對成員屬性進行拷貝
class car{ int car_size; car(){ cout<<「默認構造函數」<< endl; } car(int size){ car_size=size; cout<<「有參構造函數」<< endl; } car(const car &p){ car_size=p.car_size cout<<「拷貝構造函數」<< endl; } ~car(){ cout<<「析構函數」<< endl; } }
(一)構造函數:可分爲有參構造函數/無參構造函數(或拷貝構造函數/其餘構造函數)
調用規則:若是用戶自定義有參構造,系統再也不提供默認無參構造,但提供拷貝構造。若是用戶自定義拷貝構造,系統在提供其餘構造和函數。
(二)拷貝構造函數:使用時機
1.使用一個已經建立完畢的對象來初始化一個新對象;
2.以值傳遞的方式給函數參數傳值;數組
實際應用舉例:函數
car C; //默認構造函 car C1=10; //有參構造函數 car C2= C; //拷貝構造函數
1)淺拷貝: 將原對象或原數組的引用直接賦給新對象,新數組,新對象只是原對象的一個引用(等號操做)
2)深拷貝: 建立一個新的對象和數組(在堆區動態申請內存),將原對象的各項屬性的「值」(數組的全部元素)拷貝過來,指針
是「值」而不是「引用」!!
防止在堆區申請的內存沒法經過淺拷貝的方式釋放。code
在有參構造函數寫: p = new int(car_size); 在析構函數寫: if(p!=NULL){ delete p; p=NULL; } 在拷貝函數中寫: p= new int(car_size);
p = new int(10)//p是一個整型指針,且初始化*p = 10;對象