C++面试题

156次阅读
没有评论

共计 2297 个字符,预计需要花费 6 分钟才能阅读完成。

1.STL标准模板库

是“Standard Template Library”的缩写,中文译为“标准模板库”。STL 是 C++ 标准库的一部分,

容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。

vector,动态增长的数组,有指针指向连续的空间,会申请一片更大的空间,拷贝原数据,释放旧空间。当删除的时候空间并不会被释放,只是清空了里面的数据。对比array是静态空间一旦配置了就不能改变大小。

vector的动态增加大小的时候,并不是在原有的空间上持续新的空间(无法保证原空间的后面还有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,并释放原空间。在VS下是1.5倍扩容,在GCC下是2倍扩容。

list分为arraylist和linkedlist,arraylist为数组实现,可以快速访问,但插入移除很慢,linkelist对顺序读取做了优化,插入快,随机访问慢
算法:各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function tempalte.
迭代器:扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。
仿函数:行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template
适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
空间配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte.

标准关联容器set、mulitiset、map、multimap使用红黑树

hash_map和map:hash_map需要hash函数,而map只需要比较函数,hash_map使用hash表存储,而map采用红黑树实现

2.tcp和udp区别

  1. tcp是面向连接的,而udp是无连接的
  2. tcp是可靠的,udp是不可靠的
  3. TCP保证数据顺序,UDP不保证

3.面向对象的基本概念

面向对象的基本概念有对象、类、抽象、封装、继承、多态、接口等

封装:封装就是将实例抽象得到的数据和行为(或功能)封装成一个类。封装隐藏了实现细节,使得代码模块化

继承:子类继承父类

多态:多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。多态则是“一个接口,多种实现”,分为静态多态和动态多态,静态多态为重载,动态多态利用虚函数实现。

4.C和C++内存分配问题

C的内存基本上分为4部分:静态存储区、堆区、栈区以及常量区。他们的功能不同,对他们使用方式也就不同。

1.栈 ——由编译器自动分配释放;

2.堆 ——一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收;

3.全局区(静态区)——全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量

和未初始化的静态变量在相邻的另一块区域(C++中已经不再这样划分),程序结束释放;

4.另外还有一个专门放常量的地方,程序结束释放;

5.虚函数

C++中虚函数使用虚函数表和 虚函数表指针实现,虚函数表是一个类的虚函数的地址表,用于索引类本身以及父类的虚函数的地 址,假如子类的虚函数重写了父类的虚函数,则对应在虚函数表中会把对应的虚函数替换为子类的 虚函数的地址;虚函数表指针存在于每个对象中(通常出于效率考虑,会放在对象的开始地址处), 它指向对象所在类的虚函数表的地址;在多继承环境下,会存在多个虚函数表指针,分别指向对应 不同基类的虚函数表。

6.C++11 线程中的几种锁

C++11线程中的几种锁,线程之间的锁有:互斥锁、条件锁、自旋锁、读写锁、递归锁。(C++标准库提供了std::recursive_mutex)

互斥锁(Mutex)头文件:< mutex >类型: std::mutex

7.lambda表达式

[函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}

C++面试题

std::vector<int> some_list;
int total = 0;
int value = 5;
std::for_each(begin(some_list), end(some_list), [&, value, this](int x)
{
    total += x * value * this->some_func();
});

8.#define和const的区别

1)#define定义的常量没有类型,所给出的是一个立即数;const定义的常量有类型名字,存放在静态区域

2)处理阶段不同,#define定义的宏变量在预处理时进行替换,可能有多个拷贝,const所定义的变量在编译时确定其值,只有一个拷贝。

3)#define定义的常量是不可以用指针去指向,const定义的常量可以用指针去指向该常量的地址

4)#define可以定义简单的函数,const不可以定义函数

9.delete和delete[]的区别

delete只会调用一次析构函数,而delete[]会调用每个成员的析构函数

用new分配的内存用delete释放,用new[]分配的内存用delete[]释放

正文完
 
admin
版权声明:本站原创文章,由 admin 2022-03-03发表,共计2297字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码