c++ 構造析構函數、深淺拷貝——大一下暑假總結

1.構造函數和析構函數:

默認狀況下編譯器給一個類添加三個函數: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;  //拷貝構造函數

2.深拷貝 與 淺拷貝

  • 區別

1)淺拷貝: 將原對象或原數組的引用直接賦給新對象,新數組,新對象只是原對象的一個引用(等號操做)
2)深拷貝: 建立一個新的對象和數組(在堆區動態申請內存),將原對象的各項屬性的「值」(數組的全部元素)拷貝過來,指針

是「值」而不是「引用」!!
  • 爲何要使用深拷貝?

防止在堆區申請的內存沒法經過淺拷貝的方式釋放。code

  • 深拷貝代碼實現: 【假設*p爲類的成員變量】
在有參構造函數寫:
p = new int(car_size);
在析構函數寫:
 if(p!=NULL){
    delete p;  p=NULL;
}
在拷貝函數中寫:
 p= new int(car_size);

3. c++特有的賦值方式:

p = new int(10)//p是一個整型指針,且初始化*p = 10;對象

相關文章
相關標籤/搜索