深入C++拷贝构造函数的总结详解

深入C++拷贝构造函数的总结详解

什么是拷贝构造函数

在 C++ 中,每个类都有至少一个构造函数,负责创建这个类的对象。其中,拷贝构造函数是一种特殊的构造函数,它负责用一个已经存在的对象来初始化一个新的对象。拷贝构造函数的原型为:

类名(const 类名 &obj)

其中,obj 是需要拷贝的对象的引用。

拷贝构造函数的调用时机

当一个对象需要复制到另一个对象时,就会调用该对象的拷贝构造函数。具体包括以下情况:

  1. 当一个对象作为另一个对象的实参进行传递时,拷贝构造函数会被调用。
  2. 当一个对象作为函数返回值进行返回时,拷贝构造函数会被调用。
  3. 当一个对象被另一个对象进行初始化时,拷贝构造函数会被调用。

浅拷贝和深拷贝

拷贝构造函数的实现方式有两种,分别是浅拷贝和深拷贝。它们的区别在于如何复制对象的成员变量。

浅拷贝

浅拷贝就是简单地将源对象的成员变量复制到目标对象中。如果源对象中某个成员变量是一个指针,那么目标对象中的该成员变量将指向与源对象中相同的内存地址。由于两个对象共享同一块内存,因此当其中任何一个对象进行内存释放时,另一个对象的指针也将变为悬空指针。

class ShallowCopy {
public:
    int num;
    char* str;
    ShallowCopy(int n, const char* s) {
        num = n;
        str = new char[strlen(s) + 1];
        strcpy(str, s);
    }
    // 浅拷贝构造函数
    ShallowCopy(const ShallowCopy& obj) {
        num = obj.num;
        str = obj.str;
    }
    ~ShallowCopy() {
        delete[] str;
    }
};

int main() {
    ShallowCopy obj1(1, "Hello");
    ShallowCopy obj2 = obj1;
    // 修改 obj1.str 的值
    obj1.str[0] = 'h';
    cout << obj1.str << endl; // hello
    cout << obj2.str << endl; // hello
    return 0;
}

深拷贝

深拷贝则是将源对象的成员变量复制到一个新的内存地址中,并将目标对象的成员变量指向该内存地址。由于目标对象与源对象的成员变量指向不同的内存地址,因此它们彼此独立,互不干扰。

class DeepCopy {
public:
    int num;
    char* str;
    DeepCopy(int n, const char* s) {
        num = n;
        str = new char[strlen(s) + 1];
        strcpy(str, s);
    }
    // 深拷贝构造函数
    DeepCopy(const DeepCopy& obj) {
        num = obj.num;
        str = new char[strlen(obj.str) + 1];
        strcpy(str, obj.str);
    }
    ~DeepCopy() {
        delete[] str;
    }
};

int main() {
    DeepCopy obj1(1, "Hello");
    DeepCopy obj2 = obj1;
    // 修改 obj1.str 的值
    obj1.str[0] = 'h';
    cout << obj1.str << endl; // hello
    cout << obj2.str << endl; // Hello
    return 0;
}

示例说明

上面的示例说明了浅拷贝和深拷贝的区别。我们先定义了一个 ShallowCopy 类和一个 DeepCopy 类,它们都有一个 num 整型成员变量和一个 str 字符串成员变量。其中,ShallowCopy 类的拷贝构造函数实现了浅拷贝,DeepCopy 类的拷贝构造函数实现了深拷贝。

main 函数中,分别定义了 obj1obj2 对象,并将 obj1 的值赋给了 obj2。然后,我们修改了 obj1str 成员变量的值,并输出了 obj1obj2str 成员变量的值。由于 ShallowCopy 类的拷贝构造函数实现了浅拷贝,因此 obj2str 指针指向了 obj1 中的 str 指针,它们共享同一块内存,因此修改了 obj1.str 的值后,obj2.str 的值也发生了相应的变化;而 DeepCopy 类的拷贝构造函数实现了深拷贝,因此 obj2str 成员变量指向了一个新的内存地址,它们彼此独立,互不干扰,因此修改了 obj1.str 的值后,obj2.str 的值没有发生变化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入C++拷贝构造函数的总结详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • cad出现向程序发送命令时出现问题提示解决方法分享

    CAD出现向程序发送命令时出现问题提示解决方法分享 CAD是一个广泛使用的专业绘图软件,用于制作2D和3D图形。在使用CAD时,可能会遇到一个向程序发送命令时出现问题的错误提示,这会影响我们的工作效率和结果。本篇文章将分享如何解决这个问题。 问题表现 向程序发送命令时出现问题的错误提示可能会表现为以下几种情况: 在命令行中输入命令或点击工具栏的命令按钮时,C…

    其他 2023年3月28日
    00
  • XShell免费版的安装配置教程及使用保姆级教程

    XShell免费版安装配置教程及使用保姆级教程 安装 下载XShell免费版安装包 前往XShell官网下载XShell免费版的安装包。 安装XShell 打开下载的安装包,按照提示完成XShell的安装。 配置 创建一个新的会话 在XShell的菜单栏中选择文件->新建->会话。 在弹出的窗口中,输入远程主机的连接信息,包括主机名、端口号、登录…

    other 2023年6月27日
    00
  • Excel2010表格数据透视表改进和新增功能讲解

    Excel2010表格数据透视表改进和新增功能讲解 介绍 Excel数据透视表是一种快速汇总、分析大批量数据的工具。在Excel 2010中,对数据透视表进行了一些改进和新增功能,让用户更加方便地使用。本文将详细讲解Excel2010表格数据透视表的改进和新增功能。 一、改进的功能 1.1 自动过滤器 Excel 2010中的数据透视表支持一种更高效的数据过…

    other 2023年6月25日
    00
  • js获取本机的外网/广域网ip地址完整源码

    获取本机的外网/广域网IP地址是一个常见的需求,可以通过以下步骤来实现: 使用第三方服务获取IP地址:有一些网站提供了API,可以通过发送HTTP请求获取本机的外网IP地址。其中一个常用的服务是https://api.ipify.org,它返回一个包含IP地址的简单文本响应。 javascript // 使用fetch函数发送HTTP请求获取IP地址 fet…

    other 2023年7月31日
    00
  • vue loadmore 组件滑动加载更多源码解析

    以下是“vue loadmore 组件滑动加载更多源码解析”的完整攻略。 1. 前言 在现代 Web 开发中,无限滚动加载更多已经成为了非常普遍的功能需求。Vue 是一款非常流行的前端框架,它提供了丰富的组件机制,使得开发者能够非常方便地实现无限滚动加载更多功能。 本篇攻略主要介绍一个基于 Vue 的 Loadmore 组件,该组件可以在滑动页面时自动触发加…

    other 2023年6月25日
    00
  • 升级安装Win10正式版后速度慢了 C盘内存明显变小了怎么办?

    升级安装Win10正式版后速度慢了 C盘内存明显变小了的解决攻略 1. 清理临时文件和无用程序 升级安装Windows 10正式版后,系统可能会保留一些临时文件和无用程序,导致系统速度变慢并占用C盘内存。以下是清理临时文件和无用程序的步骤: 打开“设置”应用程序(Win键+I),然后点击“系统”。 在左侧导航栏中选择“存储”。 在“存储”页面中,点击“本机存…

    other 2023年8月2日
    00
  • Performance 内存监控使用技巧详解

    Performance 内存监控使用技巧详解 在软件开发和系统管理中,监控内存的使用情况对于性能优化和故障排查非常重要。本攻略将详细介绍一些内存监控的使用技巧,帮助您更好地理解和优化系统的内存使用。 1. 监控内存使用的工具 1.1 top 命令 top 命令是一个常用的命令行工具,用于实时监控系统的各项指标,包括内存使用情况。以下是使用 top 命令监控内…

    other 2023年8月2日
    00
  • 魔兽世界6.1武僧t天赋属性选择 wow6.1武僧t输出手法详情

    魔兽世界6.1武僧t天赋属性选择 作为一名武僧T,选择合适的天赋属性是非常重要的,它能够显著地提升你的生存能力、输出能力等核心指标。下面就为大家详细讲解魔兽世界6.1武僧t天赋属性选择的攻略。 选择天赋 针对魔兽世界6.1武僧t,我们推荐的天赋选择方案是:[2,1,3]。其中,”2″是气定神闲天赋,它能够提高你的闪避率,从而增加你的生存能力;”1″是玄秘掌天…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部