标签题目
C++相关面试题
C++ 虚函数是什么?
考察 C++ 运行时多态的实现和边界,重点是 virtual、vptr/vtable、动态绑定、虚析构和构造析构阶段规则。
C++ new 操作的原理是什么?
考察 C++ 对象创建和释放的两阶段语义,重点是 operator new 分配原始内存、构造函数初始化、异常回滚和 delete 对称释放。
内存对齐的作用是什么?
考察内存布局和硬件访问效率,重点是对齐规则、padding 来源、结构体大小、缓存友好性和 ABI 兼容风险。
C++ 和 Java 的主要区别是什么?
考察语言对比是否能上升到运行时、内存资源、类型模型、性能控制、工程生态和适用场景,而不是停留在语法差异。
C++ 基类析构函数为什么通常要声明为虚函数?
C++ 基类析构函数通常要声明为虚函数,是为了保证通过基类指针或引用删除派生类对象时,能先调用派生类析构函数,再调用基类析构函数,完整释放派生类资源。否则行为可能未定义,容易造成资源泄漏或清理不完整。
C++ 如何限制类对象只能在堆上或栈上创建?
C++ 限制对象只能在堆上或栈上创建,本质是控制构造、析构和释放入口。只能堆上创建通常把析构函数设为 private 或 protected,并提供 destroy 接口;只能栈上创建通常禁用 operator new 和 operator new[],阻止动态分配。
cpp的虚函数以及实现原理?
虚函数是 C++ 实现运行时多态的核心机制。它允许通过基类指针或引用调用派生类重写后的函数,把调用哪个函数的决定从编译期推迟到运行期。主流编译器通常通过虚函数表和对象中的虚表指针实现:多态类有虚表,对象保存指向虚表的指针,虚调用时先取虚表指针,再按固定槽位找到函数地址并间接调用。
C++多态怎么实现?
C++ 多态本质上是同一接口在不同类型上表现出不同行为。它分为编译期多态和运行期多态:编译期多态由函数重载、运算符重载、模板等在编译阶段完成选择;运行期多态依赖 virtual 虚函数、继承、重写以及基类指针或引用,在程序运行时根据对象真实类型进行动态绑定。回答不能只停留在虚函数表四个字,还要讲清楚触发条件、对象内存模型、构造析构规则、虚析构必要性、对象切片和多继承下的边界问题。
给定数组指针,如何访问第 50 个元素?
这道题考察的是数组下标、指针运算和数组指针类型的边界理解。核心回答应先澄清“第50位”通常指第50个元素,因此数组从 0 开始计数时应访问 arr[49],若给的是首元素指针则写成 *(p + 49)。如果题目说的是下标 50,则对应 arr[50],也就是第 51 个元素。
指针函数和函数指针的区别?
指针函数和函数指针的核心区别在于“谁是指针”。指针函数本质仍然是函数,只是返回值类型是指针;函数指针本质是指针变量,只是它保存的是某个函数的入口地址。区分它们时,重点看括号优先级、标识符先和谁结合,以及后续是被调用还是被赋值保存函数地址。
虚函数和纯虚函数有什么区别?
虚函数用于运行期多态,纯虚函数用于定义必须由派生类实现的抽象接口。回答要区分语法、是否可实例化、默认实现、虚表机制和析构函数场景。
const function(const) const 中三个 const 分别有什么区别?
const function(const) const 这类题考的是 const 出现在返回值、参数和成员函数尾部时的不同约束。回答要把修饰对象说清楚,而不是笼统说都是不可变。
内存中的堆和栈有什么区别?
堆和栈的区别?这道腾讯牛客题的关键是围绕“内存堆与栈区别”讲清概念、机制、取舍和边界。内存中的栈主要保存函数调用帧、局部自动变量、返回地址和寄存器保存信息,生命周期随函数调用自动管理;堆用于动态分配对象,生命周期由 malloc/free、new/delete 或运行时 GC 管理。
C++ 指针和引用有什么区别?
C++ 指针和引用有什么区别?这道腾讯牛客题的关键是围绕“C++ 指针与引用语义”讲清概念、机制、取舍和边界。C++ 指针和引用都能间接访问对象,但语义不同。指针是一个可重新赋值的对象,可以为空,可以参与地址运算;引用更像对象别名,初始化后通常不能改绑,也不应为空。
C++ 虚函数和虚函数表的实现原理是什么?
C++ 虚函数和虚函数表的实现原理是什么?这道腾讯牛客题的关键是围绕“C++ 虚函数与虚表实现”讲清概念、机制、取舍和边界。C++ 虚函数通常通过 vptr 和 vtable 实现。含虚函数的对象里有虚表指针,指向所属动态类型的虚函数表;通过基类指针或引用调用虚函数时,运行时按 vtable 槽位找到最终覆盖的函数。
动态库和静态库有什么区别?
动态库和静态库有什么区别?这道腾讯牛客题的关键是围绕“静态库与动态库的链接和装载差异”讲清概念、机制、取舍和边界。静态库和动态库的核心区别在代码进入进程的时机和共享方式。静态库在链接阶段把目标代码复制进可执行文件,运行时不再依赖该库文件;动态库在装载或运行时由动态链接器映射进进程,可被多个进程共享同一份只读代码页。
c++程序从编译到可执行文件的流程?
c++程序从编译到可执行文件的流程?这道腾讯牛客题的关键是围绕“C++ 从源码到可执行文件的构建链路”讲清概念、机制、取舍和边界。C++ 程序从源码到可执行文件通常经过预处理、编译、汇编和链接四个阶段。预处理展开头文件和宏,编译把翻译单元转成汇编或中间表示并做语义检查,汇编生成目标文件,链接解析符号并合并目标文件和库。
C++ map底层数据结构?
C++ map底层数据结构?这道腾讯牛客题的关键是围绕“std::map 底层结构与复杂度”讲清概念、机制、取舍和边界。C++ `std::map` 通常基于红黑树这类自平衡二叉搜索树实现,元素按 key 有序存储。查找、插入和删除的复杂度通常是 O(log n),迭代时能按 key 顺序遍历。
内存中堆和栈有什么区别?
内存中堆和栈有什么区别?这道腾讯牛客题的关键是围绕“内存堆与栈区别”讲清概念、机制、取舍和边界。内存中的栈主要保存函数调用帧、局部自动变量、返回地址和寄存器保存信息,生命周期随函数调用自动管理;堆用于动态分配对象,生命周期由 malloc/free、new/delete 或运行时 GC 管理。
C++的vector跟Java的ArrayList的区别?
C++的vector跟Java的ArrayList的区别?这道腾讯牛客题的关键是围绕“C++ vector 与 Java ArrayList 对比”讲清概念、机制、取舍和边界。C++ vector 和 Java ArrayList 都是动态数组,但 vector 存放的是元素本身并通过模板在编译期确定类型;ArrayList 底层是 Object[] 引用数组,泛型有类型擦除,基本类型需要装箱成对象。
stl vector push_back() 的复杂度?
stl vector push_back() 的复杂度?这道腾讯牛客题的关键是围绕“std::vector::push_back 复杂度与扩容”讲清概念、机制、取舍和边界。std::vector::push_back 的均摊时间复杂度是 O(1),但单次操作在容量不足触发扩容时可能是 O(n)。扩容需要申请更大的连续内存,把已有元素移动或拷贝过去,再插入新元素。
list和vector实现有什么区别?
list和vector实现有什么区别?这道腾讯牛客题的关键是围绕“C++ list 与 vector 实现差异”讲清概念、机制、取舍和边界。C++ `vector` 是连续动态数组,支持 O(1) 随机访问,尾插摊还 O(1),中间插删需要移动元素;`list` 是双向链表,不支持随机访问,已知位置插入删除 O(1),但查找位置和遍历通常 O(n)。
char arr[20]和char *p = new char[20]的区别?
char arr[20]和char *p = new char[20]的区别?这道腾讯牛客题的关键是围绕“栈数组与堆数组的生命周期和所有权”讲清概念、机制、取舍和边界。char arr[20] 和 char *p = new char[20] 都能表示 20 个 char 的连续空间,但生命周期、存储位置和所有权不同。arr 通常是自动存储期对象,离开作用域自动释放;new char[20] 在自由存储区分配,p 只是指向这块内存的指针,需要 delete[] 释放。
stl的list和vector有什么区别?
stl的list和vector有什么区别?这道腾讯牛客题的关键是围绕“C++ list 与 vector 实现差异”讲清概念、机制、取舍和边界。C++ `vector` 是连续动态数组,支持 O(1) 随机访问,尾插摊还 O(1),中间插删需要移动元素;`list` 是双向链表,不支持随机访问,已知位置插入删除 O(1),但查找位置和遍历通常 O(n)。
C和C++有什么区别?
C和C++有什么区别?这道腾讯牛客题的关键是围绕“C 与 C++ 差异”讲清概念、机制、取舍和边界。C 更偏过程式语言,核心是函数、结构体、指针和手动资源管理;C++ 在兼容大量 C 能力的基础上加入类、封装、继承、多态、模板、STL、异常、命名空间和 RAII,支持过程式、面向对象、泛型和资源管理抽象。
C++程序编译过程,哪几步?
C++程序编译过程,哪几步?这道腾讯牛客题的关键是围绕“C++ 从源码到可执行文件的构建链路”讲清概念、机制、取舍和边界。C++ 程序从源码到可执行文件通常经过预处理、编译、汇编和链接四个阶段。预处理展开头文件和宏,编译把翻译单元转成汇编或中间表示并做语义检查,汇编生成目标文件,链接解析符号并合并目标文件和库。
Go和C++有什么区别?
Go和C++有什么区别?这道腾讯牛客题的关键是围绕“语言差异与工程边界对比”讲清概念、机制、取舍和边界。比较 C、C++ 或 Go 和 C++ 时,不能只列语法差异。要从抽象能力、内存管理、类型系统、运行时、并发模型、构建部署和性能控制这些工程边界展开。
RAII 和智能指针的原理是什么?
RAII 和智能指针的原理是什么?这道腾讯牛客题的关键是围绕“C++ 智能指针与内存泄漏治理”讲清概念、机制、取舍和边界。智能指针通过 RAII 把堆对象生命周期绑定到对象析构,能减少忘记 delete、异常路径提前返回和重复释放导致的问题。unique_ptr 表达独占所有权,shared_ptr 表达共享所有权,weak_ptr 用来观察对象并打破 shared_ptr 循环引用。
stl map是如何实现的?
stl map是如何实现的?这道腾讯牛客题的关键是围绕“std::map 底层结构与复杂度”讲清概念、机制、取舍和边界。C++ `std::map` 通常基于红黑树这类自平衡二叉搜索树实现,元素按 key 有序存储。查找、插入和删除的复杂度通常是 O(log n),迭代时能按 key 顺序遍历。
C++11有哪些新特性?
C++11有哪些新特性?这道腾讯牛客题的关键是围绕“C++11 常用新特性与解决的问题”讲清概念、机制、取舍和边界。C++11 的常用新特性包括 auto、range-for、lambda、右值引用和移动语义、智能指针、nullptr、constexpr、线程库、统一初始化和 unordered 容器。回答时要说这些特性分别解决什么问题。
C++面向对象的特性?
C++面向对象的特性?这道腾讯牛客题的关键是围绕“C++ 面向对象特性”讲清概念、机制、取舍和边界。C++ 面向对象常讲封装、继承和多态。封装把数据和行为组织成类并控制访问;继承复用和扩展基类接口;多态通过虚函数让基类指针或引用在运行时调用派生类实现。
C++ 中 auto_ptr 和 shared_ptr 有什么区别?
C++ 中 auto_ptr 和 shared_ptr 有什么区别?这道腾讯牛客题的关键是围绕“auto_ptr 与 shared_ptr 所有权语义”讲清概念、机制、取舍和边界。auto_ptr 和 shared_ptr 的核心差异是所有权语义。auto_ptr 拷贝会转移所有权,源指针变空,语义危险且已废弃并从现代 C++ 移除;shared_ptr 使用控制块和引用计数共享所有权,最后一个引用释放时删除对象。
C++11 有哪些常用新特性?
C++11 有哪些常用新特性?这道腾讯牛客题的关键是围绕“C++11 常用新特性与解决的问题”讲清概念、机制、取舍和边界。C++11 的常用新特性包括 auto、range-for、lambda、右值引用和移动语义、智能指针、nullptr、constexpr、线程库、统一初始化和 unordered 容器。回答时要说这些特性分别解决什么问题。
同公司岗位有 2 条面经记录
C++ 命名空间的作用和使用方式是什么?
C++ 命名空间的作用和使用方式是什么?这道腾讯牛客题的关键是围绕“C++ 命名空间的作用和使用方式”讲清概念、机制、取舍和边界。C++ 命名空间用于组织符号并避免命名冲突。库、业务模块和第三方依赖都可能定义同名类或函数,把它们放在不同 namespace 下,可以通过限定名明确访问。
C++ 的继承机制有哪些类型和访问控制规则?
C++ 的继承机制有哪些类型和访问控制规则?这道腾讯牛客题的关键是围绕“C++ 继承类型与访问控制”讲清概念、机制、取舍和边界。C++ 继承包括单继承、多继承和虚继承;继承访问控制有 public、protected、private,决定基类 public/protected 成员在派生类中的可见级别。
C++ 运行时多态如何确定调用哪个派生类函数?
C++ 运行时多态如何确定调用哪个派生类函数?这道腾讯牛客题的关键是围绕“C++ 运行时多态派发”讲清概念、机制、取舍和边界。C++ 运行时多态通过虚函数实现:通过基类指针或引用调用 virtual 函数时,运行时根据对象的动态类型查虚函数表,调用最终覆盖的派生类函数。
std::vector、std::list 和 std::map 的底层结构有什么区别?
std::vector、std::list 和 std::map 的底层结构有什么区别?这道腾讯牛客题的关键是围绕“std::vector、std::list 与 std::map 底层结构”讲清概念、机制、取舍和边界。std::vector 是连续动态数组,std::list 是双向链表,std::map 通常是红黑树这类自平衡有序树。三者的差异不只是 API,而是随机访问、插入删除、范围查询、内存局部性和迭代器失效规则不同。
C++11 中智能指针相关的新特性是什么?
C++11 中智能指针相关的新特性是什么?这道腾讯牛客题的关键是围绕“C++11 智能指针新特性”讲清概念、机制、取舍和边界。C++11 引入并标准化了 unique_ptr、shared_ptr、weak_ptr、make_shared 等智能指针能力,用 RAII 表达资源所有权,替代危险的 auto_ptr 拷贝转移语义。
std::vector::resize 的作用是什么,它如何影响 size、capacity 和元素构造?
std::vector::resize 的作用是什么,它如何影响 size、capacity 和元素构造?这道腾讯牛客题的关键是围绕“std::vector::resize 与容量管理”讲清概念、机制、取舍和边界。std::vector::resize 改变的是 size,也就是逻辑元素个数;如果变大,会构造新增元素,必要时扩容并迁移原有元素;如果变小,会析构多余元素,但通常不会保证缩小 capacity。它和 reserve 只调整容量不同。
C++ 智能指针为什么能避免内存泄漏?
C++ 智能指针为什么能避免内存泄漏?这道腾讯牛客题的关键是围绕“C++ 智能指针与内存泄漏治理”讲清概念、机制、取舍和边界。智能指针通过 RAII 把堆对象生命周期绑定到对象析构,能减少忘记 delete、异常路径提前返回和重复释放导致的问题。unique_ptr 表达独占所有权,shared_ptr 表达共享所有权,weak_ptr 用来观察对象并打破 shared_ptr 循环引用。
手写 CUDA vector add kernel 时,为什么需要边界判断,为什么通常不用 shared memory,block size 和 warp 有什么关系?
这题考 CUDA 入门 kernel 的工程基本功:线程索引、越界保护、全局内存合并访问、shared memory 是否有复用收益、block size 与 warp/occupancy 的关系。
高斯卷积核如何用可分离卷积等方式优化,时间复杂度和效果会怎样变化?
高斯卷积核优化的核心是利用数学结构和硬件特性减少重复计算。二维高斯核可分解为横向一维高斯和纵向一维高斯的外积,因此一次 K×K 卷积可以改成两次长度 K 的一维卷积,理论复杂度从每像素 O(K²) 降到 O(2K),效果在同一离散核和边界策略下基本等价。进一步还可以通过截断半径、缓存、SIMD、定点化、近似盒滤波或递归滤波继续提速,但要说明精度、边缘和伪影取舍。
积分图如何实现均值滤波,为什么能把窗口求和从面积相关降到常数时间?
积分图用于均值滤波的关键是把每个像素左上方矩形区域的累计和预先存起来。这样任意轴对齐窗口的像素和都可以由四个角的积分值相加相减得到,不再需要逐个遍历窗口内所有像素。对半径为 r 的均值滤波,朴素方法每个像素要累加 (2r+1)² 个值,而积分图在预处理 O(HW) 后,每个窗口求和只需常数次读取和加减,再除以窗口面积即可得到均值。