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++11中std::thread线程实现暂停(挂起)功能

    要实现线程的暂停或挂起功能,可以利用C++11中提供的条件变量condition_variable。下面是具体的步骤: 首先定义一个互斥锁mutex和条件变量condition_variable,用来实现多个线程之间的互斥和同步操作: std::mutex mtx; std::condition_variable cv; 然后在线程函数中加入while循环,…

    C 2023年5月22日
    00
  • 超详细JavaScript深浅拷贝的实现教程

    让我来为您详细讲解“超详细JavaScript深浅拷贝的实现教程”的完整攻略。 深拷贝和浅拷贝 浅拷贝 浅拷贝指复制对象的引用,而不是它的值。当原始对象中的值改变时,被拷贝的对象中的相应值也会改变。常用的浅拷贝方法有对象展开符…和Object.assign()。 // 对象展开符 const obj = {a: 1, b: 2}; const newOb…

    C 2023年5月23日
    00
  • Win10蓝屏代码0xc0000034怎么办?

    Win10蓝屏代码0xc0000034的解决方法 当Windows10出现蓝屏并显示错误代码0xc0000034时,我们可以按照以下步骤来解决这个问题。 步骤1:检查硬件问题 此错误通常是由于硬件问题引起的。首先,我们需要检查相关硬件是否正常工作,特别是新安装的硬件或故障的硬件。 步骤2:尝试系统修复 在出现蓝屏之后,我们可以尝试使用Windows的自带工具…

    C 2023年5月23日
    00
  • C程序 显示两个区间的阿姆斯特朗数字

    下面我将为你详细讲解“C程序 显示两个区间的阿姆斯特朗数字”的完整使用攻略。 一、程序介绍 这个C程序可以用来显示两个区间之间的阿姆斯特朗数字。阿姆斯特朗数是指一个n位数各位数字的n次幂之和等于该数本身(例如,153是一个阿姆斯特朗数,因为1^3 + 5^3 + 3^3 = 153)。 二、程序使用攻略 下面是使用该程序的步骤: 1. 下载并打开程序 该程序…

    C 2023年5月9日
    00
  • C++控制台用定时器实例代码

    下面我来详细讲解一下在C++控制台中使用定时器的攻略。在实现这一过程中,我们需要按照以下步骤进行: 导入头文件 首先,我们需要在程序中导入头文件 Windows.h #include <Windows.h> 该头文件中定义了控制台运行的一些基本函数,其中就包含了我们需要使用的定时器函数。 创建定时器 使用 SetTimer() 函数创建一个定时器…

    C 2023年5月24日
    00
  • C语言详解strcmp函数的分析及实现

    C语言详解strcmp函数的分析及实现 strcmp函数简介 strcmp()函数是C语言中用于比较两个字符串大小的函数。该函数通常用于在程序中对字符串进行排序、查找或其他处理。 strcmp()函数的定义如下: int strcmp(const char *s1, const char *s2); 该函数接受两个字符串指针参数s1和s2,并返回一个整型值。…

    C 2023年5月23日
    00
  • Linux下编译C程序的过程

    下面我会详细讲解如何在Linux系统下编译C程序的完整攻略,流程如下: 步骤一:安装gcc编译器 打开终端,使用以下命令安装gcc编译器: sudo apt-get update sudo apt-get install gcc 安装完成后可以使用以下命令检验是否安装成功: gcc -v 如果出现版本号信息,则表明安装成功。 步骤二:编写C程序 用文本编辑器…

    C 2023年5月23日
    00
  • C++实现简单五子棋游戏

    C++实现简单五子棋游戏攻略 简介 五子棋是一种非常经典的棋类游戏,如何用C++实现一个简单的五子棋游戏呢?本篇攻略将为大家提供一份完整的实现方案。 步骤 1. 游戏界面 首先,我们需要设计一个游戏界面。可以考虑使用图形界面库来实现,也可以使用控制台进行文字输出。 示例代码: void printBoard(vector<vector<char&…

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