【13】C++岗位求职面试八股文系列文章(语言基础)
第一篇:语言基础
第二篇:设计模式
第三篇:数据库
第四篇:计算机网络
第五篇:操作系统
第六篇:LInux
第七篇:数据结构
第八篇:智力题
[241]Atomic:解决线程安全问题
问题:a++ 和 int a = b 在C++中是否是线程安全的? 答案:不是从C/C++语法的级别来看,这是⼀条语句,应该是原⼦的;但从编译器得到的汇编指令 来看,其实不是原⼦的。 其⼀般对应三条指令,⾸先将变ᰁa对应的内存值搬运到某个寄存器(如eax)中,然后将该 寄存器中的值⾃增1,再将该寄存器中的值搬运回a代表的内存中解决办法: C++11新标准发布即std::atomic,这是⼀个模板类型
[242]请你回答一下智能指针有没有内存泄露的情况
智能指针有内存泄露的情况发生。
当两个对象同时使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效,从而导致内存泄露。
智能指针的内存泄漏如何解决?为了解决循环引用导致的内存泄漏,引入了弱指针weak_ptr,weak_ptr的构造函数不会修改引用计数的值,从而不会对对象的内存进行管理,其类似一个普通指针,但是不会指向引用计数的共享内存,但是可以检测到所管理的对象是否已经被释放,从而避免非法访问。
[243]内存泄露
指由于疏忽或错误造成了程序未能释放掉不再使⽤的内存的情况。可以使⽤Valgrind, mtrace进⾏内存泄漏检查
分类:堆内存泄漏、系统资源泄露(如 Bitmap,handle ,SOCKET)、没有将基类的析构函数定义为虚函数什么操作会导致内存泄露:指针指向改变,未释放动态分配内存
如何防⽌内存泄露?将内存的分配封装在类中,构造函数分配内存,析构函数释放内存;使⽤智能指针
智能指针有了解哪些?智能指针是为了解决动态分配内存导致内存泄露和多次释放同⼀内存(悬空指针)所提出的,C11标准中放 在< memory>头⽂件。包括:共享指针,独占指针,弱指针
[244]简述一下 C++ 11 中 auto 的具体用法
auto用于定义变量,编译器可以自动判断变量的类型(1) auto 与 const 结合的用法a. 当类型不为引用时,auto 的推导结果将不保留表达式的 const 属性;b. 当类型为引用时,auto 的推导结果将保留表达式的 const 属性。
[245]简述一下 C++11 中的可变参数模板新特性
类模板参数:从右到左;函数模板默认参数:从左到右,从右到左都可,一般从左到右递归方式展开函数参数包继承方式展开类参数包
[246]简述一下 C++11 中 Lambda 新特性
左值:可取地址,有名字右值:不可取地址,无名字:字面常量,表达式,函数的非引用返回值左值引用和右值引用都是属于引用类型。无论是声明一个左值引用还是右值引用,都必须立即进行初始化引用:给一个内存起一个别名,定义时必须初始化
[247]为什么需要移动语义
右值引用是用来支持转移语义的。转移语义可以将资源 ( 堆,系统对象等 ) 从一个对象转移到另一个对象,这样能够减少不必要的临时对象的创建、拷贝以及销毁,能够大幅度提高 C++ 应用程序的性能。临时对象的维护 ( 创建和销毁 ) 对性能有严重影响。
[248]std::move
标准库提供了函数 std::move,这个函数以非常简单的方式将左值转换为右值。只有转换为右值,才可以调用移动构造函数和移动赋值函数
[249]完美转发 std::forward
防止函数模板中的右值转化为实际的左值需要将一组参数原封不动的传递给另一个函数。
“原封不动”不仅仅是参数的值不变,在 C++ 中,除了参数值之外,还有一下两组属性:左值/右值和 const/non-const。完美转发就是在参数传递过程中,所有这些属性和参数值都不能改变,同时,而不产生额外的开销,就好像转发者不存在一样。在泛型函数中,这样的需求非常普遍。
[250]闭包的实现
闭包:,闭包是带有上下文的函数,有状态(变量)的函数。更直接一些,不就是个类吗?换了个名字而已闭包的状态捆绑,必须发生在运行时。内部包含 static 变量的函数,不是闭包(编译)
闭包实现有三种方式:
- 仿函数:重载 operator()
- bind绑定器
它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体,这种机制在回调函数的使用过程中也颇为有用。,它绑定的参数的个数不受限制,绑定的具体哪些参数也不受限制,由用户指定
(占位符从1开始)
- lambda表达式
This指针只是捕获类成员变量、全局变量, 不能捕获局部变量
仿函数是编译器实现lambda的一种方式
[251]std::function类模板
C++11中,新增加了一个它是对C++中现有的可调用实体的一种类型安全的包裹。通过指定它的模板参数,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟执行它们。std::function对象最大的用处就是在实现函数回调,使用者需要注意,它不能被用来检查相等或者不相等,但是可以与NULL或者nullptr进行比较
[252]Auto
Explicit:只能含有一个参数 修饰构造函数
关键字explicit只对一个实参的构造函数有效,需要多个实参的构造函数不能用于执行隐式转换,所以无需将这些构造函数指定为explicit。
[253]静态断言
static_assert(常量表达式条件, "提示的字符串")编译时候检查,而assert()是在运行时候检查静态断言的好处:1.更早的报告错误,我们知道构建是早于运行的,更早的错误报告意味着开发成本的降低2.减少运行时开销,静态断言是编译期检测的,减少了运行时开销
[254]Noexcept:有异常直接终止
[255]NULL和nullptr
Null可以给普通变量和指针变量赋值;Nullptr只能给指针变量赋值
[256]Constexpr
//常量表达式,发生在编译阶段
常量表达式主要是允许一些计算发生在编译时,即发生在代码编译而不是运行的时候。
这是很大的优化:假如有些事情可以在编译时做,它将只做一次,而不是每次程序运行时都计算。
constexpr函数的限制:函数中只能有一个return语句(有极少特例)
函数必须返回值(不能是void函数)在使用前必须已有定义return返回语句表达式中不能使用非常量表达式的函数、全局数据,且必须是一个常量表达式
[257]继承控制
C++ 11添加了两个继承控制关键字:final和override。 final阻止类的进一步派生和虚函数的进一步重写 override确保在派生类中声明的函数跟基类的虚函数有相同的签名(一模一样)函数体可以不同,返回类型,函数名,参数类型及个数一定一样
- final
final阻止类的进一步派生,虚函数的进一步重写
2override
[258]类默认函数的控制:"=default" 和 "=delete"函数
Default:C++ 的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。这些类的特殊成员函数负责创建、初始化、销毁,或者拷贝类的对象。
如果程序员为类显式的自定义了非默认构造函数,编译器将不再会为它隐式地生成默认无参构造函数。
顺序:默认构造《有参构造《拷贝构造
Delete:为了能够让程序员显式的禁用某个函数(任何函数都可以用delete),C++11 标准引入了一个新特性:"=delete"函数。程序员只需在函数声明后上“=delete;”,就可将该函数禁用。
[259]引用本质:指针常量
*和const谁在前,就先念谁故const int *p叫做常量指针(也可以写作int const *p)因为(p)变成常量,故不能执行p=x的操作,但是可以修改p指向的地址常量指针-》const *p-》指向变,值不变int const p叫做指针常量 因为(p)变成常量,故p指向的地址不能修改,但是可以执行p=x的操作指针常量-》*const p-》指向不变,值变引用的本质就是指针常量,指向的地址不能修改
最后一个:吧20赋值给引用,是正确的
[260]常量引用
C语言没有常量引用,c++有
[续]C++岗位求职面试八股文第十四篇
更多关于算法题解、软件开发面经、机器学习算法面经、各企业面试问题记录,关注Fintech砖,持续更新中。https://www.nowcoder.com/users/873777317
企业面试记录专栏https://www.nowcoder.com/creation/manager/columnDetail/0YBWnm
机器学习面经专栏https://www.nowcoder.com/creation/manager/columnDetail/j8nNy0
软件开发面经专栏https://www.nowcoder.com/creation/manager/columnDetail/0aXKaM
更多校园招聘常见面试问题(开发、算法、编程题目)参见CSDN博客:http://t.csdn.cn/V4qbH
欢迎关注、收藏、点赞后进行问题咨询及秋招建议!
#晒一晒我的offer##牛客在线求职答疑中心##如何判断面试是否凉了##软件开发薪资爆料##我的实习求职记录#包含C++、操作系统、数据库、计算机组成、计算机网络、设计模式、操作系统、牛客网服务器项目、综合智力题等