博客
关于我
复制构造函数与合成复制构造函数
阅读量: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/

    你可能感兴趣的文章
    Postgresql中PL/pgSQL代码块的语法与使用-声明与赋值、IF语句、CASE语句、循环语句
    查看>>
    Postgresql中PL/pgSQL的游标、自定义函数、存储过程的使用
    查看>>
    Postgresql中的表结构和数据同步/数据传输到Mysql
    查看>>
    Postgresql中自增主键序列的使用以及数据传输时提示:错误:关系“xxx_xx_xx_seq“不存在
    查看>>
    postgreSQL入门命令
    查看>>
    PostgreSQL删除数据库报"ERROR: There is 1 other session using the database."
    查看>>
    Qt开发——爱情公寓人事管理系统
    查看>>
    PostgreSQL和Oracle两种数据库有啥区别?如何选择?
    查看>>
    Postgresql在Windows中使用pg_dump实现数据库(指定表)的导出与导入
    查看>>
    PostgreSQL在何处处理 sql查询之四
    查看>>
    postgresql基本使用
    查看>>
    PostgreSQL学习总结(10)—— PostgreSQL 数据库体系架构
    查看>>
    PostgreSQL学习总结(11)—— PostgreSQL 常用的高可用集群方案
    查看>>
    Qt开发——多线程网络时间客户端
    查看>>
    PostgreSQL学习总结(13)—— PostgreSQL 15.8 如何成就数据库性能王者?
    查看>>
    PostgreSQL学习总结(13)—— PostgreSQL 目录结构与配置文件 postgresql.conf 详解
    查看>>
    PostgreSQL学习总结(1)—— PostgreSQL 入门简介与安装
    查看>>
    PostgreSQL学习总结(2)—— PostgreSQL 语法
    查看>>
    PostgreSQL学习总结(3)—— PostgreSQL 数据类型
    查看>>
    Qt开发——圆面积计算器
    查看>>