C++ -浅拷贝和深拷贝

    xiaoxiao2021-03-25  62

    浅拷贝和深拷贝

    可能很多人都讲不知道这是深拷贝和浅拷贝是什么东西,现在我们用一个类中的 拷贝构造来说明,好的先看如下一个简单的例 子: # define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<windows.h> using namespace std; class Array { public: Array(int sz = 4) :_sz(sz) , _ptr(new int[_sz]) { cout << "Arrar()" << endl; } //浅拷贝 Array(const Array& arr) { cout << "拷贝执行" << endl; _ptr = arr._ptr; _sz = arr._sz; } ~Array() { cout << "~Array" << endl; if (_ptr != NULL) { cout << _ptr << endl; delete[] _ptr; _ptr = NULL; } } private: int _sz; int* _ptr; }; int main() { Array d1; Array d2(d1); system("pause"); return 0; } 这个例子呢,他是一个Array类,我们让他自己调用构造函数和拷贝函数,现在呢我们看看运行结果: 但是我们可以看出来这种方式看似简单好理解,但是它根本不够实用,发生错误的几率也很高。 这时候一个更牛逼的深拷贝出现了, 来我们看看深拷贝是如何实现的!! # define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<windows.h> using namespace std; class Array { public: Array(int sz = 4) :_sz(sz) , _ptr(new int[_sz]) { cout << "Arrar()" << endl; } //深拷贝 Array(const Array& arr) :_sz(arr._sz) , _ptr(new int[_sz]) { cout << "拷贝执行" << endl; memcpy(_ptr, arr._ptr, _sz*sizeof(int)); } ~Array() { cout << "~Array" << endl; if (_ptr != NULL) { cout << _ptr << endl; delete[] _ptr; _ptr = NULL; } } private: int _sz; int* _ptr; }; int main() { Array d1; Array d2(d1); system("pause"); return 0; } 现在这个就是深拷贝的代码,我们改的只有拷贝构造函数,我们让_ptr指向一个我们新开辟的空间。 然后在实现的过程,再将上一个类的_ptr的内容利用memcpy函数拷贝进来,是不是完美解决?

    来看看运行结果: 这就是原理,以后我们尽量使用深拷贝,浅拷贝反正不靠谱。。
    转载请注明原文地址: https://ju.6miu.com/read-36548.html

    最新回复(0)