客户端面试知识点总结

最近通过自己的面试,计划进入新的一家公司进行工作,中间面试的过程中也发现了自己的一些不足,因为有一些知识点在工作中用到的机会不会很多,就会有一些遗忘,所以自己也是一边总结一边面试,将自己每一次面试中回答的不是很好的问题记录下来。

首先自己面试的岗位大的归类为客户端开发,但是不是专门的Android开发或者是iOS开发,所以总结内容还是偏向于数据结构和一些基础的语法。

因为自己是游戏开发相关的工作,所以主要使用的语言还是C++和Lua,Java和C#虽然也写的不少,但是自己本身并不是内行,只是偶尔有Android或者Unity相关的任务的时候,会使用对应平台的语言。所以本次记录的重点主要是:Lua、C++、数据结构以及一些简单的算法。

自己在总结的时候,为了使得自己记忆更加深刻,会将文字记录尽量的口语化,就像自己在和面试官对话一样。在看这篇博客的时候,大家完全可以当做在回答面试官的问题。

1、有关多态

这个面试题目,在我面试好几家公司的时候都有问到过。面试官可能问的是什么是多态?或者让我谈谈多态的机制等等。

关于多态,我之前是有写过一篇博客,但是是我在学习C++的时候总结的,链接:C++面向对象语言的特性之一:多态。但是里面还是属于知识点的总结,面试的时候总不能像背书一样,把知识点都背下来。这样肯定是不行的。所以我的回答是这样:

首先说到多态,那么还是得分成两个类别,一个静态多态,一个是动态多态。

静态多态指的是程序在编译期间才可以确定的多态类型,而动态多态指的是程序在运行期间才可以确定的多态类型。

静态多态分为:函数重载和泛型编程。首先是函数重载,满足这几个条件就可以重载:①在同一个作用域②函数名相同但是参数不同(参数顺序、参数个数、参数类型)③返回值可以相同可以不同。其次静态多态里面还有泛型编程,泛型编程里面就是我们的模板。

除了我们刚才说的静态多态,还有就是我们的动态多态。动态多态的实现就是靠我们的虚函数。

关于虚函数的关键字就是:virtual。

被virtual修饰的函数为虚函数,后面加上"=0"则成为了纯虚函数。拥有纯虚函数的类为抽象类,抽象类不能实例化,之后派生类将抽象类继承之后,并且实现其虚函数,那派生类才可以实例化对象。

这里有几个需要注意的点:①就是被声明为虚函数的函数只能是非静态函数,静态函数不能声明为虚函数;②构造函数不能被声明为虚函数,是因为虚函数是储存在虚表当中的,每一个对象的储存空间里面有一张虚表,但是构造函数是在你构造对象的时候,这个时候你需要构造对象以及开辟对象所需要的储存空间。这个时候就和虚函数的原理冲突了,所以构造函数是不能为虚函数的。③同样的道理,析构函数就可以是虚函数,因为这个时候对象已经声明出来,空间已经开辟,虚表也有了。

刚才说的是有关虚函数的一些使用了,那么有了虚函数之后,他还会影响的就是我们的:对象模型。在类中如果有虚函数的话,那么在创建对象的时候,就会在对象模型的前4个字节多出来,用来存放虚表的指针,用虚表的指针就能获得虚表,虚表里面存放的就是我们的虚函数。这个里面虚函数的存放顺序是按照声明的顺序存放的。这是单个基类的虚表情况。

在派生类中,如果基类有虚函数,且派生类重写了虚函数,那么其虚表中虚函数的存放规则是这样的:

①现将基类的虚函数拷贝一份

②如果派生类中对基类中的虚函数进行了重写,那么派生类的虚函数将替代相同偏移量位置的基类的虚函数

③如果派生类中新增加自己的新函数,那么就按照在派生类中声明的次序,依次存放到虚表中。

当然了,每一个对象只能有一个虚表,此时派生类的对象模型中就只有一个派生类的虚表。

2、C++中引用和指针的区别

相同点:就是他们俩都指向了内存,而指针值指向的是内存的地址,引用则是内存的别名。

不同点:指针是可以改变值,引用不能被改变值

Sizeof(引用)获得是引用变量的大小,sizeof(指针)是固定值,32位机器上是4字节,64位机器是8字节了

引用是类型安全的,指针不是类型安全的,比如父类指针指向子类对象

3、有关字节对齐

首先我们要先看一下字节对齐的规则:

  1. 结构体中每一个成员储存地址的偏移量,是当前成员类型大小的整数倍,不够就在前一个成员变量的偏移量中补空字节
  2. 结构体总大小,是结构体字节对齐之后大小的整数倍,不够就在后面补空字节

光说可能不是很明了,所以我们举个例子:

这么一个结构体:char a,  int a,  double c

不字节对齐的结果就是1+4+8 = 13字节,

字节对齐之后,先放一个字节的a,再放4个字节的b,但是因为放好a之后,偏移量就成了1,1不是4的倍数,所以给a的偏移量补齐3个空字节,这个时候,b就可以在偏移量为4的起始地址存放,存放完成之后,继续存放double类型的c,因为现在偏移量已经到了8,所以可以直接存放double类型的c。

  此时整个过程算下来就4+4+8 = 16字节了。

  那么我们为什么要字节对齐呢?那一定是为了读取效率。因为计算机在读取数据的时候,不是一个字节一个字节读取,而是一次读取一个字节块,如果说按照我们

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值