python字典浅拷贝深拷贝 opencv mat浅拷贝深拷贝 c++对象浅拷贝深拷贝

python字典 直接赋值 copy deepcopy

dict2 = dict1 #对象的引用
dict2 = dict1.copy() #浅拷贝 拷贝一级对象,但是如果字典里有个列表,改变dict1中这个列表的值的时候,dict2相应改变,可以自己递归实现深拷贝
import copy
dict2 = copy.deepcopy(dict1)#深拷贝所有级别的对象都拷贝


浅拷贝只拷贝父对象的意思
a = {1: [1,2,3]}
b = a.copy() #a, b分别为({1: [1, 2, 3]}, {1: [1, 2, 3]})
a[1].append(4) #a, b分别为({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})

OpenCV mat 直接赋值//Mat image1(image) ;//仅是创建了Mat的头部分,image1与image共享数据区

cv::Mat image;
cv::Mat image1(image) ;//仅是创建了Mat的头部分,image1与image共享数据区
cv::Mat image1 = image ;//仅是创建了Mat的头部分,image1与image共享数据区  
cv::Mat image1 = image.clone() ;//深拷贝,把image中的所有信息拷贝到image1中
cv::Mat image1;
image.copyTo(image1) ;//拷贝image的数据区到image1中,在拷贝数据前会有一步:image1.create(this->size , this->type)

//注意 cv::Mat 作为函数参数,无论写不写& ,看似传值或者传引用这种方式,原图都会发生改变,不使用clone或者copyto或者手动赋值,都不是深拷贝,都共享数据区

c++ 拷贝构造函数的浅拷贝和深拷贝

c++中类对象的默认拷贝构造函数是浅拷贝,类a=类b,两个类的成员变量指向同一块内存,如果类b析构了之后,类a的成员变量还指向原来那块内存,就会有野指针的问题,会出错。

想要深拷贝,应该自己自定义拷贝构造函数,为对应的成员变量开辟新空间。这才是好的编程习惯。

//深拷贝的例子
class Example{
public:
    Example(int num, char* str) {
        num_ = num;
        str_ = new char[num];
        strcpy(str_, str);
    }
    Example(const Example& e) {
        num_ = e.num;
        str_ = new char(num_);
        if(str_ != 0)
            strcpy(str_, e.str);
    }
    ~Example(){
        delete str_;
    }

private:
    int num_;
    char* str_;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值