c浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别

c浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别先考虑一种情况,对一个已知对象进行拷贝,编译系统会自动调用一种构造函数——拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。先看一个例子,有一个学生类,数据成员时学生的人数和名字:#include<iostream>usingnam…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

先考虑一种情况,对一个已知对象进行拷贝,编译系统会自动调用一种构造函数——拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。

       先看一个例子,有一个学生类,数据成员时学生的人数和名字:

#include <iostream>  
using namespace std;
 
class Student
{

private:
    int num;
    char *name;
public:
    Student();
    ~Student();
};
 
Student::Student()
{

    name = new char(20);
    cout << “Student” << endl;
 
}
Student::~Student()
{

    cout << “~Student ” << (int)name << endl;
    delete name;
    name = NULL;
}
 
int main()
{

    {// 花括号让s1和s2变成局部对象,方便测试
        Student s1;
        Student s2(s1);// 复制对象
    }
    system(“pause”);
    return 0;
}

c浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别

       执行结果:调用一次构造函数,调用两次析构函数,两个对象的指针成员所指内存相同,这会导致什么问题呢?name指针被分配一次内存,但是程序结束时该内存却被释放了两次,会导致崩溃!

c浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别
       这是由于编译系统在我们没有自己定义拷贝构造函数时,会在拷贝对象时调用默认拷贝构造函数,进行的是浅拷贝!即对指针name拷贝后会出现两个指针指向同一个内存空间。

c浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别

       所以,在对含有指针成员的对象进行拷贝时,必须要自己定义拷贝构造函数,使拷贝后的对象指针成员有自己的内存空间,即进行深拷贝,这样就避免了内存泄漏发生。

        添加了自己定义拷贝构造函数的例子:

#include <iostream>  
using namespace std;
 
class Student
{

private:
    int num;
    char *name;
public:
    Student();
    ~Student();
    Student(const Student &s);//拷贝构造函数,const防止对象被改变
};
 
Student::Student()
{

    name = new char(20);
    cout << “Student” << endl;
 
}
Student::~Student()
{

    cout << “~Student ” << (int)name << endl;
    delete name;
    name = NULL;
}
Student::Student(const Student &s)
{

    name = new char(20);
    memcpy(name, s.name, strlen(s.name));
    cout << “copy Student” << endl;
}
 
int main()
{

    {// 花括号让s1和s2变成局部对象,方便测试
        Student s1;
        Student s2(s1);// 复制对象
    }
    system(“pause”);
    return 0;
}

c浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别

        执行结果:调用一次构造函数,一次自定义拷贝构造函数,两次析构函数。两个对象的指针成员所指内存不同。
 总结:浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。
再说几句:
当对象中存在指针成员时,除了在复制对象时需要考虑自定义拷贝构造函数,还应该考虑以下两种情形:
1.当函数的参数为对象时,实参传递给形参的实际上是实参的一个拷贝对象,系统自动通过拷贝构造函数实现;
2.当函数的返回值为一个对象时,该对象实际上是函数内对象的一个拷贝,用于返回函数调用处。
3.浅拷贝带来问题的本质在于析构函数释放多次堆内存,使用std::shared_ptr,可以完美解决这个问题。

关于std::shared_ptr的原理和实现可参考:C++笔试题之smart pointer的实现

一个完整的自定义类实现可参考:C++笔试题之String类的实现

参考链接:https://www.cnblogs.com/always-chang/p/6107437.html

深拷贝和浅拷贝的区别
16913

深浅拷贝的区别:  浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化…
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188217.html原文链接:https://javaforall.net

(0)
上一篇 2026年4月17日 上午11:04
下一篇 2026年4月17日 上午11:10


相关推荐

  • win7系统测试asp服务器,win7下配置asp服务器

    win7系统测试asp服务器,win7下配置asp服务器win7 下配置 asp 服务器内容精选换一换远程连接 Linux 云服务器报错 Accessdenied 帐号或密码输入错误 SSH 服务端配置了禁止 root 用户登录的策略 帐号或密码输入错误 检查输入的用户名或密码 Linux 云服务器默认用户名 root 如果密码错误 请在控制台重置密码 重置密码 选中待重置密码的云服务器 并选择 操作 列下的 更多 gt 重置密码 检查输入的用户名或 IPv6 的使

    2026年3月17日
    3
  • c和java哪个难_为什么说 C 语言比 Java 难?

    c和java哪个难_为什么说 C 语言比 Java 难?现有答案都提出了各个方面的观点 我觉得很多都挺有道理的 我这里努力总结整理一下 从学习角度上说 很多人认为 C 语言单纯简单 其实比 Java 要容易 我认为 如果要把本质学懂 确实如此 而且在学懂 C 语言的基础上再学 Java 的人往往会获得很好的效果 Java 中由于隐藏了内存分配的处理 反而不如 C 语言在内存管理上来的直观 从应用角度上说 还是 Java 要容易很多的 主要体现在以下几点 内存管理 C 语言需要自己申

    2026年3月18日
    2
  • 【总结】PHP常见面试题汇总(一)。。。

    【总结】PHP常见面试题汇总(一)。。。第 1 题 用 PHP 打印出前一天的时间格式 如 2015 01 2114 42 09 echodate Y m dH i s strtotime 1day 第 2 题 用 PHP 打印出上周的时间格式 如 2015 01 1514 42 09 echodate Y m dH i s strtotime 1w

    2026年3月27日
    1
  • PageHelper详解

    PageHelper详解PageHelperpa 是 mybatis 提供的分页插件 目前支持 Oracle Mysql MariaDB SQLite Hsqldb PostgreSQL 六种数据库 使用方法原始样式 每页显示多条数据 现在的需求是每页显示 4 条数据后端导入依赖依赖 pagehelper 开始分页 Service 方法调用 SQL 查询前添加 PageHelper startPagePag startPage 1 20 这里有两个参数 分别为 page 1 rows 2

    2025年8月5日
    6
  • Linux系统下修改环境变量

    Linux系统下修改环境变量Linux 环境变量设置前言环境变量文件环境变量设置 vim gedit 前言首先呢 环境变量有系统环境变量和用户环境变量 介个系统环境变量影响着整个系统 而用户环境变量也就顾名思义了 就是只对系统里的当前用户生效的 环境变量文件那先来看下介个不好玩的用户环境变量 它主要在以下几个文件中 profile bashrc bash profile bash log

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号