- 大家好,我是FinTech社区创始人Lucy。 FinTech社区主要从事金融科技/量化投资/区块链招聘的社区
- 目前我们与电鸭合作,有大量区块链相关职位的招聘,有兴趣的可以关注我们的招聘帖子:https://eleduck.com/posts/pqfJRb
有招聘需求的企业也能够通过邮箱 dianya@fintechgl.com 联系我们哟!
我们都知道C++是高频交易系统与量化分析领域中常用的编程语言,那么面试C++都会被问到哪些问题呢?
通过本篇文章,你将获得如下知识点:
-
C++基础知识有哪些?
-
C++有什么高级用法?
-
C++的优势有哪些?
记得转发文章
获取C++ 面试资料大全!
1 C++基础知识问答
经过大量的面试总结,我们得到了C++高频面试题如下:
1. const的作用有哪些?
-
修饰变量,说明该变量不可以被改变;
-
修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);
-
修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改;
-
修饰成员函数,说明该成员函数内不能修改成员变量。
2. struct与class的区别
总得来说,struct 更适合看成是一个数据结构的实现体,class 更适合看成是一个对象的实现体。
如上图所示,struct与class最本质的一个区别就是默认的访问控制权限:
-
默认的继承访问权限。struct 是 public 的,class 是 private 的。
-
struct 作为数据结构的实现体,它默认的数据访问控制是 public 的,而 class 作为对象的实现体,它默认的成员变量访问控制是 private 的。
3. 什么是面向对象?
面向对象程序设计(Object-oriented programming,OOP)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。
面向对象三大特征 —— 封装、继承、多****态。
封装是指把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作。关键字:public, protected, private。不写默认为private。
-
public 成员:可以被任意实体访问
-
protected 成员:只允许被子类及本类的成员函数访问
-
private 成员:只允许被本类的成员函数、友元类或友元函数访问
继承是指子类可以使用父类的某些方法,可以通俗地表示为:基类(父类)——> 派生类(子类)。
多态即多种状态(形态)。简单来说,我们可以将多态定义为消息以多种形式显示的能力。多态是以封装和继承为基础的。
C++ 多态分类及实现:
-
重载多态(Ad-hoc Polymorphism,编译期):函数重载、运算符重载;
-
子类型多态(Subtype Polymorphism,运行期):虚函数;
-
参数多态性(Parametric Polymorphism,编译期):类模板、函数模板;
-
强制多态(Coercion Polymorphism,编译期/运行期):基本类型转换、自定义类型转换。
4. 智能指针
C++98中为了避免程序员编程疏忽导致的内存泄露开始引入了“智能指针”的概念;在C++11中,智能指针的定义得到了进一步完善,目前常用的智能指针也多是C++11中的概念。
shared_ptr多个智能指针可以共享同一个对象,对象的最末一个拥有着有责任销毁对象,并清理与该对象相关的所有资源。
weak_ptr 允许共享但不拥有某对象,一旦最末一个拥有该对象的智能指针失去了所有权,任何 weak_ptr 都会自动成空(empty)。因此,在 default 和 copy 构造函数之外,weak_ptr 只提供 “接受一个 shared_ptr” 的构造函数。
unique_ptr 是 C++11 才开始提供的类型,是一种在异常时可以帮助避免资源泄漏的智能指针。采用独占式拥有,意味着可以确保一个对象和其相应的资源同一时间只被一个 pointer 拥有。
2 C++的新特性
C++20(C++ 编程语言标准 2020 版)将是 C++ 语言一次非常重大的更新,将为这门语言引入大量新特性。
1. concept
在使用模板进行通用编程时,实例化模板经常会出现用错类型的问题,其结果通常是几页难懂的报错信息。
现在concept来了,concept可以为模板编写要求,而编译器则可以检查这个要求。这样我们就可以避免上述问题了。
类模板中的函数重载或特殊化可以基于concept进行,编译器能够比较模板参数的要求与实际的模板参数,得到更好的报错信息。
2. 协程
协程是广义的函数,能在保持状态的同时暂停或继续。
协程通常用来编写事件驱动型应用和协作式多任务(cooperative multitasking)。
这样,之前经常被大家诟病的C++多线程的并发问题也会得到很好地处理!
3. 模块(Module)
模块的提出是为了解决C++中复杂的包管理问题。
模块承诺能够实现:更快的编译时间;宏的隔离;表达代码的逻辑结构;不必再使用头文件(header file);摆脱丑陋的宏方法。
3 C++的优点
自1983年C++诞生以来历久弥新,经历了37年的风雨仍然可以活跃在当今生活中。
C++虽然语法较为复杂,但是C++语言既保留了C语言的有效性、灵活性、便于移植等全部精华和特点,又添加了面向对象编程的支持,具有强大的编程功能,可方便地构造出模拟现实问题的实体和操作;编写出的程序具有结构清晰、易于扩充等优良特性,适合于各种应用软件、系统软件的程序设计。
用C++编写的程序可读性好,生成的代码质量高,运行效率仅比汇编语言慢10%~20%。