C++面试经验
Posted 程序猿研究所V3
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++面试经验相关的知识,希望对你有一定的参考价值。
/ 这是我个人的面试经验 /
C++面试经验
【Date:2021.05.13】
MYLIFE
LIFERECORD
C++的三大特性?多态?
三大特性:封装、继承、多态
多态:在基类的函数前加上关键字Virtral,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是基类,就调用基类的函数,如果对象类型是派生类,就调用派生类的函数。
所谓多态就是某一种事务有不同具体的表现,具有很多种形式
原理?虚函数表
如何实现多态?
派生类继承基类时,会继承虚函数表中的元素,自己也会有一个虚函数表
多态好处?
提高了程序的扩展性。继承的基类或者接口一般是是类库中的东西,如果要修改某个方法的具体实现方式,只需要通过派生类去覆写要改变的某一个方法
弊端?
当基类引用指向子类对象的时候,虽然提高了扩展性,但是只能方位父类中具备的方法,不能访问子类中特有的方法(前期不能使用后期产生的功能,访问的局限性,但是可以通过动态转换dynamic_cast将父类准换成子类)
(向左滑动查看更多照片)
LIFERECORD
四种强制类型转换
Const_cast
Static_cast
Dynamic_cast
Reinterpret_cast
C语言版本的强制转换是通过
TypeName b = (TypeName) a 来强制转换
C++版本
const_cast
主要用于修改类型const/volatile属性,除了const或者volatile属性以外,目标类型必须与原类型相同,这种类型的转换主要用于操作所传对象的const属性,可以加上也可以去掉
static_cast
用于自然的、低风险的基本数据类型的类型转换,不能直接准化指针,可以用万能指针(void*)作为过渡进行转化
dynamic_cast
常用于子类和父类之间的类型转换,有返回值,可以惊醒安全检查
reinterpret_cast
指针类型之间的转化
LIFERECORD
define、const、inline区别
define
一个简单的字符替换,在程序进入编译器之前,就会被预处理程序处理掉
const
是C++中的一个关键字,用来指定一种语义的约束,即,别const修饰的对象,不可修改,变为只读,
inline
用于声明内联函数,对于内联函数,编译器会用别的函数体代码代替内联函数的调用语句,内联函数是建议性的,是否采用内联形式与具体的编译器有关
总的来说,define与const定义常量,实际中建议使用const.inline用于函数,但是只是建议性的,是否使用与具体的编译器有关
LIFERECORD
static关键字
static函数与普通函数:
作用域不同,static函数的作用域仅仅在本文件使用。如果要在外部文件中使用static函数,则需要声明extern xxx函数,则会调用这个静态函数,静态全局变量同理
静态局部变量:
静态局部变量在程序执行到该变量的声明处时候,会被首次初始化,以后函数调用不再进行函数初始化。静态变量一般在声明处被初始化,如果没有被初始化,会被程序自动初始化为0,静态局部变量也会一直存在全局数据区,知道程序运行结束,尽管他的作用域范围只是在程序体内(花括号中)
静态全局变量:
内存分配在全局数据区,未初始化的静态全局变量会初始化为0且只会初始化一次;静态全局变量只能在文件内访问,不能在文件外访问,在其他文件夹中定义相同的变量名,不会发生冲突
由此分析,把局部变量改变成静态变量以后改变了存储方式,改变了生存期,吧全局变量改为静态全局变量之后改变了他的作用域,限制了使用范围
LIFERECORD
设计模式(单例模式)
单例模式:
确保一个类,只有一个实例,而且自行实例化并向整个系统提供这个实例。构造方法一定不是public公开的,用private最好,而且拥有一个当前类的静态成员函数。再提供一个静态的方法,向外界提供当前类的实例。
饿汉式:
唯一实例,在类进行加载时候立刻进行实例化
懒汉式:
在类加载时候不进行实例化,在第一次使用时候进行实例化。若多线程同时使用,线程不安全
尝试使用双检查锁
以上是关于C++面试经验的主要内容,如果未能解决你的问题,请参考以下文章