浅拷贝只复制了对象的指针,对象指针指向的数据还是同一块内存空间,析构函数只能调用一次
深拷贝不仅复制了对象指针,对象指针指向的数据也在堆区重新申请内存空间,进行拷贝操作 ,析构操作正常进行
#include<iostream>
#include<cstring>
using namespace std;
class A
{
public:
A();
A(const char* ,int );
A(const A&);//浅拷贝构造函数是没有这个拷贝构造函数
//调用的是系统默认的拷贝构造函数
~A();
void show();
//浅拷贝只复制了对象的指针,对象指针指向的数据还是同一块内存空间,析构函数只能调用一次
//深拷贝不仅复制了对象指针,对象指针指向的数据也在堆区重新申请内存空间,进行拷贝操作 ,析构操作正常进行
private:
char* name;
int score;
static int g; //计算调用几次构造函数
static int x;//计算调用几次析构函数
};
int A::g = 0;
int A::x = 0;
A::A(){
cout<<"默认无参构造函数"<<endl;
}
A::A(const char* Name,int p){
name=new char[strlen(Name)+1];
strcpy(name,Name);
score=p;
cout<<"初始化构造函数"<<endl;
}
A::A(const A& a){
name=new char[strlen(a.name)+1];
strcpy(name,a.name);
score=a.score;
g++;
cout << "第" << g << "次调用:";
cout<<"深拷贝构造函数"<<endl;
}
A::~A(){
x += 1;
cout << "第" << x << "次调用:";
cout << "析构函数"<<name<< endl;
delete[] name;
name=NULL;
}
void A::show(){
cout<<"Name: "<<name<<"\t"<<"Score: "<<score<<endl;
}
void test01(){
string name="abcdefg";
A a1(name.c_str(),100);
a1.show();
A a2=a1;
a2.show();
}
int main(){
test01();
return 0;
}