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

yizhihongxing

深入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日

相关文章

  • 如何用C写一个web服务器之基础功能

    如何用C写一个web服务器之基础功能: 1. 网络编程基础 在进行网络编程前需要了解以下几个关键点: IP地址:每一个联网的设备都需要一个唯一的IP地址,用于在网络中寻址通讯 端口:用于标记进程,通过端口才能访问网络上的进程 TCP协议:面向连接的协议,保证可靠传输,无数据丢失,无数据错误 HTTP协议:基于TCP协议的应用层协议,用于在web上进行数据传输…

    other 2023年6月27日
    00
  • Springboot jpa @Column命名大小写问题及解决

    Springboot JPA @Column命名大小写问题及解决攻略 在使用Spring Boot和JPA进行开发时,@Column注解用于指定实体类属性与数据库表字段的映射关系。然而,有时候在命名属性时可能会遇到大小写问题,导致映射失败。本攻略将详细介绍这个问题以及解决方法,并提供两个示例说明。 问题描述 在默认情况下,JPA使用属性名作为数据库表字段的名…

    other 2023年8月18日
    00
  • APACHE 自定义404错误页面设置方法

    下面我将详细讲解“APACHE 自定义404错误页面设置方法”的完整攻略。 什么是404错误页面 在浏览网页的过程中,我们有时会遇到一个错误提示页面,这个页面就是404错误页面。所谓的404错误就是服务器无法找到请求的资源,通常是由于该资源不存在或路径错误。 如何自定义404错误页面 在APACHE服务器中,可以通过以下步骤来自定义404错误页面。 1.创建…

    other 2023年6月27日
    00
  • Opencv+Python实现缺陷检测

    Opencv+Python实现缺陷检测 Opencv是一个开源的计算机视觉库,提供了许多常用的图像处理函数和算法。Python是一种高级编程语言,能够轻松地使用Opencv进行图像处理和分析。本文将介绍使用Opencv和Python实现缺陷检测的方法。 缺陷检测的原理 缺陷检测是指识别和定位在图像中的缺陷部分。缺陷可以是任何形式的,例如裂纹、凸起、凹陷等等。…

    其他 2023年3月28日
    00
  • UML中类图的四种关系及其代码实现

    下面是“UML中类图的四种关系及其代码实现的完整攻略”,包括类图的基本介绍、四种关系的介绍、代码实现的步骤和两个示例说明。 类图的基本介绍 类图是UML中最常用的图之一,用于表示系统中的类、接口、关系和其它结构。类图可以帮助开发人员更好地理解系统的结构和设计,从而更好地进行开发和维护。 四种关系的介绍 在类图中,有四种基本的关系,分别是: 泛化关系(Gene…

    other 2023年5月5日
    00
  • Python中的作用域规则详解

    Python中的作用域规则详解 在Python中,作用域是指变量的可访问性和可见性范围。了解Python中的作用域规则对于正确理解变量的作用范围和生命周期非常重要。本攻略将详细介绍Python中的作用域规则。 1. 全局作用域 全局作用域是指在整个程序中都可访问的变量。在Python中,全局作用域可以在任何函数内部访问,但需要使用global关键字声明。 示…

    other 2023年8月19日
    00
  • spanwidth无效

    以下是“spanwidth无效”的完整攻略: spanwidth无效 在HTML和CSS中,spanwidth是一种用于设置表格单元格宽度的属性。但是某些情况下,spanwidth可能会无效。本攻略将介绍spanwidth无效的原因和解决方法。 spanwidth无效的因 spanwidth无效的原因可能有以下几种: 单元格中的内容过宽:如果单元格中的内容过…

    other 2023年5月7日
    00
  • Java SSM配置文件案例详解

    下面我将详细讲解”Java SSM配置文件案例详解”的完整攻略。 一、什么是Java SSM Java SSM是一种常见的Java Web开发框架,包含Spring框架、SpringMVC框架和MyBatis框架。其中,Spring框架主要用于实现Java Web应用的非业务逻辑处理,如AOP、IOC等,SpringMVC框架主要用于实现Java Web应用…

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