概述
因为之前面试准备了很久,就整理了一下常见的问题和答案,贴出来希望对大家有用。
malloc和new的区别
1.malloc分配的空间在堆上而new在自由存储区,自由存储区是专门为new操作定义的一个区。//堆是用来动态分配空间的。栈用来存储函数内部声明的变量。
2.malloc是c库里面的一个函数,分配成功的时候返回void指针,需要我们强制转换,而new是关键字,可以为任意数据类型分配内存空间,返回对象类型的指针//就像malloc分配的是一片空地,要种什么菜要干嘛都是自己决定,而new的里面已经准备好了菜和肥料,怎么用就看自己决定
3.new请求失败抛出异常,而malloc请求失败返回null
4.new时不需要指定内存大小,但是malloc需要指定类型和大小(int*)malloc(15)这样
5.new/delect需要调用构造和析构函数,但是malloc/free不用调用,实际上new的底层是用malloc写的
6.new和malloc可以被重载但是malloc不行
7.new是关键字,语言编译器支持,而malloc是库函数,需要头文件支持
C++和c的区别:
1.C+是面向对象的语言,而c是面向过程的。面向过程就是分析解决问题的步骤,然后把这些步骤一步一步进行实现,注重对过程的分析。面向对象就是把数据和方法进行封装起来,把构成问题的事分为各个对象,建立对象的目的不仅是为了解决问题还为了描述对象发生的行为。
2.面向过程的方法用函数进行数据操作,把函数和数据分开。面向对象将函数和数据封装成一个整体,一个类。更加容易维护和实现代码复用。封装,继承,多态
C++如何实现多态
多态就是一个接口,多种形态。
1.编译时的多态可以通过函数重载实现,是静态多态。而运行时候的多态通过虚函数(函数覆盖)实现,是动态多态,具体使用引用对象类型调用函数,在运行时时实现动态绑定。底层实现通过虚函数机制。
C++中动多态实现条件:
- 有继承关系
- 有虚函数覆写(override)
- 基类的指针或引用指向继承类
重载,覆盖和隐藏的区别
1.重载在同一个类里面,函数名字相同,但是传递的参数不同。
2.子类复写父类里面的函数,如果父类里面是虚函数,子类默认是虚函数。而且要求函数名,传递的参数都相同,返回的方法也一致。如果不是虚函数,那就是隐藏。
虚函数机制:
下面就不同的继承关系详解虚函数机制:
单继承
C++类定义中当定义用虚函数成员时就会触发虚函数机制,在类对象模型中就会添加一个虚表指针(vptr),指向虚函数表(vtable),虚函数表中存放着虚函数地址,放置顺序一般按照定义顺序,虚表指针的位置为了效率一般放置在类对象模型的起始位置。在一般单继承中继承类的虚函数表中,先放置的是基类的虚函数,然后放置继承类中的虚函数,对于继承类中有覆写基类虚数的,继承类中基类虚函数部分会替换成继承类覆写的虚函数。
多继承
一般多继承
一般多继承中,继承类的类对象模型中会在对象地址起始位置连续放置与基类个数想当的虚表指针,分别指向不同基类的虚函数表,对于继承类中的虚函数放置在第一个基类虚函数表里,继承类中有覆写基类虚函数的在虚函数表中替换基类虚函数。
析构函数和构造函数:
C++默认构造和虚构函数不是虚函数,因为虚函数有虚表,需要占用额外的内存空间,但是当有继承的时候就要定义成虚函数,如果不是虚函数在delect子类的时候就会类型不匹配,因为子类对象和父类对象内存不同。
C++关键字static:
- 静态成员属于整个类而不是某个对象(就像公共厕所属于整个区而不是某个客户),供所有的对象共用
- 声明在类里面但是必须初始化在类外面。因为如果定义在类里面在创建对象的时候就会对静态成员的值造成干扰。
- 静态成员可以通过类名调用,但是得静态成员不可以
- 静态成员不能引用非静态成员,因为静态成员在类实例化之前就生成了,非静态成员必须在类实例化之后才有空间,因此发生错误。非静态成员肯定可以调用静态成员,类外面的都可以调用……静态成员没有this指针,只能访问静态成员数据和函数
- 静态成员在使用前必须初始化
数组和指针的关系:
指针是一个变量,值是另一个变量的地址。一个数组名对应一个指针变量,指向数组的第一个元素但是我们可以指针++,不可以数组名++
指针和引用的区别:
引用变量是一个别名,是已存在变量的另一个名字。常用于函数参数表和函数返回值。可以通过改变形参来改变实际参数的值。
指针*可以声明指针变量,也可以获得地址的值,&用来获取地址。对于引用,&用来声明引用。
区别:
1.指针可以为空但是引用不行。
2.引用必须要一开始的时候进行初始化,但是指针不用。
3.引用是实际上是一个常量的指针。一旦初始化了一个对象,就不能随意更改。但是指针可以。
4.指针的sizeof由编译器决定,引用的sizeof得不到引用的大小空间,而是引用类型所占的空间。
c++的隐式转换是什么,怎么避免:
相关类型的转换,如编译的时候int转换为double,避免:构造函数声明为explicit,就可以避免
总结:
面试官其实还是最注重对c++底层实现的理解,问的都是很基础的问题,比如我记得当时问了一个问题是,c++在什么时候调用拷贝函数?是有三个地方:
一般会有三个地方用到拷贝构造函数:
1)建立新对象,并用同类对象初始化时;
2)函数的参数为类的对象时;
3)函数的返回值为类的参数时。
如果类中包含动态分配,那就牵扯到浅拷贝和深拷贝的问题了。
有一篇博文总结的非常棒,推荐给大家咯: http://blog.csdn.net/lwbeyond/article/details/6202256
喜欢就点个赞再走啦~ 上海交大工科小姐姐,欢迎大家交流~
最后
以上就是繁荣山水为你收集整理的free技术详解 lock_2020商汤技术岗c++面试问题及解答的全部内容,希望文章能够帮你解决free技术详解 lock_2020商汤技术岗c++面试问题及解答所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复