#include<stdio.h>
//关于深拷贝中的注意事项:
//①拷贝构造函数需要申请空间,赋值操作函数中空间已经申请过,是否需要重新申请,看需求
//②构造函数和拷贝构造函数中,对指针类型的成员变量,注意需要初始化,否则是不可预测的值
class A{
public:
A():a(NULL){//如果a不进行初始化,则初始值是不确定的,可能是个非NULL值
printf("normal 01 construct\t0x%X\n", (unsigned)a);
a = new int[10];
printf("normal 02 construct\t0x%X\n", (unsigned)a);
memset(a,0, sizeof(int)*10);
}
A(const A& temp)
{
printf("copy 01 construct\t0x%X\tsizeof(a)=%d\n", (unsigned)a, sizeof(a));
a = new int[10];
printf("copy 02 construct\t0x%X\tsizeof(a)=%d\n", (unsigned)a, sizeof(a));
//memcpy(a, temp.a, sizeof(a)); sizeof(a)会被认为是4
memcpy(a, temp.a, sizeof(int)*10);
}
A& operator=(const A& temp)
{
//this->a,不用再重新分配空间,因为this->a的空间已经存在,且大小与temp.a指向的空间大小一致
printf("assgin 01 operator\t0x%X\n", (unsigned)a);
memcpy(a, temp.a, sizeof(int)*10);
printf("assgin 02 operator\t0x%X\n", (unsigned)a);
return *this;
}
~A()
{
if(a)
{
delete[] a;
}
}
void set_data(int data)
{
for(int i=0;i<10;++i)
{
a[i] = data;
}
}
void print_data()
{
for(int i=0;i<10;++i)
{
printf("%d ",a[i] );
}
printf("\n");
}
private:
int *a;
};
int main()
{
A a1;//构造函数
A a2(a1);//拷贝构造函数
a2.set_data(2);
a2.print_data();
a2 = a1;//赋值操作符
a2.print_data();
}
/*
输出情况:
normal 01 construct 0x0
normal 02 construct 0x54156B28
copy 01 construct 0xA0F7FD0C sizeof(a)=4 //由于copy中的a没有初始化,所以一开始是个不可预测的值
copy 02 construct 0x53A02268 sizeof(a)=4
2 2 2 2 2 2 2 2 2 2
assgin 01 operator 0x53A02268
assgin 02 operator 0x53A02268
0 0 0 0 0 0 0 0 0 0
*/
拷贝构造函数 赋值操作符
最新推荐文章于 2024-03-30 20:51:08 发布