C++ 构造函数知识表

1. 基础概念与核心特性

类别内容说明
定义特殊的成员函数,用于对象初始化创建对象
命名规则与类名完全相同区分大小写
返回类型无返回类型(连void都没有)隐式返回对象本身
调用时机对象创建时自动调用无需手动调用
主要职责初始化成员变量、申请资源、执行启动设置确保对象处于有效状态

2. 构造函数分类与语法

类型语法示例用途关键点
默认构造函数ClassName();无参创建对象1. 未定义任何构造函数时编译器自动生成
2. 定义其他构造函数后需显式定义
参数化构造函数ClassName(T1 p1, T2 p2);带参数初始化支持重载,提供多种初始化方式
拷贝构造函数ClassName(const ClassName& other);通过现有对象创建新对象1. 浅拷贝问题
2. 三大法则之一
移动构造函数ClassName(ClassName&& other);"窃取"临时对象资源C++11引入,提升性能
委托构造函数ClassName() : ClassName(0) {}构造函数间调用C++11引入,避免代码重复
继承构造函数using Base::Base;继承基类构造函数C++11引入

3. 初始化相关重要特性

特性语法规则与注意事项
初始化列表ClassName() : m1(v1), m2(v2) {}1. 必须使用:const成员、引用成员、无默认构造的类成员
2. 推荐使用:效率高于构造函数体内赋值
3. 顺序:按成员声明顺序初始化,与列表顺序无关
explicit关键字explicit ClassName(int x);1. 防止单参数构造函数的隐式转换
2. 提高代码安全性
类内初始化int count = 0; std::string name{"default"};C++11引入,提供默认值
默认/删除= default; = delete;显式控制编译器生成行为

4. 编译器行为与自动生成规则

函数类型生成条件默认行为
默认构造函数用户未定义任何构造函数时1. 调用基类默认构造
2. 调用成员默认构造
3. 不初始化内置类型
拷贝构造函数用户未定义拷贝操作时逐成员浅拷贝
拷贝赋值运算符用户未定义拷贝赋值时逐成员浅赋值
移动构造函数用户未定义拷贝/移动/析构时逐成员移动
析构函数用户未定义析构函数时非虚函数,调用基类和成员的析构函数

5. 继承体系中的构造函数

场景调用顺序注意事项
普通继承基类 → 成员对象 → 派生类默认调用基类默认构造函数
显式调用基类构造Derived() : Base(args) {}在初始化列表中指定基类构造函数
虚函数调用构造函数中调用虚函数不会发生多态,调用当前类版本
异常处理基类构造失败整个对象构造失败,派生类部分不会被构造

6. 资源管理与异常安全

原则内容最佳实践
RAII原则资源获取即初始化使用智能指针、容器等RAII对象
三大法则需要自定义析构函数、拷贝构造、拷贝赋值之一时,通常需要三者全部自定义确保资源正确管理
异常安全构造函数中异常的处理1. 使用RAII避免资源泄漏
2. 避免在构造函数中做可能失败的操作
自赋值检查拷贝赋值运算符中的if(this != &other)防止自赋值导致的资源错误

7. 常见误区与陷阱

误区类型问题描述解决方案
缺失默认构造定义带参构造后,无参对象创建失败显式定义默认构造函数
最恼人解析ClassName obj(); 被解析为函数声明使用 ClassName obj;ClassName obj{};
浅拷贝问题指针成员浅拷贝导致重复释放实现深拷贝或使用智能指针
初始化顺序混淆初始化列表顺序与成员声明顺序不一致保持两者顺序一致
未初始化内置类型编译器生成的默认构造不初始化内置类型在初始化列表或类内初始化中显式初始化
委托构造函数循环构造函数间循环委托避免循环委托设计
移动语义未使用应使用移动的场合进行了拷贝定义移动操作,在适当时机使用std::move

8. 编译器特定行为与调试

编译器特性/标志用途
GCC/Clang-Weffc++ -Wreorder -fno-elide-constructors检测准则违反、顺序警告、禁用复制消除
MSVC/W4 __declspec(noinline)提高警告级别、阻止内联用于调试
通用调试__PRETTY_FUNCTION__ (GCC/Clang)
__FUNCSIG__ (MSVC)
获取函数签名用于调试输出

9. 现代C++最佳实践检查清单

检查项说明
是否需要显式定义默认构造函数?特别是定义了其他构造函数后
初始化列表顺序与成员声明顺序是否一致?避免混淆
const成员和引用成员是否正确初始化?必须在初始化列表中初始化
是否需要自定义拷贝控制函数?根据资源管理需求决定
拷贝构造函数是否实现了正确的深拷贝?如类包含原始指针等资源
拷贝赋值运算符是否处理了自赋值?if (this != &other)
基类构造函数是否正确调用?在派生类初始化列表中
是否避免了在构造函数中调用虚函数?不会发生多态行为
资源管理是否使用RAII原则?优先使用智能指针等
单参数构造函数是否标记为explicit?防止意外隐式转换
是否考虑了移动语义的优化?C++11及以上版本
异常安全性是否得到保证?特别是资源申请操作

10. 设计模式与高级用法

模式/用法构造函数角色实现要点
单例模式私有构造函数防止外部实例化,通过静态方法获取实例
工厂模式保护/私有构造函数通过工厂类创建对象,控制构造过程
PImpl惯用法在实现类中正常构造分离接口与实现,减少编译依赖
CRTP基类模板中的构造奇特的递归模板模式,实现编译期多态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值