C++面试题 (Ⅰ章节)
C++面试题 (面试官们别再问什么是虚函数)
有一些C++岗位的面试官,在面试的时候总是问一下莫名其妙、烂大街,甚至不合逻辑的问题,万年不变的“指针和引用的区别”、“构造析构函数能否是虚函数”、“虚函数的原理”,听得都烦,根本看不出对C++的熟悉和理解程度。这里我整理了一些非传统的问题,摒弃那种细枝末节的语法,专注在使用和理解方向,可以适当参考。
(下面的问题并不严格按照小标题划分,更多的是连环问,彼此之间有关系)
======================
======================
计算机基础
- 逻辑与或非的优先级?
- 逻辑运算的短路特性?
- x&(x-1)可以被视为什么作用?
- float和double的存储方式?为什么一般说float的精度不超过6位小数,double不超过15位呢?
C++语言基础
- 介绍一下了解的C++数据类型?
- 有没有了解C++的值类别?在C++11之前和之后有没有什么区别?
- 解释什么叫预处理?介绍几个用过的预处理器?
- 有没有接触过运算符重载?可以举几个常用的例子?
- 介绍一下C++的转换运算符?
- "123"s,"123"sv,1ms是什么意思?是否了解字面量?有没有自定义过?
- 解释一下什么叫引用?引用的分类?
- 左值引用和右值引用各有什么含义和用途?
- 说到右值引用(前一个问题如果回答了为临时对象延长生存期),那么const左值引用也可以起到相同的效果,那和右值引用有什么区别吗?
- 说到const左值引用,const string& s="123" 是否正确?会发生什么?
- 如果把const左值引用作为引用返回,是否可以?有没有隐患?
- 什么叫悬垂引用?
- 如果一个函数,重载了右值引用,左值引用,const左值引用,那么在进行函数调用的时候是如何选择的?
- 什么叫universal reference(万能引用)?基本的语法是怎么样的?简单说一下即可
- 有了解引用折叠么?
- C++11之后vector引入了emplace_back是用来做什么的?怎么实现的?和push_back有什么区别?
- std::move的作用是什么?怎么实现的?
- std::forward的作用是什么?怎么实现的?
- std::move和std::forward的区别是什么?在使用上有什么考虑么?
- C++标准是否支持变长数组?C语言中的0长数组一般怎么使用?
- 怎么理解inline的?(主要从C++17的可重复定义角度讲)
- 那可以写一个编译期失败的程序么?那链接期失败的程序呢?运行期异常的程序?(这个问题也是从inline的作用想到的)
- static_assert有没有用过?怎么使用的?那在STL源码中是否遇到过?能否举一个简单的例子?
- const和constexpr有什么区别?
- 满足什么条件下,会触发constexpr的编译期求值?
- auto在C++11之前和之后有什么含义的区别?是否有了解auto作为返回值和函数形参的情况?
- decltype的推导规则有了解么?
- C++11提供的统一初始化方式叫什么?自己用的多么?
- 初始化列表initializer_list的实现是否清楚?
- RVO和NRVO是否有了解?可以结合C++17的复制消除讲一讲?
- 如果在返回值的时候使用std::move是否可行?怎么评价?
- 如果现在有一个场景要求是参数量任意多,你会用什么方法来实现?开放性的,不要求性能
- lambda有没有了解过?它的语法是怎么样的?
- 使用lambda之后生成的是个什么东西?函数对象?还是?怎么验证你的说法?
- lambda的捕获方式介绍一下?
- 平时一般在什么场景使用lambda?举几个例子即可
- 如果要实现lambda的递归,一般怎么做?说出你了解的方式即可
- lambda的说明符有一种是mutable,它的用途是什么?
- 既然lambda是一个类对象,那么为什么可以赋值给一个函数指针类型的变量呢?
- 其实不管是函数(通过指针),lambda表达式,bind表达式,都可以被function存储,那你有了解过function模板类么?
- 说到这里,如果让你获取一个函数的返回值类型,你会用什么方法?该方法的原理是否理解?
- 我们刚才提到了bind,那么如果某个函数的形参是引用类型,是否可以直接传递呢?
- 如果不可以,是为什么呢?是否了解bind的原理?
- 那一般通过什么方式解决呢?(std::ref)
- 那std::ref函数是做什么用的?(生成一个reference_wrapper对象)为什么reference_wrapper为什么可以解决呢?如果实现reference_wrapper类向被wrap类型转换呢?
- 一个空类的大小?为什么?空基类优化是什么意思?
- 一个空类编译器默认生成的函数有哪些?三/五/零法则是否有了解?
经典问题翻版
- (老问题...) 说一下C++提供的智能指针?各自有什么用途?你一般在什么场景使用?
- shared_ptr的基本数据结构可以讲讲么?
- (老问题...) make_shared和构造函数传裸指针的区别?
- shared_ptr是否是线程安全的?或者说哪些部分是线程安全的(引用计数)?
- 那引用计数的线程安全性怎么实现的(可能一般人说原子类型)?
- 如果有一个场景需要用到线程安全的shared_ptr,一般你会怎么做?开放性问题
- 说到线程安全性,在语言层面,你一般使用什么手段?
- 如何在代码角度来避免死锁呢?是否用过相关的API?原理了解吗?
- C++提供的shared_mutex是否了解?主要用于什么场景?
- 我们刚才也提到了线程安全版本的shared_ptr,那你是否知道shared_ptr有特化的原子操作?
- 那提到原子操作,atomic有了解吗?一般特化了哪几种类型的模板呢?
- 说到原子操作了,那你是否知道C++11引入的内存顺序呢?为什么要引入内存顺序呢?知道哪几种顺序模型?atomic默认哪一种?是否有针对内存顺序做过优化呢?
- shared_ptr引用计数器的增减使用哪种的内存顺序呢?
暂时写这些,很多很多东西都没涉及。。。
#牛客解忧铺##24届软开秋招面试经验大赏#C++面试题分享 文章被收录于专栏
C++面试题分享