马上面临毕业了,感觉自己还啥也不会,特将C/C++ 常见的面试题整理如下:
1)C++是什么,他与C语言的区别:
首先自己想到肯定是c是面向过程的,而c++是面向对象的一种语言,并且c++是c的扩展。C++在C的基础上增添类,C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。面向对象是一种对现实世界理解和抽象的方法、思想,通过将需求要素转化为对象进行问题处理的一种思想。
2)什么是多态:
多态是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态。
3)STL库,常见的STL容器,用过那些算法:
STL分为三类 算法 容器 迭代器。
容器主要分为二类 序列式容器:每个元素都有固定位置,取决于插入时机和地点,和元素值无关如: vector,deque, list
关联式容器:元素位置取决于特定的排序准则,和插入顺序无关 如:set, multiset, map, multimap
算法主要分为四类:非可变序列算法:指不直接修改其所操作的容器内容的算法,如计数算法 count count_if
搜索算法 search find find_if find_first_of
比较算法 equal mismatch lexicographical_compare
可变序列算法:指可以修改它们所操作的容器内容的算法,如 删除算法,修改算法,排序算法
排序算法:包括对序列进行排序和合并的算法,搜索算法以及有序序列上的集合操作。
数值算法:对容器进行数值计算
迭代器:提供了一种方法,使它能够按照顺序访问某个容器所含的各个元素,但无需暴露该容器的内部结构。它将容器和算法分开,好让这二者独立设计。
4)关键字的解释:
static关键字
1.用于局部变量定义,表示其为静态局部变量,只被初始化一次,之后每次调用函数时,改变量的值为上次函数退出时的值
2.用于全局变量或者函数定义,表示该变量为静态全局变量,作用域为当前文件,即有二个源文件a.c和main.c 同时编译,则a.c中的函数或者变量会被main.c调用,但是若在a.c中的变量或者函数加上关键字static之后,则main.c无法调用。
3.用于数据成员。
1.静态成员可供所有对象访问,只分配一次内存,也只有一份拷贝,对于每个对象都是一样,它的值可以更新;
2.静态成员存储在全局数据区,因此不能在类的声明中定义,初始化规则:<数据类型><类名>::<静态数据成员名> = <值>,在使用前必须初始化;
3.访问:通过对象或者类名来访问;访问符和普通成员一样:public、protected、private;
作用:实现全局性,但不会与程序中其他全局名字冲突,与private搭配,可实现信息隐藏。
4.用于成员函数:
1.与静态成员类似,它是类内部共同享用,和普通函数不同,静态成员函数没有this指针。
2.访问:与静态成员类似通过类名或对象;
3.非静态成员函数可以任意地访问静态成员函数和静态数据成员,但反过来不行;
4.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
5)内存四区模型:1.栈区:由编译器自动分配释放,存放函数的参数值,局部变量的值等。
2.堆区:一般由程序员分配释放(动态内存的申请与释放),若程序员不释放,程序结束时,可能由操作系统回收。
3.全局区:全局变量和静态变量的存储是放在一起的初始化的全局变量和静态变量在一块区域,未初始化的在相邻的另一块区域,该区域在程序结束后由操作系统释放。
常量区:字符串和其他常量的存储位置,程序借宿后由操作系统释放。
4.代码区:存放函数体的二进制代码。
6)面向对象的三大概念,三种境界(封装,继承,多态)
封装:封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(类)。封装的意义在于保护或者防止代码(数据)被我们无意中破坏。
继承:主要实现重用代码,节省开发时间。
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
7)指针和引用的区别:
1.指针是一个变量,可以改变,指针可以为空;引用是一个别名,初始化之后不能改变,引用不能为空;
2.引用使用时无需解引用(*),指针需要解引用;
3.引用没有const,指针有const;
4.“sizeof引用”得到的是所指向的变量的大小,“sizeof指针”得到的是指针本身的大小;
5.指针可以是多级的,但是引用只有一级;
6.程序为指针变量分配内存区域,而引用不需要分配内存
8)c++中有了malloc/free,为什么还需要new/delete
1.malloc与free是c++/c语言的标准库函数,new/delete是c++的运算符。它们都可用于申请动态内存和释放内存。
2.对于非内部数据类型的对象而言,用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务给malloc/free。
9)头文件中的 ifndef/define/endif是干什么用的?
防止头文件被重复包含