C++之深拷贝VS浅拷贝

1.浅拷贝

将值直接拷贝过去

只是对指针的拷贝,拷贝之后两个指针指向同一块内存,会造成系统奔溃

class Array
{
public:
    Array(int count);
    Array(const Array &arr);
    ~Array();
    void setCount(int count);
    int getCount();
    void printAddr();
private:
    int m_iCount;
    int *m_pAir;
};

#include <iostream>
#include "Array.h"
using namespace std;

Array::Array(int count)
{
    m_iCount = count;
    m_pAir = new int [m_iCount]; 
    cout << "Array"<< endl;

}

Array::Array(const Array &arr)
{
   m_pAir = arr.m_pAir; //指向同一块内存
   m_iCount = arr.m_iCount;
   cout << "Array &"<<endl;
}

Array :: ~Array()
{   
    delete []m_pAir;
    m_pAir = NULL;
    cout << "~Array"<<endl;
}

void Array::setCount(int count)
{
    m_iCount = count;
}

int Array::getCount()
{
    return m_iCount;
}
void Array::printAddr()
{
    cout << m_pAir<<endl;
}

#include <iostream>
#include "Array.h"
using namespace std;


int main()
{
    Array arr1(5);
  //  arr1.setCount(5);

    Array arr2(arr1);
    arr1.printAddr();
    arr2.printAddr();

   //cout << "arr2.m_iCount = " << arr2.getCount() << endl;
    return 0;
    
}

2.深拷贝

不但对指针实现拷贝,还对指针指向的内容实现拷贝,拷贝之后两个指针指向不同的内存。

类里有个成员是指针,必须实现深拷贝

class Array
{
public:
    Array(int count);
    Array(const Array &arr);
    ~Array();
    void setCount(int count);
    int getCount();
    void printAddr();
private:
    int m_iCount;
    int *m_pAir;
};


#include <iostream>
#include "Array.h"
using namespace std;


int main()
{
    Array arr1(5);
  //  arr1.setCount(5);

    Array arr2(arr1);
    arr1.printAddr();
    arr2.printAddr();

   //cout << "arr2.m_iCount = " << arr2.getCount() << endl;
    return 0;
    
}



#include <iostream>
#include "Array.h"
using namespace std;

Array::Array(int count)
{
    m_iCount = count;
    m_pAir = new int [m_iCount]; 
    for(int i = 0; i < m_iCount; i++)
    {
        m_pAir[i] = i;
    }
    cout << "Array"<< endl;

}

Array::Array(const Array &arr)
{
     m_iCount = arr.m_iCount;
     m_pAir = new int[m_iCount];
     for(int i = 0; i < m_iCount;i++)
     {
         m_pAir[i] = arr.m_pAir[i]; 
     }
   cout << "Array &"<<endl;
}

Array :: ~Array()
{
    delete []m_pAir;
    m_pAir = NULL;
    cout << "~Array"<<endl;
}

void Array::setCount(int count)
{
    m_iCount = count;
}

int Array::getCount()
{
    return m_iCount;
}
void Array::printAddr()
{
    cout << m_pAir<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值