溫馨提示×

c++淺拷貝和深拷貝怎么實(shí)現(xiàn)

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

淺拷貝和深拷貝是針對(duì)對(duì)象的拷貝操作而言的。

淺拷貝:淺拷貝是指僅僅拷貝對(duì)象的值,而不拷貝對(duì)象所指向的內(nèi)存。這樣,在拷貝對(duì)象和原始對(duì)象中會(huì)有一個(gè)指針指向同一塊內(nèi)存。如果拷貝對(duì)象和原始對(duì)象中的指針指向的內(nèi)存被釋放,那么兩個(gè)對(duì)象將指向同一塊無效內(nèi)存,可能會(huì)導(dǎo)致程序出錯(cuò)。

實(shí)現(xiàn)淺拷貝的方式主要有兩種:

  1. 默認(rèn)的拷貝構(gòu)造函數(shù)和賦值運(yùn)算符:C++會(huì)自動(dòng)生成默認(rèn)的拷貝構(gòu)造函數(shù)和賦值運(yùn)算符,它們會(huì)按位拷貝對(duì)象的值。這種方式進(jìn)行的拷貝就是淺拷貝。
class MyClass {
public:
    int *data;
    int size;

    // 默認(rèn)的拷貝構(gòu)造函數(shù)
    MyClass(const MyClass& other) {
        size = other.size;
        data = other.data;
    }

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

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

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

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

實(shí)現(xiàn)深拷貝的方式主要有兩種:

  1. 自定義拷貝構(gòu)造函數(shù)和賦值運(yùn)算符:在自定義拷貝構(gòu)造函數(shù)和賦值運(yùn)算符時(shí),需要手動(dòng)分配新的內(nèi)存,并將原始對(duì)象所指向的內(nèi)存內(nèi)容拷貝到新的內(nèi)存中。
class MyClass {
public:
    int *data;
    int size;

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

    // 自定義的賦值運(yùn)算符
    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;
    }

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

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

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

0