C++常考面试题

1、static关键字的作用(改变生命周期或者改变作用域)

(1)static变量只会初始化一次,存储在静态数据区,具有记忆功能,默认初始化为0;

(2)类的静态成员变量属于本类中的所有对象共享,不属于特定的类对象,由该类型的所有对象共享访问,只能在类外初始化;

(3)类的静态成员函数也是属于整个类,而非类的对象,不接收this指针,因而只能访问类的静态成员变量;

(4)模块内的静态全局变量可以被模块内的所有函数访问,但不能被模块外的其他函数访问;

(5)模块内的静态函数只能被这一模块内的其它函数调用,这个函数的使用范围限制在声明它的模块内。


2、const的作用(只读)

(1)定义的const变量,具有不变性,保护被修饰的东西;

(2)进行类型检查;

(3)节省内存空间,const定义的常量在运行过程中只有一份复制品;

(4)用于函数重载。


3、构造函数和析构函数能是虚函数吗?

构造函数不能为虚函数,而析构函数可以并且通常是虚函数。在构造函数和析构函数里都尽量不要调用虚函数。

虚函数就是为了动态对象动态调用,在构造基类对象时,此时的派生类都没有初始化,这里的动态动态绑定派生类对象显然有问题。说在构造函数中尽量不要调用虚函数的意思是,允许调用,但是调用的结果可能往往不是我们想要的,原因也是这样。

析构函数声明为虚函数,这样派生类调用析构函数才会层层回调,释放资源。如果不是虚函数,它只会根据指针的类型执行调用,也就是说析构函数如果不是虚函数,那么在多态中,派生类的析构函数可能不会被调用,造成内存泄漏。


4、C/C++的区别

首先说联系,C是C++的一个子集,C++兼容C。

再说区别:

C是结构化的语言,重点在数据结构和算法,设计思想是考虑对输入进行处理得到输出;C++是支持面向对象的,首先考虑如何构造一个对象模型,让这个模型适合解决相应的问题。设计思想上的区别是最大的区别。

此外,C++支持泛型编程(发明一种语言机制,通过一套代码,实现一个通用的标准容器库,通俗点讲,就是把对象类型作为参数传递)。

当然两者之间还有很多细节上的区别。


5、c++中class和struct的区别

(1)默认访问权限不同,class默认是private,struct默认是public;

(2)默认继承权限不同,class默认是private,struce默认是public。

(3)class可用于定义模板,但是struct不能;

(4)struct是为了兼容C,所以它的用法也是兼容C的,如对结构体直接赋值等操作,class不能。


6、C和C++中的struct的区别

C++中struct有访问权限,而C中没有;

C++中struct有成员函数,C中没有,只能有变量;

C++中可以有虚函数、多态,而C中没有。


7、C++面向对象的特征

面向对象的三个基本特征是:封装、继承、多态。

封装:就是把客观事物抽象成类,每个类对自身的数据和方法进行保护(操作和信息隐藏);

继承:使用现有类的所有功能,而不需要编写原来的类,目的是支持代码复用和多态;

多态:指同一个实体具有多种形式,主要体现在类的继承体系中,简单说就是允许将子类类型的指针赋值给父类类型的指针,父类对象就可以以不同的方式运行。

封装可以隐藏实现细节,使代码模块化;继承可以扩展已有的代码模块,实现代码复用;而多态实现了接口复用。


8、重载、覆盖和隐藏

重载:同一类中,函数名字相同,参数不同,virtual关键字可有可无;

覆盖:分别位于派生类和基类中,函数名字相同,参数相同,基类中函数必须有virtual关键字(与重载的区别--不同类);

隐藏:如果派生类中的函数与基类中的函数同名,但是参数不同,此时无论有无virtual,基类的函数被隐藏;如果派生类的函数与基类函数重名,并且参数也相同,但是基类函数无virtual关键字,此时也被隐藏(与覆盖的区别--virtual关键字)


9、多态的实现

C++中,实现多态有几个方法:虚函数,抽象类,覆盖,模板等。

主要还是通过虚函数来实现多态。虚函数的本质是通过基类访问派生类定义的函数,每一个含有虚函数的类的对象,内部都有一个虚函数指针。该虚函数指针被初始化为本类的虚函数表的内存地址。不管对象类型如何转换,对象内部的虚函数表的指针是固定的,这样就可以实现动态的对对象函数进行调用。


10、什么函数不能什么为虚函数

(1)只有类的成员函数才能声明为虚函数;

(2)静态成员函数不能声明为虚函数;

(3)内联函数不能声明为虚函数;

(4)构造函数不能是虚函数;

(5)析构函数可以为虚函数,而且最好是虚函数。


11、静态链接和动态链接的区别

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。  

采用静态链接,会将lib中的代码指令直接包含进最后的可执行文件中,导致最后的可执行文件体积大,但是运行时无需再需要lib的支持;而动态链接则相反,运行时需要lib的支持,而且程序可以动态的装载和卸载lib。

此外,另一个区别是静态链接库中不能再包含静态链接库或者动态链接库,而动态链接可以再包含其他的动态或静态的链接。


12、纯虚函数的作用

主要由两个:

(1)含有纯虚函数的类是不能初始化的,所以如果想让某些类不被初始化,可以使用纯虚函数;

(2)纯虚函数在派生类中必须被实现,所以,纯虚函数的另一个功能就是制定规范,要求派生类必须实现这些接口函数。这个特性类似java中接口。

如果纯虚函数没有在派生类中实现会怎么样:编译报错!(坑。。。)


13、什么时候用指针,什么时候用引用?

这个问题我觉得真的不好回答,面试时直接说的是要根据运用场景。。。。。。有些引用实现就是常量指针。。。。。。。

引用的特点就是初始化后无法再修改,而指针是可以再修改的,所以从这个方面来说,如果想要这个对象不改变,可以考虑用引用,如果这个对象会改变,那就考虑用指针。


14、为什么拷贝构造函数的形参必须是引用?

如果是值传递,那么本身就是一次拷贝过程,需要调用拷贝构造函数,从而陷入无穷循环调用。而指针传递本质上来讲也是一种值传递。


15、top N问题的解决思路

这类问题我觉得很多面试官问的不够专业,都没有说明数据量很大。数据量很小的话我是不是可以直接排序?

数据量大时可以采用:(1)hash法,把数据分成几个部分;(2)分治法,也是先把数据分成几个部分

数据量小时:(1)快排,每次排序循环根据得到的枢纽值得位置调整;(2)直接排序算法

通用:最大/最小堆,思路就是如果想要前n个数,可以维护一个容量为n的最大/最小堆(可以用stl里的优先级队列、堆算法),每次取出堆顶元素和剩下的元素比较来决定是否替换堆顶元素,所有数据遍历完成后,堆里的数据就是top n数据。


自己的总结。。。可能有误。。。待续!

你可能感兴趣的:(C++常考面试题)