首页 > 后端开发 > C++ > 正文

构造函数有哪些类型 默认参数化拷贝移动构造对比

P粉602998670
发布: 2025-08-15 19:49:01
原创
418人浏览过

c++++中构造函数分为默认构造、参数化构造、拷贝构造和移动构造四种类型,分别用于无参初始化、自定义初始化、复制对象和高效转移资源;默认构造函数在未定义其他构造函数时由编译器自动生成,参数化构造需手动定义以实现特定初始化,拷贝构造以const引用为参数用于复制对象,移动构造以右值引用为参数通过转移资源提升性能,且应标记noexcept以支持stl优化,若定义了析构函数或拷贝操作则需遵循rule of three/five手动管理资源,合理使用= default可强制生成默认构造,= delete可禁用拷贝构造,而现代编译器可能通过rvo/nrvo优化省略拷贝或移动过程,掌握这些构造函数的区别与使用场景是c++对象生命周期管理的基础。

构造函数有哪些类型 默认参数化拷贝移动构造对比

在C++中,构造函数是用于初始化对象的特殊成员函数。根据用途和参数的不同,构造函数可以分为几种类型。下面详细介绍常见的构造函数类型,并对比默认构造、参数化构造、拷贝构造和移动构造。


一、构造函数的类型

  1. 默认构造函数(Default Constructor)

    • 没有参数,或所有参数都有默认值。
    • 编译器在没有用户定义构造函数时会自动生成一个。
    • 用于创建对象时不传参数的情况。
    class MyClass {
    public:
        MyClass() { /* 初始化 */ }
    };
    登录后复制
  2. 参数化构造函数(Parameterized Constructor)

    • 接收一个或多个参数,用于自定义初始化。
    • 常用于设置对象的初始状态。
    class MyClass {
    public:
        MyClass(int a, int b) : x(a), y(b) {}
    private:
        int x, y;
    };
    登录后复制
  3. 拷贝构造函数(Copy Constructor)

    • 以同类型对象的引用为参数,用于创建新对象并复制原对象的值。
    • 形参通常是
      const T&
      登录后复制
    • 在值传递、返回局部对象、初始化新对象时被调用。
    class MyClass {
    public:
        MyClass(const MyClass& other) {
            x = other.x;
            y = other.y;
        }
    };
    登录后复制
  4. 移动构造函数(Move Constructor)

    • 接收一个右值引用(
      T&&
      登录后复制
      ),将资源“移动”而非复制。
    • 提高性能,避免不必要的深拷贝。
    • 适用于临时对象或
      std::move()
      登录后复制
      的场景。
    class MyClass {
    public:
        MyClass(MyClass&& other) noexcept {
            x = other.x;
            y = other.y;
            other.x = 0;
            other.y = 0; // 原对象资源被“掏空”
        }
    };
    登录后复制

二、四种构造函数的对比

构造函数类型 调用时机 参数形式 是否自动生成 典型用途
默认构造函数 @@######@@ 无参数或全默认值 是(若未定义其他构造) 创建未初始化或默认状态对象
参数化构造函数 @@######@@ 带参数 否(需手动定义) 定制初始化对象
拷贝构造函数 @@######@@
@@######@@
@@######@@ 是(若未定义) 复制已有对象
移动构造函数 @@######@@
@@######@@
@@######@@ 是(若未定义且无自定义拷贝/赋值) 高效转移资源

三、关键区别与注意事项

  • 默认构造函数不一定“什么都不做”,它可能初始化成员为默认值。如果类中定义了其他构造函数,编译器不会自动生成默认构造函数,除非显式声明

    MyClass obj;
    登录后复制

    即构数智人
    即构数智人

    即构数智人是由即构科技推出的AI虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。

    即构数智人 36
    查看详情 即构数智人
    MyClass obj(1, 2);
    登录后复制
  • 拷贝构造 vs 移动构造

    • 拷贝:安全但可能慢(尤其是深拷贝)。
    • 移动:高效,但原对象进入“有效但未定义”状态(通常被置空)。
    • 移动构造应标记
      MyClass obj2 = obj1;
      登录后复制
      ,否则某些STL操作可能不使用它。
  • 隐式调用与显式禁止

    • 可以用
      func(obj);
      登录后复制
      防止参数化构造函数被隐式调用。
    • 不需要拷贝语义的类(如独占资源)应删除拷贝构造:
      const T&
      登录后复制
  • 编译器自动生成规则(Rule of Three / Rule of Five)

    • 如果你定义了析构函数、拷贝构造、拷贝赋值中的任意一个,通常需要手动定义其余。
    • C++11后扩展为 Rule of Five,包括移动构造和移动赋值。

四、示例场景对比

MyClass obj3 = std::move(obj1);
登录后复制

注意:现代编译器常进行 返回值优化(RVO/NRVO),可能直接构造对象,跳过拷贝或移动。


基本上就这些。理解这四种构造函数的使用场景和区别,是掌握C++对象生命周期管理的基础。尤其在涉及资源管理(如指针、文件句柄)时,合理定义拷贝和移动语义至关重要。

return临时对象;
登录后复制
T&&
登录后复制
= default
登录后复制
MyClass() = default; // 强制生成默认构造
登录后复制
noexcept
登录后复制
explicit
登录后复制
MyClass(const MyClass&) = delete;
登录后复制
MyClass a;                    // 调用默认构造
MyClass b(1, 2);              // 调用参数化构造
MyClass c = b;                // 调用拷贝构造
MyClass d = std::move(b);     // 调用移动构造
MyClass e = createTemp();     // 临时对象,通常调用移动构造(或RVO优化)
登录后复制

以上就是构造函数有哪些类型 默认参数化拷贝移动构造对比的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号