iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0

第25天了!


拷貝建構元

建構元的目的是用來設定物件的初值,既然如此,我們是否可以用一個已存在的物件,當成初值來建立新的物件呢?在C++裡是可以這麼做的,但是會產生一些問題,我們將來逐一探討。

預設的拷貝建構元

如果程式設計師沒有明確定義一個拷貝建構元,C++ 編譯器會自動生成一個預設的拷貝建構元。這個預設的拷貝建構元執行淺層拷貝(shallow copy),即逐一複製物件中的每個成員變數。

淺層拷貝對於沒有指標或動態記憶體的類別來說通常是安全的,因為它只需要逐位拷貝數據。然而,對於包含指標或動態記憶體分配的類別,淺層拷貝可能會引發問題,因為物件之間可能共享同一個記憶體地址,導致資源釋放或記憶體衝突的問題。
例如:

class MyClass {
public:
    int x;
};

int main() {
    MyClass obj1;
    obj1.x = 10;

    MyClass obj2 = obj1;  // 預設拷貝建構元被呼叫
    std::cout << obj2.x;  // 輸出: 10
}

在這個範例中,obj1和 obj2都擁有自己的變數x,因為x是一個簡單的整數變數,因此淺層拷貝是完全可行的。預設的拷貝建構元會逐位拷貝物件中的成員,這對於基本資料型態來說沒有問題。

自訂的拷貝建構元

當類別中包含指標或動態分配的記憶體時,預設的淺層拷貝可能會造成錯誤。在這種情況下,程式設計師應該提供一個自訂的拷貝建構元來執行深層拷貝(deep copy),以確保每個物件有自己的資源,而不是與其他物件共享同一塊記憶體。要自訂拷貝建構元,必須以下面的語法來定義:

類別名稱(const類別名稱&)
{
    程式敘述;
     ....
}

值得一提的是,拷貝建構元的引數必須是指向物件的「參照」,且要加上const這個關鍵字,代表所傳入的物件不能被修改。


今天就先到這邊~謝謝大家!


上一篇
Day24 認識解構元
下一篇
Day26 運算子的多載
系列文
用30天學習C++26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言