形式: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);
}
}
