0

0

c++ 深拷贝和浅拷贝 c++拷贝构造函数教程

下次还敢

下次还敢

发布时间:2025-12-03 14:38:52

|

936人浏览过

|

来源于php中文网

原创

深拷贝会为新对象分配独立内存并复制数据,确保对象间不共享资源;浅拷贝仅复制指针值,导致多个对象共享同一内存,可能引发重复释放问题。当类含有动态内存指针时,必须实现深拷贝以避免崩溃,同时遵循“三大法则”:若需析构函数、拷贝构造函数或赋值操作符之一,通常三者均需自定义。

c++ 深拷贝和浅拷贝 c++拷贝构造函数教程

在C++中,深拷贝浅拷贝是理解对象复制行为的关键概念,尤其在涉及动态内存或资源管理时。它们的区别直接影响程序的稳定性与正确性。当你使用拷贝构造函数或赋值操作符时,如果不特别处理,默认情况下会进行浅拷贝,这可能导致多个对象共享同一块内存,从而引发崩溃或数据错误。

什么是浅拷贝?

浅拷贝是指只复制对象中的成员变量值,对于指针类型,仅复制指针本身(即地址),而不复制它所指向的数据。这意味着两个对象的指针将指向同一块堆内存。

例如:

class String {
private:
    char* data;
public:
    String(const char* str) {
        data = new char[strlen(str) + 1];
        strcpy(data, str);
    }
// 默认拷贝构造函数执行的是浅拷贝
// String(const String& other) { data = other.data; } // 危险!

};

立即学习C++免费学习笔记(深入)”;

如果未定义拷贝构造函数,编译器生成的默认版本会直接复制data指针。当两个String对象析构时,都会调用delete[] data;,导致同一块内存被释放两次,程序崩溃。

什么是深拷贝?

深拷贝会为新对象分配新的内存空间,并把原对象的数据完整复制过去,确保两个对象完全独立。

正确的做法是自定义拷贝构造函数:

Play.ht
Play.ht

根据文本生成多种逼真的语音

下载
String(const String& other) {
    if (other.data) {
        data = new char[strlen(other.data) + 1];
        strcpy(data, other.data);
    } else {
        data = nullptr;
    }
}

这样每个对象都有自己的内存副本,析构时互不影响。这是实现“值语义”的关键。

什么时候需要深拷贝?

当你类中包含以下情况时,必须手动实现深拷贝:

  • 有指针成员指向动态分配的内存
  • 需要保证对象之间数据独立
  • 防止多次释放同一内存
  • 实现安全的值传递或返回局部对象

同时,遵循“三大法则”:如果需要析构函数、拷贝构造函数、拷贝赋值操作符中的任意一个,通常三个都需要自己定义。

拷贝构造函数基本语法

拷贝构造函数是一种特殊的构造函数,用于从已存在的对象创建新对象:

ClassName(const ClassName& other);

它会在以下场景被调用:

  • 用一个对象初始化另一个对象:String s2 = s1;
  • 函数参数传值传递对象
  • 函数返回一个局部对象(某些情况下)

记得加上const引用,避免意外修改原对象,也支持常量对象的拷贝。

基本上就这些。掌握深拷贝和浅拷贝的区别,能帮你写出更安全的C++代码。不复杂但容易忽略。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

524

2023.09.20

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

391

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

java值传递和引用传递有什么区别
java值传递和引用传递有什么区别

java值传递和引用传递的区别:1、基本数据类型的传递;2、对象的传递;3、修改引用指向的情况。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

107

2024.02.23

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

269

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2023.12.29

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webpack4.x---十天技能课堂
Webpack4.x---十天技能课堂

共20课时 | 1.4万人学习

Bootstrap4.x---十天精品课堂
Bootstrap4.x---十天精品课堂

共22课时 | 1.6万人学习

ECMAScript6 / ES6---十天技能课堂
ECMAScript6 / ES6---十天技能课堂

共25课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号