91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

c++淺拷貝和深拷貝怎么實現

c++
小億
96
2023-11-22 05:08:44
欄目: 編程語言

淺拷貝和深拷貝是針對對象的拷貝操作而言的。

淺拷貝:淺拷貝是指僅僅拷貝對象的值,而不拷貝對象所指向的內存。這樣,在拷貝對象和原始對象中會有一個指針指向同一塊內存。如果拷貝對象和原始對象中的指針指向的內存被釋放,那么兩個對象將指向同一塊無效內存,可能會導致程序出錯。

實現淺拷貝的方式主要有兩種:

  1. 默認的拷貝構造函數和賦值運算符:C++會自動生成默認的拷貝構造函數和賦值運算符,它們會按位拷貝對象的值。這種方式進行的拷貝就是淺拷貝。
class MyClass {
public:
    int *data;
    int size;

    // 默認的拷貝構造函數
    MyClass(const MyClass& other) {
        size = other.size;
        data = other.data;
    }

    // 默認的賦值運算符
    MyClass& operator=(const MyClass& other) {
        if (this != &other) {
            size = other.size;
            data = other.data;
        }
        return *this;
    }
};
  1. 自定義拷貝構造函數和賦值運算符:如果需要實現特定的拷貝操作,可以自定義拷貝構造函數和賦值運算符,進行淺拷貝。
class MyClass {
public:
    int *data;
    int size;

    // 自定義的拷貝構造函數
    MyClass(const MyClass& other) {
        size = other.size;
        data = other.data;
    }

    // 自定義的賦值運算符
    MyClass& operator=(const MyClass& other) {
        if (this != &other) {
            size = other.size;
            data = other.data;
        }
        return *this;
    }
};

深拷貝:深拷貝是指在拷貝對象時,會重新分配一塊內存,并將原始對象所指向的內存內容拷貝到新的內存中。這樣,在拷貝對象和原始對象中就沒有指針指向同一塊內存,修改拷貝對象不會影響原始對象。

實現深拷貝的方式主要有兩種:

  1. 自定義拷貝構造函數和賦值運算符:在自定義拷貝構造函數和賦值運算符時,需要手動分配新的內存,并將原始對象所指向的內存內容拷貝到新的內存中。
class MyClass {
public:
    int *data;
    int size;

    // 自定義的拷貝構造函數
    MyClass(const MyClass& other) {
        size = other.size;
        data = new int[size];
        std::copy(other.data, other.data + size, data);
    }

    // 自定義的賦值運算符
    MyClass& operator=(const MyClass& other) {
        if (this != &other) {
            size = other.size;
            delete[] data;
            data = new int[size];
            std::copy(other.data, other.data + size, data);
        }
        return *this;
    }

    // 析構函數
    ~MyClass() {
        delete[] data;
    }
};
  1. 使用智能指針:C++11引入了智能指針(如std::shared_ptr、std::unique_ptr),可以自動管理動態分配的內存,避免手動釋放內存的麻煩。
class MyClass {
public:
    std::shared_ptr<int> data;
    int size;

    // 自定義的拷貝構造函數
    MyClass(const MyClass& other) {
        size = other.size;
        data = std::make_shared<int[]>(size);
        std::copy(other.data.get(), other.data.get() + size, data.get());
    }

    // 自定義的賦值運算符
    MyClass& operator=(const MyClass& other) {
        if

0
延长县| 丹棱县| 新竹县| 宕昌县| 运城市| 遂川县| 兖州市| 江达县| 临桂县| 天台县| 天镇县| 新乐市| 乐山市| 长治县| 芦山县| 新平| 南岸区| 丰镇市| 南康市| 华坪县| 津南区| 兰溪市| 桂林市| 镇巴县| 皮山县| 麦盖提县| 安阳市| 通山县| 龙山县| 钟山县| 高陵县| 潞西市| 岑溪市| 资源县| 新余市| 晴隆县| 兴仁县| 兰考县| 尚志市| 榆树市| 南木林县|