C/C++ 浅拷贝和深拷贝的实例详解

针对题目“C/C++ 浅拷贝和深拷贝的实例详解”,我将为您提供一份完整的攻略。

什么是拷贝

在程序设计中,我们经常使用拷贝操作,将一个对象的内容复制到另一个对象中。在C/C++中,拷贝操作可以是浅拷贝或深拷贝,两者的区别在于拷贝时是否复制该对象所指向的堆内存。

浅拷贝

浅拷贝(Shallow Copy)是指拷贝一个对象时,只复制其值及其指针,而不会复制指针所指向的内存,因此拷贝完成后的对象和原对象会共享同一块内存。

示例1

#include <iostream>
using namespace std;

class Person {
public:
    int age;
    char *name;

    Person(int age, char *name) {
        this->age = age;
        this->name = name;
    }

    void display() {
        cout << "age: " << age << endl;
        cout << "name: " << name << endl;
    }
};

int main() {
    char *name = "John";
    Person p1(18, name);
    p1.display();

    Person p2 = p1; // 浅拷贝
    p2.display();

    // 修改p1的name
    p1.name[0] = 'M';

    p1.display();
    p2.display();

    return 0;
}

在上面的代码中,我们定义了一个Person类,其中有两个成员变量agename。我们创建了一个名为p1Person对象,并将其名字设置为"John"。然后我们对p1进行了浅拷贝操作,将其赋值给了一个新的Person对象p2。接下来,我们修改了p1的名字为"Mohn",输出p1p2的信息,得到的结果如下:

age: 18
name: John
age: 18
name: John
age: 18
name: Mohn
age: 18
name: Mohn

可以看到,修改了p1的姓名之后,p2的名字也跟着改变了,这就是浅拷贝的特点。

深拷贝

深拷贝(Deep Copy)是指拷贝一个对象时,不仅复制其值及其指针,还会复制指针所指向的内存,因此最终得到的对象和原对象所指向的内存地址不同。

示例2

#include <iostream>
#include <cstring>
using namespace std;

class Person {
public:
    int age;
    char *name;

    Person(int age, char *name) {
        this->age = age;
        this->name = new char[strlen(name) + 1];
        strcpy(this->name, name);
    }

    Person(const Person &p) { // 深拷贝
        age = p.age;
        name = new char[strlen(p.name) + 1];
        strcpy(name, p.name);
    }

    void display() {
        cout << "age: " << age << endl;
        cout << "name: " << name << endl;
    }

    ~Person() {
        delete[] name;
    }
};

int main() {
    char *name = "John";
    Person p1(18, name);
    p1.display();

    Person p2 = p1; // 深拷贝
    p2.display();

    // 修改p1的name
    p1.name[0] = 'M';

    p1.display();
    p2.display();

    return 0;
}

在上面的代码中,我们对Person类进行了修改,添加了一个拷贝构造函数,用于实现深拷贝。然后我们创建了一个名为p1Person对象,并将其名字设置为"John"。然后我们对p1进行了深拷贝,将其赋值给了一个新的Person对象p2。接下来,我们 修改了p1的名字为"Mohn",输出p1p2的信息,得到的结果如下:

age: 18
name: John
age: 18
name: John
age: 18
name: Mohn
age: 18
name: John

可以看到,修改了p1的姓名之后,p2的名字并没有跟着改变,这是因为p1p2指向的是不同的地址,它们之间不存在共享的情况。

小结

以上是关于浅拷贝和深拷贝的实例详解,浅拷贝只是简单地对指针进行复制,导致不同的对象指向了同一块内存地址,而深拷贝则是将指针所指向的内存一同进行复制,保证复制出来的对象是独立的。在实际的开发过程中,为了避免这样的错误,我们应该尽量使用深拷贝。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++ 浅拷贝和深拷贝的实例详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++实现动态规划过程详解

    C++实现动态规划过程详解 什么是动态规划 动态规划是一种通过把问题划分为相互重叠的子问题来解决复杂问题的算法。它的主要思想是将原问题分解为一些子问题,通过计算和储存子问题的答案来逐步推导出原问题的解。通常用于解决最优化问题。 动态规划有很多经典的问题,在实际工程中也有很多应用。C++是一种常用的编程语言,下面就是C++实现动态规划的过程详解。 动态规划过程…

    C 2023年5月23日
    00
  • JavaScript数据结构中栈的应用之表达式求值问题详解

    JavaScript数据结构中栈的应用之表达式求值问题详解 背景 在JavaScript中,算术表达式很常见,例如 (2 + 3) * 4 – 8 / 2。对于一个算术表达式,我们需要将它转化为一个数值。要对表达式求值,我们需要确定运算符优先级和结合性。其中,左结合表示从左到右计算,右结合表示从右到左计算。 步骤 我们可以用栈来求一个表达式的值。具体的求值过…

    C 2023年5月22日
    00
  • C语言字符串快速压缩算法代码

    C语言字符串快速压缩算法代码攻略 前置知识 在学习C语言字符串快速压缩算法代码之前,需要掌握以下知识: C语言基础知识,包括数据类型、变量、数组、函数等 指针的基本概念和用法 位运算的概念和用法 基本的压缩算法知识 快速压缩算法核心原理 快速压缩算法的核心原理在于用少量的空间存储尽可能多的信息。在字符串压缩中,我们可以利用位运算来压缩数据,将多个字符压缩成一…

    C 2023年5月22日
    00
  • C++ 实现2048游戏示例

    C++ 实现2048游戏示例攻略 1. 简介 2048是一个深受欢迎的数字游戏,我们可以使用C++语言实现这个游戏。在本文中,我们将深入了解如何用C++实现一个完整的2048游戏。 2. 程序设计思路 我们可以使用C++语言中的面向对象思想来实现2048游戏。对于每个数字方块,可以定义一个方块类,类中包含了每个方块所需要的数据和方法。每个方块都有自己的数字数…

    C 2023年5月23日
    00
  • Vscode配置C/C++环境使用minGW(保姆级配置过程)

    下面是Vscode配置C/C++环境使用MinGW的详细攻略。 安装MinGW 前往MinGW官网(https://sourceforge.net/projects/mingw/files/)下载MinGW安装包,推荐下载mingw-get-inst版本。下载的时候要注意选择对应的Windows系统版本(32位或64位)。 双击安装包,进入安装向导,按照默认…

    C 2023年5月23日
    00
  • JSON在PHP中的应用介绍

    下面是“JSON在PHP中的应用介绍”的完整攻略。 什么是JSON JSON(JavaScript Object Notation),是一种轻量级的数据交换格式。它以易于读写的文本格式为基础,被用来传输和储存数据。 JSON数据可以用代码轻松地从不同的语言传递和访问,例如从PHP中传递JSON数据给JavaScript代码,从JavaScript代码中传递J…

    C 2023年5月23日
    00
  • VS中的scanf_s函数和scanf用法及说明

    VS中的scanf_s函数和scanf用法及说明 1. scanf函数 scanf() 是 C 语言的标准输入函数,可用来接收用户输入的数据。该函数原型为: scanf(const char *format, …) 其中,format 为格式化字符串,”…” 表示可变参数,即可以接受任意个数的参数。 我们可以通过 scanf() 函数来接收用户输入的…

    C 2023年5月23日
    00
  • C程序 Hello World

    下面就为大家详细讲解一下C程序 HelloWorld的完整使用攻略。 1. 创建C程序 首先,我们需要在本地电脑上安装C语言编译器。常用的编译器有GCC、Clang等,其中GCC是最为常见的一个编译器。 在Windows上安装GCC编译器 下载MinGW安装包(http://www.mingw.org/),并按照提示安装。 将MinGW的bin目录加入到系统…

    C 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部