博客
关于我
复制构造函数与合成复制构造函数
阅读量: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 主从 lock_mysql 主从同步权限mysql 行锁的实现
    查看>>
    mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
    查看>>
    mysql 主从关系切换
    查看>>
    mysql 主键重复则覆盖_数据库主键不能重复
    查看>>
    Mysql 优化 or
    查看>>
    mysql 优化器 key_mysql – 选择*和查询优化器
    查看>>
    MySQL 优化:Explain 执行计划详解
    查看>>
    Mysql 会导致锁表的语法
    查看>>
    mysql 使用sql文件恢复数据库
    查看>>
    mysql 修改默认字符集为utf8
    查看>>
    Mysql 共享锁
    查看>>
    MySQL 内核深度优化
    查看>>
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>
    mysql 分组统计SQL语句
    查看>>
    Mysql 分页
    查看>>
    Mysql 分页语句 Limit原理
    查看>>
    MySQL 创建新用户及授予权限的完整流程
    查看>>