拷貝構造函數的重載


形式:Class_name(const Class_name & other){};//他接受一個指向類對象的常量應用作為參數。  const關鍵字的作用是保護other對象中的內容不發生變化。

1、何時調用拷貝構造函數:

新建一個對象並將其初始化為同類現有對象時,拷貝構造函數都將被調用。

StringBad ditto(motto);

StringBad metoo = motto;

StringBad also = StringBad(motto);

StringBad * pStringBad = new StringBad(motto);

這四種情況下都將調用拷貝構造函數,另外當函數返回一個類對象時,拷貝構造函數也會被調用。當然,當引用參數加了const關鍵字時,也會調用拷貝構造函數。

 

2、默認的拷貝構造函數的功能:

默認的拷貝構造函數逐個復制非靜態成員(成員賦值也稱為淺賦值),賦值的是成員的值。

淺拷貝只是將對象的地址拷貝了,拷貝之后兩個對象指向了同一個地址。

可能出現的問題:通過默認的拷貝構造函數生成的對象,一但析構了其中的一個,另外一個對象的數據就會受損。因為兩個對象的地址是一樣的,析構其中一個的時候,將會刪除數據內容。

 

3、定義一個顯示拷貝構造函數來解決問題:

在重載的拷貝構造函數中使用深度復制(deep copy)。拷貝后的對象將在堆上new一塊新的內存空間,然后將被拷貝的對象的內容復制給新對象。

代碼實現如下:

Class_name::Class_name(const Class_name & other){

  if(other.str != NULL){

        int len = strlen(other.str) + 1;

      str = new char[len];
    
        memset(str, 0, len);

      std::strcpy(str, other.str);

  }

}        

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM