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

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

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

复制构造函数

在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/

    你可能感兴趣的文章
    NoSQL数据库概述
    查看>>
    Notadd —— 基于 nest.js 的微服务开发框架
    查看>>
    NOTE:rfc5766-turn-server
    查看>>
    Notepad ++ 安装与配置教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    Notepad++在线和离线安装JSON格式化插件
    查看>>
    notepad++最详情汇总
    查看>>
    notepad++正则表达式替换字符串详解
    查看>>
    notepad如何自动对齐_notepad++怎么自动排版
    查看>>
    Notes on Paul Irish's "Things I learned from the jQuery source" casts
    查看>>
    Notification 使用详解(很全
    查看>>
    NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()
    查看>>
    NotImplementedError: Could not run torchvision::nms
    查看>>
    nova基于ubs机制扩展scheduler-filter
    查看>>
    Now trying to drop the old temporary tablespace, the session hangs.
    查看>>
    nowcoder—Beauty of Trees
    查看>>
    np.arange()和np.linspace()绘制logistic回归图像时得到不同的结果?
    查看>>
    np.power的使用
    查看>>
    NPM 2FA双重认证的设置方法
    查看>>
    npm build报错Cannot find module ‘html-webpack-plugin‘解决方法
    查看>>
    npm build报错Cannot find module ‘webpack/lib/rules/BasicEffectRulePlugin‘解决方法
    查看>>