C++面试题 (面试官们别再问什么是虚函数)有一些C++岗位的面试官,在面试的时候总是问一下莫名其妙、烂大街,甚至不合逻辑的问题,万年不变的“指针和引用的区别”、“构造析构函数能否是虚函数”、“虚函数的原理”,听得都烦,根本看不出对C++的熟悉和理解程度。这里我整理了一些非传统的问题,摒弃那种细枝末节的语法,专注在使用和理解方向,可以适当参考。(下面的问题并不严格按照小标题划分,更多的是连环问,彼此之间有关系)======================C++面试题 (Ⅱ章节)C++面试题 (Ⅲ章节)======================[求求了][mark一下][帮顶]计算机基础逻辑与或非的优先级?逻辑运算的短路特性?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引用计数器的增减使用哪种的内存顺序呢?暂时写这些,很多很多东西都没涉及。。。
点赞 59
评论 12
全部评论

相关推荐

头像 头像
05-06 18:28
已编辑
Java
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务