Web3面经:C++面试都问些什么?

头像
Lucy-FinTe...
74阅读0评论
  • 大家好,我是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与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);摆脱丑陋的宏方法。

附:C++发展历程:

3 C++的优点

自1983年C++诞生以来历久弥新,经历了37年的风雨仍然可以活跃在当今生活中。

C++虽然语法较为复杂,但是C++语言既保留了C语言的有效性、灵活性、便于移植等全部精华和特点,又添加了面向对象编程的支持,具有强大的编程功能,可方便地构造出模拟现实问题的实体和操作;编写出的程序具有结构清晰、易于扩充等优良特性,适合于各种应用软件、系统软件的程序设计。

用C++编写的程序可读性好,生成的代码质量高,运行效率仅比汇编语言慢10%~20%。

收藏
举报
加载中…
精选评论
暂无数据
暂无数据