C++ 中的深浅拷贝

浅拷贝是逐字节拷贝对象的成员变量 ,这里如果成员变量是指针,很明显,只拷贝了指针储存的地址并没有去拷贝指针指向的值。由此引出了C++中的深浅拷贝。拷贝赋值与拷贝构造类似,这里以拷贝构造为例来说明深浅拷贝。

首先,这里我们有一个类,先不写拷贝构造函数:

cpp 复制代码
#include <iostream>
#include <vector>

class TestClass {
public:
  TestClass(int num)
    : num_{ 1 },
    num_ptr_{ new int(num) }
  {
    std::cout << "default constructor\n";
  }

  ~TestClass() {
    num_ptr_ = nullptr;
    std::cout << "destructor\n";
  }

private:
  int num_;
  int* num_ptr_;
};

int main() {
  int num{ 1 };
  TestClass test_default{ num }; // 默认构造
  TestClass test_move{ test_default };  // 拷贝构造

  std::cout << "Program finished!\n";
  return 0;
}

一个类如果不显示写拷贝构造函数,那么编译器会自动为这个类对象创建一个拷贝构造函数,默认行为是逐字节拷贝对象成员变量,我们看调试结果:

两个对象中num_ptr_地址相同,指向的值相同,这就是浅拷贝。

接着我们补充拷贝构造函数:

cpp 复制代码
// 拷贝构造
TestClass(const TestClass& other)
  : num_{ other.num_ },
  num_ptr_{ new int(*other.num_ptr_) }
{
  std::cout << "copy constructor\n";
}

然后看调试结果:

两个对象中num_ptr_地址不同,指向的值相同,这就是深拷贝。深拷贝确保了两个对象没有共享同一份数据

写了拷贝构造函数以后,编译器不再自动生成,而是调用我们写的拷贝构造函数,具体是深拷贝还是浅拷贝取决于我们写的这个拷贝构造函数。如果我们在这个拷贝构造函数中做了浅拷贝,那么实际上最终还是浅拷贝。

最后贴出完整代码:

cpp 复制代码
#include <iostream>
#include <vector>

class TestClass {
public:
  TestClass(int num)
    : num_{ 1 },
    num_ptr_{ new int(num) }
  {
    std::cout << "default constructor\n";
  }

  // 拷贝构造
  TestClass(const TestClass& other)
    : num_{ other.num_ },
    num_ptr_{ new int(*other.num_ptr_) }
  {
    std::cout << "copy constructor\n";
  }

  ~TestClass() {
    num_ptr_ = nullptr;
    std::cout << "destructor\n";
  }

private:
  int num_;
  int* num_ptr_;
};

int main() {
  int num{ 1 };
  TestClass test_default{ num }; // 默认构造
  TestClass test_move{ test_default };  // 拷贝构造

  std::cout << "Program finished!\n";
  return 0;
}
相关推荐
unicrom_深圳市由你创科技3 小时前
哪些控制逻辑应该放在 PLC,哪些放在上位机?
c++
玖玥拾5 小时前
C/C++ 基础笔记(十三)继承
c语言·c++·继承
ao-weilai6 小时前
C++:哈希表
c++·哈希算法·散列表
汉克老师6 小时前
GESP7级C++考试语法知识(二、指数函数(1、pow() 函数)
c++·指数函数·pow·gesp7级·精度误差
旖-旎6 小时前
FloodFill(图像渲染)(1)
c++·算法·深度优先·力扣
汉克老师7 小时前
GESP2026年3月认证C++六级真题与解析(编程题1 选数)
c++·动态规划·线性dp·gesp六级·状态转移·选与不选
有点。8 小时前
C++倍增法(练习题)
c++·算法
凡人叶枫8 小时前
Effective C++ 条款23:宁以 non-member、non-friend 替换 member 函数
linux·开发语言·c++·嵌入式开发
C语言小火车8 小时前
什么时候用智能指针?什么时候用裸指针?
c语言·c++·学习·指针
玖玥拾9 小时前
C/C++ 基础笔记(十二)友元、运算符重载
c语言·c++·运算符重载·友元