卡码笔记-最强八股文
首页
计算机基础
C++
Java
Go
🔥大模型🔥
  • 大模型面经
  • Java面经
  • C++面经
简历专栏
代码随想录 (opens new window)
首页
计算机基础
C++
Java
Go
🔥大模型🔥
  • 大模型面经
  • Java面经
  • C++面经
简历专栏
代码随想录 (opens new window)
  • 本栏必读

    • 关于本专栏
    • C++学习路线
    • C++面试题系优化
  • 基础与语法

  • 面向对象

    • C++构造函数有几种,分别什么作用?
      • 简要回答
      • 详细回答
      • 知识拓展
    • 什么是构造函数和析构函数?构造函数和析构函数可以是虚函数吗?为什么?
    • C++的重载和重写,以及它们的区别和实现方式
    • C++怎么实现多态
    • C++中的虚函数和纯虚函数有什么区别?
    • 虚函数怎么实现的?
    • 多重继承的优缺点及菱形继承问题
    • 如何禁止一个类被继承
    • 深拷贝和浅拷贝的区别?
    • this指针的原理
    • C++如何实现一个单例模式?
  • STL 与容器

  • 内存管理

  • C++11 与现代 C++

  • 智能指针

  • 并发与 I/O

# 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 性能优化的核心手段,面试几乎必问。

C++构造函数六种类型

# 知识拓展

面试官可能追问:

Q1: 为什么需要移动构造函数?

避免深拷贝临时对象的资源,直接”偷”过来。比如 vector 扩容时,移动构造比拷贝构造快得多,因为只转移指针而不复制整块内存。

Q2: 拷贝构造函数参数为什么必须是 const 引用?

如果是值传递,调用拷贝构造时又要拷贝实参,就无限递归了。加 const 是为了能接受常量对象和临时对象。

Q3: 什么情况下编译器不会自动生成默认构造函数?

只要你手动定义了任何一个构造函数,编译器就不再自动生成默认构造。想要的话得自己写 ClassName() = default;。

Last Updated: 5/23/2026, 4:43:00 PM

← C++中四种类型转换 什么是构造函数和析构函数?构造函数和析构函数可以是虚函数吗?为什么? →

评论

验证登录状态...

侧边栏 侧边栏
夜间模式 夜间
卡码简历 卡码简历
代码随想录 代码随想录
卡码投递表 卡码投递表🔥
2026实习校招群 2026群
添加客服微信 2026实习校招客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记 支持卡码笔记
鼓励/支持/赞赏Carl 卡码笔记赞赏码
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪