# C++构造函数的六种类型及作用
面试官问:”C++构造函数有几种?分别什么作用?”
这题考的是你对对象初始化机制的系统理解。很多人能说出默认构造和拷贝构造,但到移动构造、委托构造、继承构造就含糊了,更别说编译器什么时候自动生成、什么时候不生成。
# 简要回答
C++构造函数主要有六种:默认构造、参数化构造、拷贝构造、移动构造(C++11)、委托构造(C++11)、继承构造(C++11)。
核心区别在于触发时机和资源处理方式不同:默认构造负责零初始化,拷贝构造复制资源,移动构造转移资源所有权,委托构造复用初始化逻辑,继承构造透传基类初始化。
# 详细回答
| 类型 | 形式 | 作用 | 编译器自动生成? |
|---|---|---|---|
| 默认构造 | ClassName() | 无参创建对象,默认初始化 | 未定义任何构造函数时自动生成;定义了其他构造函数后需 = default 显式声明 |
| 参数化构造 | ClassName(int x, ...) | 带参创建对象,指定初始化 | 不会自动生成 |
| 拷贝构造 | ClassName(const ClassName&) | 用已有对象初始化新对象(深/浅拷贝) | 未定义时自动生成(按成员浅拷贝) |
| 移动构造 | ClassName(ClassName&&) | 窃取临时对象资源,避免深拷贝开销 | 未定义拷贝/移动操作且未定义析构时自动生成 |
| 委托构造 | ClassName() : ClassName(0,0) {} | 一个构造函数调用同类其他构造函数,避免重复代码 | 不会自动生成 |
| 继承构造 | using Base::Base; | 派生类直接使用基类构造函数 | 不会自动生成,需 using 声明 |
前四种解决的是”怎么创建对象”,后两种解决的是”怎么复用初始化逻辑”。其中移动构造是 C++11 性能优化的核心手段,面试几乎必问。

# 知识拓展
面试官可能追问:
Q1: 为什么需要移动构造函数?
避免深拷贝临时对象的资源,直接”偷”过来。比如 vector 扩容时,移动构造比拷贝构造快得多,因为只转移指针而不复制整块内存。
Q2: 拷贝构造函数参数为什么必须是 const 引用?
如果是值传递,调用拷贝构造时又要拷贝实参,就无限递归了。加 const 是为了能接受常量对象和临时对象。
Q3: 什么情况下编译器不会自动生成默认构造函数?
只要你手动定义了任何一个构造函数,编译器就不再自动生成默认构造。想要的话得自己写 ClassName() = default;。
评论
验证登录状态...