21xrx.com
2024-12-22 17:37:15 Sunday
登录
文章检索 我的文章 写文章
C++深拷贝示例代码
2023-07-05 08:00:08 深夜i     --     --
C++ 深拷贝 示例代码

C++是一种强大的编程语言,具有高效、安全的特性,深拷贝是C++编程中一个非常重要的概念,可以用来避免程序出现一些意想不到的错误。下面我们来看一下C++深拷贝的示例代码。

深拷贝的概念是指当一个对象被拷贝时,不仅要复制对象本身的所有成员变量,还要将所有成员变量引用的内存都复制一份。这种方式可以避免内存泄露和指针错误等问题。下面是一段C++深拷贝示例代码。


#include <iostream>

#include <cstring>

using namespace std;

class Person {

public:

  Person(char* name, int age) {

    size_t len = strlen(name) + 1;

    this->name = new char[len];

    memcpy(this->name, name, len);

    this->age = age;

  }

  ~Person() {

    if (name != nullptr) {

      delete[] name;

      name = nullptr;

    }

  }

  Person(const Person& other) {

    size_t len = strlen(other.name) + 1;

    this->name = new char[len];

    memcpy(this->name, other.name, len);

    this->age = other.age;

  }

  Person& operator=(const Person& other) {

    if (this != &other) {

      if (name != nullptr) {

        delete[] name;

        name = nullptr;

      }

      size_t len = strlen(other.name) + 1;

      this->name = new char[len];

      memcpy(this->name, other.name, len);

      this->age = other.age;

    }

    return *this;

  }

  char* name;

  int age;

};

int main() {

  char name[] = "Tom";

  Person p1(name, 18);

  Person p2 = p1;

  Person p3(name, 20);

  p2 = p3;

  cout << "p1: " << p1.name << ", " << p1.age << endl;

  cout << "p2: " << p2.name << ", " << p2.age << endl;

  cout << "p3: " << p3.name << ", " << p3.age << endl;

  return 0;

}

以上代码中的Person类表示一个人,包含姓名和年龄两个成员变量,使用了深拷贝的方式来避免指针错误和内存泄露。

在代码中,我们使用new char[]操作来为字符串成员变量name动态分配内存,我们还实现了三个函数:构造函数、拷贝构造函数和赋值运算符。拷贝构造函数和赋值运算符都会将原对象的成员变量进行深拷贝。

在程序的main函数中,我们创建了三个Person类型的对象来测试深拷贝的效果。其中p1和p2对象创建时使用了同样的name字符串,而p2对象的值随后被赋值为p3对象的值,这样我们就可以验证深拷贝的效果了。

输出的结果如下:


p1: Tom, 18

p2: Tom, 20

p3: Tom, 20

可以看到,当我们修改p2对象的值后,并不会影响到p1对象的值,这说明了深拷贝的效果。同时,在程序结束时,我们还特别在Person类的析构函数中释放了成员变量name所占的内存,避免了内存泄露的问题。

以上就是C++深拷贝的示例代码,通过深入理解这个概念,我们可以更好地掌握C++编程的技巧,编写出更安全可靠的程序。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复