博客
关于我
复制构造函数与合成复制构造函数
阅读量:787 次
发布时间:2019-03-24

本文共 1761 字,大约阅读时间需要 5 分钟。

复制构造函数与合成复制构造函数

复制构造函数

在C++中,复制构造函数是一种特殊的构造函数,用于利用一个已有的对象来初始化另一个同类型的对象。它通常用于对对象进行拷贝操作。与普通构造函数不同,复制构造函数接受一个本类类型的常引用参数。

复制构造函数的作用

  • 对象的变量初始化:例如 int a = 10; int b = a; 类似地,对象的初始化也可以通过复制实现。例如 point pt1(10, 20); point pt2 = pt1;
  • 成员变量的初始值复制:复制构造函数可以保证新对象的所有成员变量都与原对象完全相同(包括静态成员、常量成员等)。

复制构造函数的定义

复制构造函数的定义形式如下:

类名(const 类名 & obj) {  // 初始化新对象}

例如,对于 Point 类:

class Point {private:  int x, y;public:  Point() : x(0), y(0) {} // 默认构造函数  Point(const Point & r) : x(r.x), y(r.y) {} // 复制构造函数  Point(int a, int b) : x(a), y(b) {} // 带参数构造函数};
  • const限定词:复制构造函数只能接受常引用,以保证传递的对象不会被修改。

复制构造函数的使用场景

  • 显式或隐式拷贝:例如 point pt2 = pt1; 会隐式调用复制构造函数。
  • 函数参数传递:当函数接收类类型的对象时,系统会自动生成一个临时对象副本传递给函数。
  • 返回对象:函数返回类型为对象的函数,会调用复制构造函数生成返回值副本。
  • 数组初始化:使用大括号初始化数组时,会通过复制初始化每个元素。

合成复制构造函数

每个类都有一个复制构造函数。如果类没有定义复制构造函数,编译器会自动生成一个合成复制构造函数。其操作如下:

  • 逐个成员初始化:直接给新对象的每个非静态成员变量赋值。
  • 处理数组成员:合成复制构造函数会将数组中的每个元素逐一复制到新对象中。
  • 处理类类型成员:对于类类型成员,编译器会调用对应的复制构造函数进行复制。
  • 例如,对于一个 Vector<int> 类:

    Vector
    vec1(10);Vector
    vec2 = vec1;

    这里的 vec2 通过复制构造函数生成,并复制了 vec1 的所有成员包括元素值和数组大小。

    深复制与浅复制

  • 浅复制:仅复制对象的成员变量值,不处理外部资源(如堆中的指针)。

    class CA {private:    int a;    char *str;public:    CA(int b, char *cstr) {        a = b;        str = new char[b];        strcpy(str, cstr);    }    CA(const CA & C) {        str = new char[C.a];        strcpy(str, C.str);    }};

    这里的 CA 类成员 str 是通过浅复制实现的,因为动态内存分配 (new) 没有被复制。

  • 深复制:不仅复制成员变量的值,还复制对象相关的资源。

    class CA {private:    int a;    char *str;public:    CA(int b, char *cstr) {        a = b;        str = new char[b];        strcpy(str, cstr);    }    CA(const CA & C) {        a = C.a;        if (str != 0) {            str = new char[a]; // 深复制            strcpy(str, C.str);        }    }};

    这里的 CA 类通过 new 分配内存的成员 str 才进行了深复制。如果 str 由动态内存分配管理,深复制会更加复杂。

  • 通过以上内容,你可以更好地理解复制构造函数及其在C++中的应用。

    转载地址:http://zfwuk.baihongyu.com/

    你可能感兴趣的文章
    Mysql学习总结(49)——从开发规范、选型、拆分到减压
    查看>>
    Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
    查看>>
    Mysql学习总结(50)——Oracle,mysql和SQL Server的区别
    查看>>
    Mysql学习总结(51)——Linux主机Mysql数据库自动备份
    查看>>
    Mysql学习总结(52)——最全面的MySQL 索引详解
    查看>>
    Mysql学习总结(53)——使用MySql开发的Java开发者规范
    查看>>
    Mysql学习总结(54)——MySQL 集群常用的几种高可用架构方案
    查看>>
    Mysql学习总结(55)——MySQL 语句大全再温习
    查看>>
    Mysql学习总结(56)——MySQL用户管理和权限设置
    查看>>
    Mysql学习总结(57)——MySQL查询当天、本周、本月、上周、本周、上月、距离当前现在6个月数据
    查看>>
    Mysql学习总结(58)——深入理解Mysql的四种隔离级别
    查看>>
    Mysql学习总结(59)——数据库分库分表策略总结
    查看>>
    Mysql学习总结(5)——MySql常用函数大全讲解
    查看>>
    Mysql学习总结(60)——并发量大、数据量大的互联网业务数据库设计规范总结
    查看>>
    Mysql学习总结(61)——MySQL优化之DBA级优化整理汇总
    查看>>
    Mysql学习总结(62)——MySQL连接com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link问题
    查看>>
    Mysql学习总结(63)——Mysql数据库架构方案选择与分析
    查看>>
    Mysql学习总结(64)——Mysql配置文件my.cnf各项参数解读
    查看>>
    Mysql学习总结(65)——项目实战中常用SQL实践总结
    查看>>
    Mysql学习总结(66)——设置MYSQL数据库编码为UTF-8
    查看>>