当我们通过普通的构造函数构造出一个对象之后,用这个对象去初始化另一个新建的对象,如这种:
test a(1);
test b = a 或者test b(a) 这两种
还有这种 test & gettestObject()
则需要调用拷贝构造函数,如果我们没有显式的声明一个拷贝构造函数,系统会生成一个默认的,自定义拷贝构造函数是一种良好的编程习惯
#include "stdafx.h"
#include <stdio.h>
#include<iostream>
class people
{
public:
people(char* name)
{
strcpy(cname,name);
pname = new char[strlen(cname)+1];
if(name != NULL)
{
strcpy(pname,cname);
}
}
void show()
{
std::cout<<"my name is:"<<pname<<std::endl;
}
/*
people(people& p1)
{
std::cout<<"深拷贝"<<std::endl;
strcpy(cname,p1.cname);
pname = new char[strlen(cname)+1];
if(cname != NULL)
{
strcpy(pname,cname);
}
}
*/
~people()
{
if(pname != NULL)
{
delete[] pname;
pname = NULL;
}
}
private:
char cname[20];
char * pname;
};
void main()
{
people a("lcl");
people b = a;
b.show();
system("pause");
}
堆空间看成一种资源,系统默认的拷贝函数属于浅拷贝,去掉注释的部分,我们看浅拷贝后运行起来a,b的地址情况:
只是简单的复制,a、b对象内成员指针指向同一片空间
那在析构的时候,先析构a,那b中的pname就会变成野指针,也可以这么想,两个析构函数释放同一块堆内存会导致程序错误
深拷贝,加上自定义的拷贝函数后,就变成了深拷贝,复制了一份相同的资源,放在不同的地方,去掉上图注释部分,运行得到如下:
这就完成了深拷贝的过程。
混时长ing.........