博客
关于我
复制构造函数与合成复制构造函数
阅读量: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
    查看>>
    MySQL
    查看>>
    mysql
    查看>>
    MTK Android 如何获取系统权限
    查看>>
    MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
    查看>>
    MySQL - ERROR 1406
    查看>>
    mysql - 视图
    查看>>
    MySQL - 解读MySQL事务与锁机制
    查看>>
    MTTR、MTBF、MTTF的大白话理解
    查看>>
    mt_rand
    查看>>
    mysql /*! 50100 ... */ 条件编译
    查看>>
    mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
    查看>>
    mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
    查看>>
    mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
    查看>>
    mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
    查看>>
    MySQL 8.0 恢复孤立文件每表ibd文件
    查看>>
    MySQL 8.0开始Group by不再排序
    查看>>
    mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
    查看>>
    multi swiper bug solution
    查看>>
    MySQL Binlog 日志监听与 Spring 集成实战
    查看>>