浅拷贝
来看下面一段代码
在 实例化arr1
的时候,会对m_iCount
和m_pArr
赋默认值,用arr1
实例化arr2
时,调用拷贝构造函数,将arr1
的m_iCount
和m_pArr
传给arr2
相应的属性.
但会带来如下问题,由于m_pArr
是指针,arr1
和arr2
指向同一个地址,在销毁两个对象时会报错。这种也称为浅拷贝
深拷贝
改为如下代码
在拷贝构造函数内为m_pArr申请新的地址(不用验证是否申请成功),在赋值时用for循环的方式对数组挨个赋值。
示例
1
定义一个类 Array
Array.h
中
#include <iostream>
#pragma once
using namespace std;
class Array
{
public:
Array(int count);
Array(const Array&arr);
~Array();
void setCount(int count);
int getCount();
void printAddr();
void printArr();
private:
int m_iCount;
int *m_pArr;
};
Array.cpp
中
#include <iostream>
#include "Array.h"
using namespace std;
Array::Array(int count)
{
m_iCount = count;
m_pArr = new int[m_iCount]; //这里没有做对内存申请是否成功的判断
for (int i = 0; i < m_iCount; i++)
{
m_pArr[i] = i;
}
cout << "Array" << endl;
}
Array::Array(const Array&arr)
{
m_iCount = arr.m_iCount;
m_pArr = new int[m_iCount]; //为拷贝的_pArr申请一块新的内存
for(int i=0;i<m_iCount;i++)
{
m_pArr[i] = arr.m_pArr[i];
}
cout << "Array&" << endl;
}
void Array::setCount(int count)
{
m_iCount = count;
}
int Array::getCount()
{
return m_iCount;
}
void Array::printAddr()
{
cout << "m_pArr的值是" << m_pArr << endl;
}
void Array::printArr()
{
for (int i = 0; i < m_iCount; i++)
{
cout << "m_pArr的存放值是" << m_pArr[i] << endl;
}
}
Array::~Array()
{
delete[]m_pArr;
m_pArr = NULL;
}
main
中
#include <iostream>
#include<stdlib.h>
#include <string.h>
#include "Array.h"
using namespace std;
int main(void)
{
Array arr1(5); //实例化为对象arr1
Array arr2(arr1);
arr1.printAddr();
arr1.printArr();
arr2.printAddr();
arr2.printArr();
system("pause");
return 0;
}
结果
可见深拷贝的指针内存位置不同,但存放内容相同
如果使用浅拷贝 将
m_pArr = new int[m_iCount]; //为拷贝的_pArr申请一块新的内存
for(int i=0;i<m_iCount;i++)
{
m_pArr[i] = arr.m_pArr[i];
}
直接改为m_pArr=arr.m_pArr;
会报错如下图
原因是见开头