0

0

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

P粉602998670

P粉602998670

发布时间:2025-08-15 19:49:01

|

434人浏览过

|

来源于php中文网

原创

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;

    Frase
    Frase

    Frase是一款出色的长篇 AI 写作工具,快速创建seo优化的内容。

    下载
    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优化)

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

524

2023.09.20

java值传递和引用传递有什么区别
java值传递和引用传递有什么区别

java值传递和引用传递的区别:1、基本数据类型的传递;2、对象的传递;3、修改引用指向的情况。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

108

2024.02.23

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

269

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2023.12.29

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

220

2023.12.07

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

11

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

79

2026.01.18

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

109

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

153

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.5万人学习

Django 教程
Django 教程

共28课时 | 3.3万人学习

Excel 教程
Excel 教程

共162课时 | 12.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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