C/C++面试题

C和C++的区别

1、C是一个面向过程的结构化语言,考虑如何通过一个过程对输入进行处理得到输出;

C++是面向对象的语言,包含:封装、继承和多态特征。封装隐藏了实现细节,使得代码模块化;派生类可以继承父类的数据和方法,扩展了已经存在的模块,实现了代码重用;多态则是“一个接口,多种实现”,通过派生类重写父类的虚函数,实现了接口的重用。

2、C和C++动态管理内存的方法不一样,C是使用malloc/free,而C++除此之外还有new/delete关键字。

3、C++支持函数重载,C不支持函数重载

4、C++中有引用,C中不存在引用的概念

#include<file.h> #include "file.h" 有什么区别

前者是从标准库路径寻找,后者是从当前工作路径

C++文件编译与执行的四个阶段

(1)预处理:根据文件中的预处理指令来修改源文件的内容

(2)编译:编译成汇编代码

(3)汇编:把汇编代码翻译成目标机器指令

(4)链接:链接目标代码生成可执行程序

深拷贝和浅拷贝的区别

深拷贝和浅拷贝可以简单的理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,如果资源重新分配了就是深拷贝;反之没有重新分配资源,就是浅拷贝。

哪些成员函数不能被继承

(1)构造函数

(2)析构函数

(3)赋值运算符重载函数

多态,虚函数,纯虚函数概念

多态

是对于不同对象接收相同消息时产生不同的动作。C++的多态性具体体现在运行和编译两个方面:

(1)在程序运行时的多态性通过继承和虚函数来体现;

(2)在程序编译时多态性体现在函数和运算符的重载上;

虚函数

在基类中冠以关键字 virtual 的成员函数。 它提供了一种接口界面。允许在派生类中对基类的虚函数重新定义。

纯虚函数

在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。作为接口而存在 纯虚函数不具备函数的功能,一般不能直接被调用。

从基类继承来的纯虚函数,在派生类中仍是虚函数。如果一个类中至少有一个纯虚函数,那么这个类被称为抽象类(abstract class)。

抽象类中不仅包括纯虚函数,也可包括虚函数。抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。但仍可使用指向抽象类的指针支持运行时多态性。

#define和const有什么区别

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

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

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

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

delete与 delete []区别

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

(2)delete与new配套使用,delete []与new []配套使用

new、delete、malloc、free关系

delete会调用对象的析构函数,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

数组和指针有什么区别?

(1)数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。

(2)用运算符sizeof 可以计算出数组的容量(字节数)。sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。

指针和引用有什么区别?

(1)引用是变量的一个别名,内部实现是只读指针

(2)引用只能在初始化时被赋值,其他时候值不能被改变,指针的值可以在任何时候被改变

(3)引用不能为NULL,指针可以为NULL

(4)引用变量内存单元保存的是被引用变量的地址

(5)“sizeof 引用" = 指向变量的大小 , "sizeof 指针"= 指针本身的大小

(6)引用可以取地址操作,返回的是被引用变量本身所在的内存单元地址

(7)引用使用在源代码级相当于普通的变量一样使用,做函数参数时,内部传递的实际是变量地址

简单介绍一下STL库的容器和算法

STL包括两部分内容:容器和算法。

容器即存放数据的地方,比如array, vector,分为两类,序列式容器和关联式容器

序列式容器:其中的元素不一定有序,但是都可以被排序,比如vector,list,queue,stack,heap, priority-queue, slist

关联式容器:内部结构是一个平衡二叉树,每个元素都有一个键值和一个实值,比如map, set, hashtable, hash_set

算法有排序,复制等,以及各个容器特定的算法

迭代器是STL的精髓,迭代器提供了一种方法,使得它能够按照顺序访问某个容器所含的各个元素,但无需暴露该容器的内部结构,它将容器和算法分开,让二者独立设计。

STL中unordered_map和map有什么区别?

map是STL中的一个关联容器,提供键值对的数据管理。底层通过红黑树来实现,实际上是二叉排序树和非严格意义上的二叉平衡树。所以在map内部所有的数据都是有序的,且map的查询、插入、删除操作的时间复杂度都是O(logN)。

unordered_map和map类似,都是存储key-value对,可以通过key快速索引到value,不同的是unordered_map不会根据key进行排序。unordered_map底层是一个防冗余的哈希表,存储时根据key的hash值判断元素是否相同,即unoredered_map内部是无序的。

STL中map和set的原理

map和set的底层实现主要通过红黑树来实现

红黑树是一种特殊的二叉查找树

(1)每个节点或者是黑色,或者是红色 

(2)根节点是黑色

(3) 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点]

(4)如果一个节点是红色的,则它的子节点必须是黑色的

(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

特性4、5决定了没有一条路径会比其他路径长出2倍,因此红黑树是接近平衡的二叉树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鸭文库

你的鼓励是我前进的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值