淺拷貝和深拷貝具體詳解

當用一個已經初始化了的自定義類類型對象去初始化另一個新構造的對象的時候,拷貝構造函數就會被自動調用,也就是說,當類的對象需要拷貝時,拷貝構造函數將會被調用。

以下情況都會調用拷貝構造函數:

(1)一個對象以值傳遞的方式傳入函數體

(2)一個對象以值傳遞的方式從函數返回

(3)一個對象需要通過另一個對象進行初始化

淺拷貝和深拷貝的概念:

       淺拷貝:如果在類中沒有顯示的聲明一個拷貝構造函數,那麼,編譯器會自動生成一個默認的拷貝構造函數,該構造函數完成對象之間的位拷貝,而位拷貝又稱爲淺拷貝。以下就是淺拷貝,而淺拷貝的過程就是說在某些情況下,需要用已初始化的對象去初始化一個新對象的時候,在沒有自定義的拷貝構造函數時,系統調用默認構造函數,編譯通過,但此時,a和b將指向同一個內存,根據構造函數和析構函數的特點,先構造的後析構,所以b會先析構,將這塊內存的外部資源釋放,再將內存釋放,之後a內的指針就是野指針了,出現運行錯誤。

#include<iostream>
using namespace std;
class A:{
    A(){}
    ~A(){}
}
int main(){
    A a;
    A b=a;
}

        深拷貝:如果一個類擁有資源,當這個類的對象發生複製過程的時候,資源重新分配,這個過程就是深拷貝。

#include<iostream>
using namespace std;
class A:{
public:
    A(int data):ma(data),mb(data){}
    ~A(){}
    void A(const class &str){
        ma=str.ma;
        mb=str.mb;
    }
private:
    int ma;
    int mb;
}
int main(){
    A a(10);
    A b=a;
}
所以說,自定義拷貝構造函數是一種良好的編程風格,它可以阻止編譯器形成默認的拷貝構造函數,提高源碼效率。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章