C++深浅拷贝的实现

C++中提供了对象拷贝的功能,在进行拷贝时,如果我们没有特意去写拷贝构造函数,系统会自动为我们生成,但有些时候,比如对象成员中含有指针变量的时候,就需要防止拷贝出的构造函数中的指针变量与我们的模板对象成员变量中的指针指向同一块地址,此时就需要进行深拷贝,深拷贝会将两块内存中的信息进行拷贝,而不仅仅是值的拷贝(浅拷贝)。

浅拷贝会直接将值进行复制:

class One 
{
public:
  One(){a=5;}
  void setA(int _a){a=_a;}
  int getA(){ return a;}
private:
  int a;
};

int main()
{
  One on1;
  One on2=on1;
  cout << on2.getA() << endl;
  return 0;
}

结果是5,这里的a是一个整形变量,系统会自动为它申请空间。


深拷贝:

#include
#include
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::Array(int count)
{
	m_iCount = count;
	m_pArr = new int[m_iCount];
	for(int i=0 ; i

emmmmm,结果:

C++深浅拷贝的实现_第1张图片

可以看到两个m_pArr指向的是同一块内存,而且在简单的内存释放过程中有与多次释放用一块内存造成了程序崩溃。。。


所以下面展示正确的操作:

#include
#include
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::Array(int count)
{
	m_iCount = count;
	m_pArr = new int[m_iCount];
	for(int i=0 ; i


运行结果:

C++深浅拷贝的实现_第2张图片

一切正常,可以看到两个指针指向了不同的地址。nice


你可能感兴趣的:(C++深浅拷贝的实现)