谈谈浅拷贝与深拷贝 ————墨白

对于C++来说,拷贝构造函数是非常重要的,但我们知道,编译器自己定义的不过是浅拷贝的拷贝构造函数,所谓浅拷贝,就是直接把这个变量的值赋给别的变量。具体看如下代码

#include<iostream>
using namespace std;
struct Date{
    int year;
    int month;
    int day;
};
class My
{
public:
    My(int a,int b):temp1(a),temp2(b){}
    My(My & my)
    {
        temp1=my.temp1;
        temp2=my.temp2;
    }
    int getTemp1()
    {
        return temp1;
    }
    int getTeme2()
    {
        return temp2;
    }
private:
    int temp1;
    int temp2;
};
int main()
{
    My my1(3,4);
    My my2(my1);
    cout<<"my1"<<" "<<my1.getTemp1()<<" "<<my1.getTeme2()<<endl;
    cout<<"my2"<<" "<<my2.getTemp1()<<" "<<my2.getTeme2()<<endl;
    return 0;
}

上文My(My & my){}就是拷贝构造函数实现的过程。这样看起来没有什么问题,那么问题来了,如果我成员变量中有一指针呢?如果执行浅拷贝,那不就是只是简单的把地址赋值给了另一个指针,也就是说,有两个指针指向该空间。这样很不好。因为我原来想每个对象都有自己的堆空间,而不是与别人共同指向同一块空间,最重要的是,这样析构函数调用delete不是就要两次了。所以不能这样,那该怎么办呢?
这昂:
#include
using namespace std;
struct Date{
int year;
int month;
int day;
Date(int a,int b,int c):year(a),month(b),day©
{}
};
class My
{
public:
My(int a,int b):temp1(a),temp2(b)
{
date=new Date(1 ,2, 3);
}
My(My & my)
{
temp1=my.temp1;
temp2=my.temp2;
*date=*my.date;
}
int getTemp1()
{
return temp1;
}
int getTeme2()
{
return temp2;
}
private:
int temp1;
int temp2;
Date * date;
};
int main()
{
My my1(3,4);
My my2(my1);
cout<<“my1”<<" “<<my1.getTemp1()<<” “<<my1.getTeme2()<<endl;
cout<<“my2”<<” “<<my2.getTemp1()<<” "<<my2.getTeme2()<<endl;
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值