C语言中深拷贝和浅拷贝的区别是什么?

2026-04-17 01:480阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1725个文字,预计阅读时间需要7分钟。

C语言中深拷贝和浅拷贝的区别是什么?

对于基本类型的数据以及简单的对象,它们之间的复制非常简单,主要是按位复制内存。例如:

javaclass Base { public Base() { m_a(0); m_b(0); } public Base(int a, int b) { m_a(a); m_b(b); } private int m_a; private int m_b;}int mai;

对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如:

class Base{ public: Base(): m_a(0), m_b(0){ } Base(int a, int b): m_a(a), m_b(b){ } private: int m_a; int m_b; }; int main(){ int a = 10; int b = a; //拷贝 Base obj1(10, 20); Base obj2 = obj1; //拷贝 return 0; } b 和 obj2 都是以拷贝的方式初始化的,具体来说,就是将 a 和 obj1 所在内存中的数据按照二进制位(Bit)复制到 b 和 obj2 所在的内存,这种默认的拷贝行为就是浅拷贝,这和调用 memcpy() 函数的效果非常类似。

对于简单的类,默认的拷贝构造函数一般就够用了,我们也没有必要再显式地定义一个功能类似的拷贝构造函数。但是当类持有其它资源时,例如动态分配的内存、指向其他数据的指针等,默认的拷贝构造函数就不能拷贝这些资源了,我们必须显式地定义拷贝构造函数,以完整地拷贝对象的所有数据。

阅读全文

本文共计1725个文字,预计阅读时间需要7分钟。

C语言中深拷贝和浅拷贝的区别是什么?

对于基本类型的数据以及简单的对象,它们之间的复制非常简单,主要是按位复制内存。例如:

javaclass Base { public Base() { m_a(0); m_b(0); } public Base(int a, int b) { m_a(a); m_b(b); } private int m_a; private int m_b;}int mai;

对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如:

class Base{ public: Base(): m_a(0), m_b(0){ } Base(int a, int b): m_a(a), m_b(b){ } private: int m_a; int m_b; }; int main(){ int a = 10; int b = a; //拷贝 Base obj1(10, 20); Base obj2 = obj1; //拷贝 return 0; } b 和 obj2 都是以拷贝的方式初始化的,具体来说,就是将 a 和 obj1 所在内存中的数据按照二进制位(Bit)复制到 b 和 obj2 所在的内存,这种默认的拷贝行为就是浅拷贝,这和调用 memcpy() 函数的效果非常类似。

对于简单的类,默认的拷贝构造函数一般就够用了,我们也没有必要再显式地定义一个功能类似的拷贝构造函数。但是当类持有其它资源时,例如动态分配的内存、指向其他数据的指针等,默认的拷贝构造函数就不能拷贝这些资源了,我们必须显式地定义拷贝构造函数,以完整地拷贝对象的所有数据。

阅读全文