首页 > 编程语言 >C++(深拷贝、潜拷贝)

C++(深拷贝、潜拷贝)

时间:2023-12-19 15:01:16浏览次数:36  
标签:int ShallowCopyExample C++ 对象 拷贝 data DeepCopyExample

在C++中,深拷贝(deep copy)和浅拷贝(shallow copy)是涉及对象复制的两个概念,特别是当涉及到类或结构体时。下面我将解释这两个概念:

1. 浅拷贝(Shallow Copy):

浅拷贝是指将一个对象的内容复制到另一个对象,但如果对象中包含指针,则只会复制指针的值,而不是指针所指向的数据。这意味着两个对象会共享相同的数据,当其中一个对象的数据发生改变时,另一个对象的数据也会相应改变。

#include <iostream>

class ShallowCopyExample {
public:
    int* data;

    // Constructor
    ShallowCopyExample(int value) {
        data = new int(value);
    }

    // Shallow copy constructor
    ShallowCopyExample(const ShallowCopyExample& other) {
        data = other.data; // 只复制指针的值
    }

    // Destructor
    ~ShallowCopyExample() {
        delete data;
    }
};

int main() {
    ShallowCopyExample obj1(42);
    ShallowCopyExample obj2 = obj1; // 浅拷贝

    std::cout << *obj1.data << std::endl; // 输出: 42
    std::cout << *obj2.data << std::endl; // 输出: 42

    // 修改其中一个对象的数据
    *obj1.data = 99;

    // 由于浅拷贝,另一个对象的数据也会被修改
    std::cout << *obj1.data << std::endl; // 输出: 99
    std::cout << *obj2.data << std::endl; // 输出: 99

    return 0;
}

2. 深拷贝(Deep Copy):

深拷贝是指将一个对象的内容复制到另一个对象,并且复制指针所指向的实际数据,而不仅仅是复制指针的值。这样,两个对象有各自独立的数据,修改其中一个对象的数据不会影响另一个对象。

#include <iostream>

class DeepCopyExample {
public:
    int* data;

    // Constructor
    DeepCopyExample(int value) {
        data = new int(value);
    }

    // Deep copy constructor
    DeepCopyExample(const DeepCopyExample& other) {
        data = new int(*other.data); // 深拷贝:复制指针所指向的数据
    }

    // Destructor
    ~DeepCopyExample() {
        delete data;
    }
};

int main() {
    DeepCopyExample obj1(42);
    DeepCopyExample obj2 = obj1; // 深拷贝

    std::cout << *obj1.data << std::endl; // 输出: 42
    std::cout << *obj2.data << std::endl; // 输出: 42

    // 修改其中一个对象的数据
    *obj1.data = 99;

    // 由于深拷贝,另一个对象的数据不受影响
    std::cout << *obj1.data << std::endl; // 输出: 99
    std::cout << *obj2.data << std::endl; // 输出: 42

    return 0;
}

在实际编程中,确保使用适当的拷贝方式以防止意外的数据共享和修改。



标签:int,ShallowCopyExample,C++,对象,拷贝,data,DeepCopyExample
From: https://www.cnblogs.com/keye/p/17913747.html

相关文章

  • C++(STL标准库)
    C++标准模板库(StandardTemplateLibrary,STL)是C++标准库的一部分,提供了一组通用的模板类和函数,包括数据结构和算法,以便开发者能够更容易地实现各种功能。STL的设计目标是提供高性能、灵活和通用的工具,使得开发者能够专注于问题的解决,而不必为数据结构和算法的实现而费心。STL......
  • 刘方舟 VC++面向对象与可视化程序设计 黄维通
    注:由于题目不确定,整理知识点范围比较宽,适当选取1.内联函数     定义:定义在类体内的成员函数,即函数的函数体放在类体内     特点:在调用处用内联函数体的代码来替换,用于解决程序的运行效率问题。一定要在调用之前定义,并且内联函数无法递归调用。2.构造函数与析构......
  • C++U3-第05课-C++语言阶段复习
    复习学习目标 输入输出 分支结构 多分支和switch语句 循环语句 练习1 一维数组  练习 二维数组  字符数组字符串 函数  sort排序  结构体 成绩排序 【题意分析】根据成绩从高到低排序,同成绩学号小的排在前面的顺序进......
  • C++移动构造与std::move()
    背景及问题如下程序所示:#include<iostream>classMyString{public: MyString()=default; MyString(constchar*data) { printf("%s","MyStringConstructed!!\n"); size=strlen(data); m_data=newchar[size]; memcpy(m_data,......
  • 深浅拷贝的区别和实现
    数组的浅拷贝:如果是数组,我们可以利用数组的一些方法,比如slice,concat方法返回一个新数组的特性来实现拷贝,但假如数组嵌套了对象或者数组的话,使用concat方法克隆并不完整,如果数组元素是基本类型,就会拷贝一份,互不影响,而如果是对象或数组,就会只拷贝对象和数组的引用,这样我们无论......
  • C++ 反向遍历 array 小记
    有时候需要逆向循环,例如从字符串的最右端遍历到最左端,需要注意一些细节!初学遇到一些bug记录在这里。首先arr.size()的数据类型为size_t,为无符号整型对于for(intidx=arr.size()-1;idx>=0;idx--):使用int作为idx的类型,有一定概率会编译失败,因为size_t的具......
  • C++U4-第09课-STL容器
    学习目标 STL  栈stack [入栈出栈] 【算法分析】栈的基本操作。【参考代码】#include<bits/stdc++.h>usingnamespacestd;intmain(){stack<int>st;intn;cin>>n;for(inti=1;i<=n;i++){intx;cin......
  • 【面试官版】【持续更新中】融合滤波算法+数据结构+激光视觉SLAM+C++面试题汇总
    C++部分什么时候需要写虚函数、什么时候需要写纯虚函数?只继承接口为纯虚函数强调覆盖父类重写,或者父类也需要实现一定的功能,为虚函数指针传参和引用传参区别?引用传参本质上是传递原参数地址,指针传参本质还是值传递,生成拷贝指针,拷贝指针和原指针指向的为同一块内存。因此改变......
  • 【我们尽量少说废话的讲完】C++红黑树原理
    红黑树的出现红黑树增删改查的时间复杂度都是O(logn)。如果插入的数据随机,那么使用二叉搜索树即可保证树接近平衡。此时增删改查的效率都为O(logN)。但如果插入的数据为有序的,此时二叉搜索树极其不平衡,退化为链表,时间复杂度降为O(N)。而红黑树就是为了应对这种极端情况。红黑......
  • 【纯代码复制粘贴即可使用】卡尔曼滤波的C++实现
    使用Eigen实现卡尔曼滤波。如果实现扩展卡尔曼滤波只需将H矩阵换成雅可比的求解。#ifndef_MYKALMAN_H#define_MYKALMAN_H#include<Eigen\Dense>classKalmanFilter{public:KalmanFilter(intstateSize,intmeasSize,intuSize);~KalmanFilter()=default;......