C++中的深拷贝和浅拷贝的简单理解

来源:互联网 发布:淘宝查号131458查询 编辑:程序博客网 时间:2024/05/17 00:16
浅拷贝:拷贝的是地址(这个不太懂,别人博客的写法)
深拷贝:拷贝的是内容

对于没有指针的类,进行浅拷贝是没有问题的;
对于含有指针的类中,对于默认的拷贝构造函数也是浅拷贝;
会将两个指针指向同一个地址,再进行一次delete操作的时候,会将一个指针删除,另外一个则成为野指针;
导致程序崩溃;
简单的写法:(没加头文件)
int main(){/* 浅拷贝int *p = new int;*p = 5;//cout<<*p;int *q = p;delete q;delete p;*//* 深拷贝int *p = new int;*p = 5;//cout<<*p;int *q = new int;*q = *p;cout << *p << " " << *q << endl;delete q;delete p;*/return 0;}
对于c++的拷贝构造函数:
// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<cstdio>#include<cmath>#include<string>#include<queue>#include<algorithm>#include<stack>#include<cstring>#include<vector>#include<list>#include<set>#include<map>#include<stdlib.h>#include<time.h>using namespace std;#define pi (4*atan(1.0))#define eps 1e-14#define bug(x)  cout<<"bug"<<x<<endl;typedef long long LL;const int N = 1e5 + 10, M = 1e6 + 10, inf = 1e9 + 7;const LL INF = 5e17 + 10, mod = 1e9 + 7;class l{public :l(){}l(const l &a){x = a.x;}int x;};class Array{public:Array(int count);Array(const Array &Arr);~Array();void setcount(int count);int getcount();void setm_pArr();void getm_pArr();void printAddr();private:int m_count;int *m_pArr;};Array::Array(int count){m_count = count;m_pArr = new int[m_count];setm_pArr();cout << "Array" << endl;}/*Array::Array(const Array &Arr)// 浅拷贝{m_pArr = Arr.m_pArr;this->m_count = Arr.m_count;cout << "Array&" << endl;}*/Array::Array(const Array &Arr)//深拷贝{m_count = Arr.m_count;m_pArr = new int[m_count];for (int i = 0; i < m_count; i++)m_pArr[i] = Arr.m_pArr[i];cout << "Array&" << endl;}void Array::setcount(int count){this->m_count = count;}int Array::getcount(){return this->m_count;}void Array::setm_pArr(){for (int i = 0; i < m_count; i++)m_pArr[i] = i;}void Array::getm_pArr(){for (int i = 0; i < m_count; i++)cout << m_pArr[i] << " ";cout << endl;}Array::~Array(){this->printAddr();delete[]m_pArr;this->printAddr();m_pArr = NULL;cout << "~Array" << " " << this->m_count << endl;}void Array::printAddr(){cout << "m_pArr" << " " << m_pArr << endl;}int main(){Array arr1(5);Array arr2 = arr1;arr1.getm_pArr();arr2.getm_pArr();return 0;}



原创粉丝点击