点击上方蓝字关注我,我们一起学编程
有任何疑问或者想看的内容,欢迎私信

微信搜索《编程笔记本》(codingbook2020),获取更多干活。

今天分享高德地图C++研发岗位一面面试题。

面试题目录

文章目录

  • 面试题目录
  • 1.1 你对面向对象的理解是什么?
  • 1.2 继承有什么原则?
  • 1.3 虚函数的工作方式是什么?虚函数表和虚表指针是什么?
  • 1.4 抽象类可以实例化对象吗?
  • 1.5 三种继承方式的使用场景和选择原则?
  • 1.6 C# 中有接口的概念,那么在 C++ 中哪种行为体现了接口的特性?
  • 1.7 重写和重载的区别是什么?
  • 1.8 哪些类函数需要设置成虚函数?怎么判断一个函数是否需要声明为虚函数?
  • 1.9 基类指针操作基类对象,基类指针操作派生类对象,派生类指针操作基类对象,派生类指针操作派生类对象,操作同名函数时是什么样的情况?
  • 1.10 C++ 的虚拟内存分布?
  • 1.11 你了解过 STL 的哪些容器,以及其使用的场景和区别?
  • 1.12 vector 中扩容的原理和具体实现方式?
  • 1.13 map 和 unordered map 的底层实现和性能区别是什么?它们在获取元素和增删元素时有什么区别?
  • 1.14 了解过哪些排序算法?
  • 1.15 设计数据库有哪些原则?如何设计一个表?
  • 1.16 怎么提高数据库的 i/o 速度?
  • 1.17 了解对线程吗?
  • 1.18 了解过范式吗?
  • 1.19 了解二叉树的遍历吗?

1.1 你对面向对象的理解是什么?

面向对象是向现实世界模型的自然延伸,这是一种万物皆对象的编程思想。在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动,可以概括为:程序=对象+消息

面向对象有三大特性:封装继承多态

封装就是将一类事物的属性和行为抽象成一个类,使其属性私有化行为公开化,提高了数据的隐秘性的同时,使代码模块化。这样做使得代码的复用性更高。

继承则是进一步将一类事物共有的属性和行为抽象成一个父类,而每一个子类是一个特殊的父类——有父类的行为和属性,也有自己特有的行为和属性。这样做扩展了已存在的代码块,进一步提高了代码的复用性。

多态的一大作用就是为了解耦——为了解除父子类继承的耦合度。简单来说,多态就是允许父类引用(或接口)指向子类(或实现类)对象。很多的设计模式都是基于面向对象的多态性设计的。如果说封装和继承是为了使代码重用,那么多态则是为了实现接口重用。

总结来说,封装和继承是面向对象的基础,多态是面向对象最精髓的理论。

1.2 继承有什么原则?

  • 公有继承时:水平访问和垂直访问对基类中的公有成员不受限制
  • 保护继承时:对于垂直访问同于公有继承,对于水平访问同于私有继承
  • 私有继承时:水平访问和垂直访问对基类中的公有成员也不能访问

对于基类中的私有成员,只能被基类中的成员函数和友元函数所访问,不能被其他的函数访问。基类与派生类的关系:任何一个类都可以派生出一个新类,派生类也可以再派生出新类,因此,基类和派生类是相对而言的。

1.3 虚函数的工作方式是什么?虚函数表和虚表指针是什么?

C++ 中虚函数的实现一般是通过虚函数表实现的。类的虚函数表是一块连续的内存,每个内存单元中记录一个 JMP 指令的地址,也就是每个虚成员的地址。编译器会为每个有虚函数的类创建一个虚函数表,该虚函数表将被该类的所有对象共享。 虚表指针就是指向虚函数表的指针。

更多关于虚函数的内容参见往期笔记:【面经】CVTE–C++软件开发@一面的面试题1.2 。

1.4 抽象类可以实例化对象吗?

抽象类可以有自己的构造方法,但是不能直接通过 new 进行实例化。但是可以通过子类继承,实例化子类的时候抽象类也会被实例化。

1.5 三种继承方式的使用场景和选择原则?

  • public(公有继承):继承时保持基类中各成员属性不变,并且基类中 private 成员被隐藏。派生类的成员只能访问基类中的 public/protected 成员,而不能访问 private 成员;派生类的对象只能访问基类中的 public 成员。
  • private(私有继承):继承时基类中各成员属性均变为 private ,并且基类中 private 成员被隐藏。派生类的成员也只能访问基类中的 public/protected 成员,而不能访问 private 成员;派生类的对象不能访问基类中的任何的成员。
  • protected(保护继承):继承时基类中各成员属性均变为 protected ,并且基类中 private 成员被隐藏。派生类的成员只能访问基类中的 public/protected 成员,而不能访问 private 成员;派生类的对象不能访问基类中的任何的成员。

1、不管采用哪种形式(public, protected 或 private),基类中的私有成员都不可以直接访问;如果非要在派生类中使用基类的私有成员,可以有两种方法:一是使用属性,二是使用友元类或友元函数。
2、如果采用 public 形式,则基类除了私有成员的其它所有都被原样的继承到派生类中;即在基类中是 public 的,在派生类中还是 public 的,在基类中是 protected 的,在派生类中还是 protected 的。
3、如果采用 protected 形式,则基类中除了私有成员的其它说有都被以 protected 的形式继承到派生类中。

1.6 C# 中有接口的概念,那么在 C++ 中哪种行为体现了接口的特性?

接口描述了类的行为和功能,而不需要完成类的特定实现。C++ 接口是使用抽象类来实现的,如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 “= 0” 来指定的,如下所示:

class Box
{public:// 纯虚函数virtual double getVolume() = 0;
private:double length;      // 长度double breadth;     // 宽度double height;      // 高度
};

设计抽象类(通常称为 ABC)的目的,是为了给其他类提供一个可以被继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用

1.7 重写和重载的区别是什么?

重写(覆盖):是指派生类中存在重新定义的函数,其函数名、参数列表、返回值类型,所有都必须同基类中被重写的函数一致,只有函数体不同。派生类调用时会调用派生类的重写函数,不会调用被重写函数。

重载:是指同一可访问区内被声明的几个具有不同参数列(参数的类型、个数)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。

重载和重写的区别:

  • 范围区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中

  • 参数区别:重写与被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同

1.8 哪些类函数需要设置成虚函数?怎么判断一个函数是否需要声明为虚函数?

通常类的析构函数被设置成虚函数,因为当类被继承时,派生类的析构函数需要调用基类的析构函数,如果基类的析构函数不适合虚函数的话,派生类对象在销毁时将只调用自身的析构函数,而不调用基类的析构函数。

判断一个函数是否需要被设置成虚函数,取决于我们是否需要实现多态,我们可以通过将成员函数声明成虚函数来实现多态。

1.9 基类指针操作基类对象,基类指针操作派生类对象,派生类指针操作基类对象,派生类指针操作派生类对象,操作同名函数时是什么样的情况?

当基类成员函数为普通函数时:

#include <iostream>using namespace std;class A {
public:void show() {cout << "Hello" << endl;}
};class B : public A {
public:void show() {cout << "World" << endl;       }
};int main()
{A *pa;B *pb;A a;B b;// 基类指针操作基类pa = &a;pa->show();// 基类指针操作派生类pa = &b;pa->show();// 派生类指针操作基类// pb = &a;        // 编译错误 // pb->show();// 派生类指针操作派生类pb = &b;pb->show();
}/*
运行结果:
Hello
Hello
World
*/

当基类成员函数为虚函数时:

#include <iostream>using namespace std;class A {
public:virtual void show() {cout << "Hello" << endl;}
};class B : public A {
public:void show() {cout << "World" << endl;       }
};int main()
{A *pa;B *pb;A a;B b;// 基类指针操作基类pa = &a;pa->show();// 基类指针操作派生类pa = &b;pa->show();// 派生类指针操作基类// pb = &a;        // 编译错误 // pb->show();// 派生类指针操作派生类pb = &b;pb->show();
}/*
运行结果:
Hello
World
World
*/

综上:当基类成员函数为普通函数时,最终调用的成员函数是由指针类型决定的;当基类成员函数为虚函数时,最终调用的成员函数是由指针指向的实例类型决定的。

1.10 C++ 的虚拟内存分布?

在 C++ 中,虚拟内存分为代码段数据段BSS 段堆区、**栈区、文件映射去六大部分。

  • 代码段:包括只读存储区和文本区,其中只读存储区存储字符串常量,文本区存储程序的机器代码
  • 数据段:存储程序中已经初始化的全局变量和静态变量
  • BSS 段:存储未初始化的全局变量和静态变量,以及所有被初始化为 0 的全局变量和静态变量
  • 堆区:调用 new/malloc 函数时在堆区动态分配内存,同时需要调用 delete/free 来手动释放申请的内存
  • 栈区:使用栈空间存储函数的返回地址、参数、局部变量、返回值等
  • 文件映射区:存储动态链接库及调用 mmap 函数进行的文件映射

1.11 你了解过 STL 的哪些容器,以及其使用的场景和区别?

参见往期笔记:【面经】CVTE–C++软件开发@一面的面试题 1.5。

1.12 vector 中扩容的原理和具体实现方式?

参见往期笔记:【面经】CVTE–C++软件开发@一面的面试题 1.6。

1.13 map 和 unordered map 的底层实现和性能区别是什么?它们在获取元素和增删元素时有什么区别?

map 的底层实现是红黑树,unordered map 的底层实现是哈希表

更多相关信息参见往期笔记:【面经】CVTE–C++软件开发@二面的面试题 2.20。

1.14 了解过哪些排序算法?

参见往期笔记:十大经典排序算法(附动图、代码)。

1.15 设计数据库有哪些原则?如何设计一个表?

在设计数据库时,要考虑和遵循下列数据库设计的基本原则,以建立稳定、安全、可靠的数据库:

  • 一致性原则:对数据来源进行统一、系统的分析与设计,协调好各种数据源,保证数据的一致性和有效性。
  • 完整性原则:数据库的完整性是指数据的正确性和相容性。要防止合法用户使用数据库时向数据库加入不合语义的数据。对输入到数据库中的数据要有审核和约束机制。
  • 安全性原则:数据库的安全性是指保护数据,防止非法用户使用数据库或合法用户非法使用数据库造成数据泄露、更改或破坏。要有认证和授权机制。
  • 可伸缩性与可扩展性原则:数据库结构的设计应充分考虑发展的需要、移植的需要,具有良好的扩展性、伸缩性和适度冗余。
  • 规范化:数据库的设计应遵循规范化理论。规范化的数据库设计,可以减少数据库插入、删除、修改等操作时的异常和错误,降低数据冗余度等。

设计数据库表的几条黄金准则:

  • 字段的原子性:保证每列的原子性,不可分解,表达明确
  • 主键设计:主键不要与业务逻辑有所关联,最好是毫无意义的一串独立不重复的数字,常见的比如 UUID 或者将主键设置为 Auto_increment
  • 字段使用次数:对于频繁修改的字段(一般是指状态类字段)最好用独立的数字或者单个字母去表示,不用使用汉字或长字符的英文
  • 字段长度:建表的时候,字段长度尽量要比实际业务的字段大 3-5 个字段左右(考虑到合理性和伸缩性),最好是 2^n 的值
  • 关于外键:尽量不要建立外键,保证每个表的独立性。如果非得保持一定的关系,最好是通过 id 进行关联
  • 动静分离最好做好静态表和动态表的分离。这里解释一下静态表和动态表的含义,静态表:存储着一些固定不变的资源,比如城市/地区名/国家(静态表一定要使用缓存)。动态表:一些频繁修改的表
  • 关于 code 值:使用数字码或者字母去代替实际的名字,也就是尽量把 name 转换为 code ,因为name可能会变,但是code一般是不会变化的
  • 关于 Null 值:尽量不要有 null 值,有null值的话,数据库在进行索引的时候查询的时间更久,从而浪费更多的时间。可以在建表的时候设置一个默认值
  • 关于引擎的选择:关于引擎的选择,innodb 与 myisam,myisam 的实际查询速度要比innodb 快,因为它不扫面全表,但是 myisam 不支持事务,没办法保证数据的 Acid 。选择哪个要看自己对于效率和数据稳定性方面的实际业务的取舍了
  • 资源存储:数据库不要存储任何资源文件,比如照片/视频/网站等,可以用文件路径/外链用来代替,这样可以在程序中通过路径,链接等来进行索引
  • 与主键相关:根据数据库设计三大范式,尽量保证列数据和主键直接相关而不是间接相关
  • 关系映射:多对一或者一对多的关系,关联一张表最好通过 id 去建立关系,而不是去做重复数据,这样做最大的好处就是中间的关系表比较清楚明白
  • 预留字段:在设计一张表的时候应该预制一个空白字段,用于以后的扩展,因为你也不是确定这张表以后不会扩展
  • 留下单一字段确定是否可用:通过一个单一字段去控制表是否可用,比如通常起名为 isVaild ,预制的含义为 0 为有效,1 为无效
  • 删除字段:数据库是禁止使用 delete 命令的,一般都不会真正删除数据,都是采用改状态的方式,设置 state 字段,通过修改状态赋予它是否有效的逻辑含义

1.16 怎么提高数据库的 i/o 速度?

通过使用多个磁盘可以提高数据库整体的 I/O 速度。

1.17 了解对线程吗?

参见往期笔记:操作系统基础知识:程序、进程与线程。

1.18 了解过范式吗?

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

  • 第一范式(1NF):
    所谓第一范式(1NF)是指在关系模型中,对于添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。

  • 第二范式(2NF)
    在 1NF 的基础上,非码属性必须完全依赖于候选码(在 1NF 基础上消除非主属性对主码的部分函数依赖)。第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。

  • 第三范式(3NF)
    在 2NF 基础上,任何非主属性不依赖于其它非主属性(在 2NF 基础上消除传递依赖)。第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。

  • 巴斯-科德范式(BCNF)
    Boyce-Codd Normal Form(巴斯-科德范式),在 3NF 基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖)。巴斯-科德范式(BCNF)是第三范式(3NF)的一个子集,即满足巴斯-科德范式(BCNF)必须满足第三范式(3NF)。通常情况下,巴斯-科德范式被认为没有新的设计规范加入,只是对第二范式与第三范式中设计规范要求更强,因而被认为是修正第三范式。

1.19 了解二叉树的遍历吗?

参见往期笔记:【面经】深信服–C++研发的面试题 8 。

【面经】高德地图 C++ 研发 一面相关推荐

  1. 【面经】高德地图 C++ 研发 二面

    点击上方蓝字关注我,我们一起学编程 如果觉得内容还不错,请帮忙分享一下 有任何疑问或者想看的内容,欢迎私信 微信搜索<编程笔记本>(codingbook2020),获取更多干活. 今天接着 ...

  2. 【招聘内推】阿里高德地图招聘应用算法专家(P7,含推荐算法方向)

    阿里高德地图机器学习研发部招聘应用算法专家(P7),Base 北京,感兴趣的小伙伴可以发邮件至lixi.tjj@alibaba-inc.com联系. 职位描述: 1.服务亿万高德出行用户,解决出行领域 ...

  3. 解决高德地图在线API不支持对应的方法回调返回结果的问题

    前阵子做了个基于高德在线地图分析业务数据的web应用,但是在使用其API的过程中发现一个很不友好的问题,那就是它不支持对应的方法回调返回结果(当时不支持,2014-12-18号发布的1.3.5版本更新 ...

  4. 如虎添翼|高德地图+Serverless 护航你的假日出行

    作者:刘金龙(福辰)  高德团队 引言 "前方事故多发地段,请注意保持车距-""您已疲劳驾驶,请注意休息-""前方经过泰山旅游景区,中国 5A 级景区 ...

  5. 函数计算助力高德地图平稳支撑亿级流量高峰

    简介:2020 年的"十一出行节"期间,高德地图创造了记录 --截止 2020 年 10 月 1 日 13 时 27 分 27 秒,高德地图当日活跃用户突破 1 亿,比 2019 ...

  6. 热力地图高德_高德地图:最新动态

    高德地图是国内最专业的手机地图,超过3.2亿用户在使用!高德地图是应用商店上数据准确率最高.最省流量.躲避拥堵功能最强大的手机地图,平均每天为用户省油61万升! 高德地图今日宣布上线货车导航功能,帮助 ...

  7. ArchSummit分享 | 高德地图App架构演化与实践

    讲师介绍 郝仁杰,高德地图无线开发专家.在7月13日落幕的2019年ArchSummit峰会上就高德地图近几年的App架构演化和实践进行了分享. 背景概述 高德是国内领先的数字地图内容.导航和位置服务 ...

  8. 高德地图看各省分界线_深度解读|高德宣布高精地图“百元时代”背后的商业逻辑是什么...

    车展前夕,高德的一次媒体沟通会,或许将为国内自动驾驶的发展带来深远影响. 4月11日,高德地图在北京举行"高精宣言"媒体沟通会,表示将对高精地图服务进行升级,并以成本价格提供标准化 ...

  9. 高德地图车道级导航适配OPPO Find N折叠屏手机

    12月17日消息,近日,OPPO正式发布了旗下折叠屏手机OPPO Find N,该款手机中用户可通过高德地图APP实现车道级精准定位和导航. 高德车道级导航是高德与手机.汽车及通信等领域合作伙伴共同研 ...

最新文章

  1. RDKit | 分子坐标的测量和绘图
  2. 最值得你收藏的30个Python常用小技巧
  3. 关注微信公众号使其自动发送欢迎你关注消息
  4. 数据库系统实训——实验九——函数
  5. SCRT中只换行不回车的问题(阶梯)
  6. 解决:qrc文件中删除资源文件后编译失败
  7. eclipse运行不了jsp代码,错误代码:couldn't create the java virtual machine. a fatal exception has occurred.
  8. 在线OPML压缩工具
  9. mysql查看锁死的sql,最全指南
  10. 【网络安全】小白每天学一点之“监控应用程序行为” [process monitor]
  11. 利器 | Terminal Shell 改造记录 Windows Terminal + ZSH + Tmux
  12. 源码安装禅道11.0总结
  13. linux配置虚拟IP地址方法
  14. win10到2008服务器smb协议,如何启用或禁用SMB1文件共享协议在Windows
  15. M1-CORO-S7 MANIP Modeling of Manipulators(1)
  16. 不懂编程?节点包来凑——Dynamo常用节点包推荐(下)
  17. IDEA server乱码
  18. VS2017环境下GMap的学习及开发(一)
  19. ab压力测试是使用以及介绍
  20. Android 9.0 设置充电到50%退出省电模式

热门文章

  1. WebGL入门基本概念
  2. 高级软件工程第八次作业:“两只小熊队”团队作业-5
  3. 国内SNS网站之比较(转)
  4. 邂逅Node.js开发
  5. IdentityServer4 Admin 部署到IIS血泪史
  6. android studio cradle 本地配置
  7. 我说MySQL里每张表不要超过100w数据,面试官让我回去等通知?
  8. 由浅入深学MySQL之事务全攻略
  9. 网易游戏研发工程师笔试题----赛马
  10. 解决图片上传 显示图片慢的问题