C 中使用者定義的複製建構子
在C 中,編譯器通常會為類別產生一個預設的複製建構函數,該建構函式按成員執行複製。但是,在某些場景下,使用者定義的複製建構函數是必要的。
什麼時候需要使用者定義的複製建構子?
使用者定義的複製建構子是當預設複製建構子的成員複製行為不足時需要。考慮以下範例:
<code class="cpp">class Class { public: Class(const char* str); ~Class(); private: char* stored; }; Class::Class(const char* str) { stored = new char[srtlen(str) + 1]; strcpy(stored, str); } Class::~Class() { delete[] stored; }</code>
在此範例中,預設的複製建構函式將簡單地將指標複製到儲存的成員,而不是複製底層緩衝區。如果一個副本在另一個副本之前被銷毀,這可能會導致未定義的行為。
使用者定義的副本建構子
要解決此問題,您可以定義一個使用者定義的副本執行深度複製的建構子:
<code class="cpp">Class::Class(const Class& another) { stored = new char[strlen(another.stored) + 1]; strcpy(stored, another.stored); }</code>
此複製建構子分配新記憶體並複製儲存成員的內容,確保兩個副本都有自己獨立的緩衝區。
以上是C 中何時需要使用者定義的複製建構函式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!