拷贝构造函数 赋值操作符

本文详细介绍了C++中类的深拷贝实现,包括构造函数、拷贝构造函数和赋值操作符的使用。着重强调了指针成员变量在构造和拷贝过程中的初始化以及内存管理的重要性,防止出现悬挂指针的问题。示例代码展示了如何正确实现深拷贝,以确保数据的完整复制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值