複製建構子是 C 物件導向程式設計的組成部分,提供了一種基於現有實例初始化物件的方法。雖然編譯器通常會為類別產生預設的複製建構函數,但在某些情況下需要進行自訂。
當預設複製建構子不夠時,程式設計師會選擇使用者定義的複製建構子來實作自訂複製行為。這在預設複製建構函式執行的按成員複製無法滿足所需要求的情況下尤其重要。
範例1:動態分配資料的深度複製
考慮一個具有動態分配成員變數的類,如以下程式碼所示:
class Class {
public:
Class(const char* str);
~Class();
private:
char* stored;
};
Class::Class(const char* str) {
stored = new char[strlen(str) 1];
strcpy(stored, str);
}
Class::~Class() {
delete[] stored;
}
在此範例中,以成員方式複製儲存的成員只會複製指針,而不是實際的字元緩衝區。因此,當其中一個副本被銷毀時,它將釋放另一個副本分配的相同內存,從而導致未定義的行為。為了解決這個問題,必須實作一個深拷貝建構函式來複製緩衝區,確保每個副本都有自己獨立的記憶體分配:
Class::Class(const Class& another) {
stored = new char[strlen(another.stored) 1];
strcpy(stored, another.stored);
}
void Class::operator=(const Class& another) {
char* temp = new char[strlen(another.stored) 1];
strcpy(temp, another.stored);
delete[] stored;
stored = temp;
}
範例 2:控制引用計數物件的複製
某些類別可以使用引用計數來管理動態分配物件的生命週期。此類類別的預設複製會導致引用計數不正確。自訂複製建構函式可以確保正確的參考計數,防止記憶體洩漏或過早的物件銷毀。
範例 3:複製具有不可複製成員的物件
類別可能具有非可複製成員-可複製的成員變量,例如檔案句柄或網路連線。預設複製構造函數無法處理此類成員,需要自訂複製構造函數執行適當的操作,例如在複製過程中分離不可複製的成員。
透過了解這些場景,程式設計師可以有效地識別使用者定義的複製建構函式必不可少的情況,確保其 C 應用程式中的最佳物件初始化和安全複製行為。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3