深复制与浅复制


浅拷贝

  • 自己没有定义复制构造函数的话,系统默认定义一个构造函数,该构造函数就是浅复制。

  • 当一个对象被建立的时候,我们知道,通过我们定义的构造函数,系统会新建一个对象,包括两个成员变量sizedata

  • 然后,构造函数会使用动态内存分配建立一个新的堆对象,并且让data指向这个堆对象。下图表示:

  • 下图表示

  • 如果我们自己不定义复制构造函数的话,系统默认的复制构造函数在调用的时候,就会建立一个完全相同的对象——换句话说,其data指针的地址也是完全相同的。

  • 这就意味着,新的对象所包含的data指针,指向的实际上是被复制的对象所建立的堆对象:

深拷贝

  • 复制构造的对象应该有自己的堆对象,并且堆对象内存储的数据跟被复制的对象完全一样。

#include 
//#include 
#include 
#include 

using namespace std;

class vector{
private:
    int * data;
    int size;
public:
    vector(int size){
        this->size = size;
        data=new int[size];
    }
    //深复制
    vector(vector& v){
        size=v.size;
        data=new int[size];
        for (int i = 0; i < size; i++) {
              data[i]=v.data[i];
        }
    }
    ~vector(){
        delete[] data;
    }
    void print() {
        // 输出大小与地址
        cout << size << " " << data << endl;
    }
};

int main() {
    vector v(10);
    v.print();
    vector v1(v);
    v1.print();
    
    return 0;
    
}

文章作者: Axieyun
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Axieyun !
评论
评论
  目录