20170328_C++程序员必备的20个知识点——部分1

20170328_C++程序员必备的20个知识点


1、请用简单的语言告诉我C++是什么?

(1)C++ 是在C 语言的基础上开发出的一种面向对象的编程语言。它支持多种编程范式,包括面向对象编程、泛型编程以及过程化编程。

(2)C++有许多新的特性,包括支持类、封装、继承、多态、容器、迭代器、泛型编程与泛型算法、模板编程等。十分适合系统开发。

2、C 和C++ 的区别在哪里?

(1)参考博客:20170326_请说出C 与C++ 的区别。

3、什么是面向对象(OOP)?

(1)面向对象,指的是一种对现实世界的理解和抽象的方法,通过将需求要素转化为具体的对象进行问题处理的一种思想

4、什么是多态?

(1)参考博客:20170326_请说出C 与C++ 的区别。

5、设计模式懂么?举个例子!

(1)设计模式,指的是一套在程序设计中被反复使用的代码设计经验总结。总共有 23 种设计模式。

(2)比如:单例模式。指的是,保证一个类只有一个实例,也即对象,并且仅提供一个访问它的全局访问点。

适用于:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。当这个唯一的实例应该是通过子类化可扩展的,并且客户应该无需要更改代码就能使用一个扩展的实例时。

(3)比如:工厂模式。指的是,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使得一个类的实例化延迟到它的子类。

适用于:当一个类不知道它所必须创建的对象的类的时候。当一个类希望由它的子类来指定它所创建的对象的时候。当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

6、STL库用过吗?常见的STL容器有哪些?泛型算法用过么?

(1)STL,指的是标准模板库。它包含两部分内容:容器和算法。另外,还有一个很重要的是迭代器,它用来融合容器和算法。

(2)容器,可以分为顺序容器和关联式容器。

其中,

a、常用的顺序容器有 6 个,分别是:可变大小数组 vector、双端队列 deque、双向链表 list、单向链表 forword_list、固定大小数组 array、字符串容器 string。里面存放的元素不一定是有序的,但都可以进行排序。

b、常用的关联式容器有 8 个,分别是:按关键字有序保存元素的 map、set、multimap、multiset,以及无序集合 unordered_map、unordered_set、unordered_multimap、unordered_multiset。

其中,

a、unordered_map 是用哈希函数组织的 map、它是关键字—值对、关键字不可重复。

b、unordered_set 是用哈希函数组织的 set它是关键字即值的容器、关键字不可重复。

c、unordered_multimap 是哈希组织的 map、它是关键字—值对、关键字可以重复。

d、unordered_multiset 是哈希组织的 set它是关键字即值的容器、关键字可以重复。

(3)各举一例:

a、vector:它是一个动态分配存储空间的顺序容器,区别于静态分配存储空间的数组 array。对于array,其空间大小在分配之后不可改变。对于 vector,其空间大小是会根据需要自动重新分配或者说扩展的。

b、map:它是一个内部的元素会按照关键字的大小自动进行排序的关联式容器,里面存放的元素类型是 pair,即“关键字—值”对。它区别于 set,set 里面存放的元素也是会按照关键字的大小自动进行排序,但是它存放的只有“关键字,即值”。

(4)泛型算法:泛型算法有很多,比如排序、复制、累加求和等。

(5)迭代器迭代器是STL 的精髓所在,可以这样描述它:迭代器提供了一种方法,使它能够按照顺序依此访问容器当中的各个元素,但无需暴露出该容器的内部结构。

7、数据结构会么?项目开发过程中主要用到那些?

(1)数据结构主要包括:

a、线性表:顺序表、单链表、双链表、循环链表

b、栈:顺序栈、链栈

c、队列:循环队列、链队列

d、串:顺序串——数组、链串——单链表

e、树:二叉树、完全二叉树、满二叉树、斜树、哈夫曼树、排序二叉树BST、平衡二叉树AVL、红黑树RB树

f、图:有向图、无向图

(2)数据结构中主要用到的是数组、链表、树(较少),也会用到栈和队列的思想。

8、类中的 const 关键字知道么?解释其在类中的作用。

(1)在类中,数据成员可以用 const 来修饰,表示该数据成员是常量,不可被修改成员函数也可以被 const 修饰,表示该成员函数是常成员函数,在该函数内部是不能修改类内的数据成员的

(2)同时,类的 const 成员函数只能调用const成员函数,而非 const 成员函数既可以调用非 const成员函数也可以调用 const成员函数

(3)如果使用 const 进行函数重载,那么 const 对象只能调用 const 函数,而非 const 对象优先调用非 const 函数。

另外需要注意的是,仅当 const参数 是一个指针或者引用时,C++才允许基于 const类型 进行函数重载。

(4)在类体外定义的 const 函数,在定义处和声明处都要加上 const 修饰符。

9、类的 static  变量什么时候初始化?函数的 static 变量在什么时候初始化?

(1)类的 static变量 在类进行实例化之前就已经存在了,并且被分配了内存,它的默认初始值是 0 值。同时,它和类的 static 函数一样,不依赖于类的对象而存在,也就是说,它们在只占据一份内存空间,只存在一份,属于该类的所有的对象都共同拥有使用。

(2)而函数的 static 变量是在执行这个函数时进行初始化的,它的默认初始值也是 0 值。同时,它下一次的值是依据上一次的结果值而定的。

(3)PS:

a、static 全局变量与普通的全局变量有什么区别:static 全局变量只被初使化一次,防止在其他文件单元中被引用。

b、static 局部变量和普通的局部变量有什么区别:static 局部变量只被初始化一次,下一次的值是依据上一次的结果值。

c、static 函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中都维持一份拷贝。

10、堆和栈的区别?堆和栈的声明周期是什么?

(1)参考博客:20170327_请说出C++中的内存分区。

(2)分配与释放

a、堆: 一般由程序员手动分配与释放的, 若程序员不主动释放,则在程序结束时可能由 OS 回收,分配方式类似于数据结构中的链表。

b、栈:栈是由操作系统自动分配与释放的 ,里面存放的是函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。

(3)使用的缓存

a、堆: 使用的二级缓存,生命周期由虚拟机的垃圾算法来决定,并不是一旦成为孤儿对象就能被操作系统回收,所以调用这些对象的速度相对来说会比较慢一点。

b、栈:使用的是一级缓存,它们通常都是在被调用时装入内存空间,调用完毕后立即被释放的。


你可能感兴趣的:(C++程序员面试宝典)