C/C++ 嵌入式软开 应届生就业复盘 自用

1.malloc和new的区别
(1)new和delete是C++的关键字/运算符,malloc与free是c++/c语言的标准函数。
(2)malloc需要显式地指定分配的内存大小,new不需要。
(3)new操作符从自由存储区上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。
【注】凡是通过new操作符进行内存申请,该内存即为自由存储区。
(4)new操作符内存分配成功时,返回对象类型,无须进行类型转换,故new是符合类型安全性的操作符;malloc返回void*,需要通过强制类型转换将void*指针转换成我们需要的类型。
(5)new操作符内存分配失败时,抛出bad_alloc异常;malloc内存分配失败时返回NULL。
(6)new操作符有构造函数和析构函数,在开辟空间的同时,会调用自定义对象的构造函数来完成初始化;malloc只会开辟空间。
(7)malloc分配空间后,可以通过realloc扩张内存;new操作符则不能进行再次扩张内存的操作。
(8)new相对malloc效率要低,因为new的底层封装了malloc。

2.C语言内存分配的方式
<1>从静态存储区域分配.
内存在程序编译时就已分配好,这块内存在程序的整个运行期间都存在。
例如:全局变量、static变量.
<2>从堆上分配,亦称动态内存分配.
程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。
优点:生存期由用户决定,使用非常灵活,缺点:问题也最多。
<3>在栈上创建
 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中。
优点:效率很高,缺点:分配的内存容量有限.

3.struct与class的区别
1.class是引用类型,而struct是值类型。
2.struct不能被继承,而class可以被继承。
3.class中默认的成员访问权限是private的,而struct中则是public的。

4.const和#define的区别
1、define是预编译指令,const是普通变量的定义,define定义的宏是在预处理阶段展开的,而const定义的只读变量是在编译运行阶段使用的。
2、const定义的是变量,而define定义的是常量。define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量,系统只会给变量分配内存。但const定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元。可以说,常变量是有名字的不变量,而常量是没有名字的。有名字就便于在程序中被引用,所以从使用的角度看,除了不能作为数组的长度,用const定义的常变量具有宏的优点,而且使用更方便。所以编程时在使用const和define都可以的情况下尽量使用常变量来取代宏。
3、const定义的是变量,而宏定义的是常量,所以const定义的对象有数据类型,而宏定义的对象没有数据类型。所以编译器可以对前者进行类型安全检查,而对后者只是机械地进行字符替换,没有类型安全检查。这样就很容易出问题,即“边际问题”或者说是“括号问题”。

5.vector和list的区别
1.vector底层实现是数组,list是双向链表
2.vector支持随机访问,list不支持
3.vector是顺序内存,list不是
4.vector在中间节点进行插入数据会导致内存拷贝,list不会
5.vector一次性分配好内存,不够时才进行2倍扩充,list每次插入新节点都会进行内存扩充
6.vector插入删除性能差,list插入删除性能好

6.各个stl的底层实现
1、vector 为数组,支持快速随机访问
2、list底层为 双向链表,支持快速增删
3、deque是中央控制器和多个缓冲区
4、stack底层一般用list和deque实现
5、queue一般使用list和deque实现,封闭头部
6、priority_queue使用vector为底层容器,使用heap来管理规则
7、set底层为红黑树,有序不重复 multiset可重复
8、map底层为红黑树,有序不重复 multimap可重复
9、hash_set底层为hash表,无序不重复
10、hash_map底层为hash表 无序不重复

7.动态绑定与静态绑定
1.静态绑定是在编译时确定的,而动态绑定是在运行时确定的。
2.动态绑定就是继承虚函数
3.静态绑定就是函数重载

8.多态实现的三个条件、实现的原理
多态的概念:
多态,通俗来讲就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。比如,在买票这一行为,普通人买票是全价买票,学生买票是半价买票,而军人买票是优先买票;再比如动物园的动物叫这个行为,不同的动物叫声是不一样的。这些都是生活中多态的例子。

条件:有继承、有虚函数(virtual)重写、有父类指针(引用)指向子类对象。
实现原理:当类中声明虚函数时,编译器会在类中生成一个 虚函数表;虚函数表是一个储存 类成员函数指针的数据结构;virtual成员函数会被编译器放入虚函数表中。存在虚函数时,在创建的每个对象中都有一个指向虚函数表的指针(vptr指针)函数在运行的时候会重写这个虚函数。

总结:C++多态的目的在于当我们使用父类的指针或者引用去接收子类的对象后,接收不同的子类对象的父类指针或者引用调用的相同的函数产生的结果不同。
重点在于实现多态的几个条件:
一是用父类的指针或者引用来接收。
二是子类必须对父类的虚函数进行重写。

9.析构函数一般写成虚函数的原因
由于类的多态性,基类指针可以指向派生类的对象。如果删除该基类的指针,就会调用该指针指向的派生类的析构函数,而派生类的析构函数又会自动调用基类的析构函数,这样整个派生类的对象被完全释放。

10.构造函数不能是虚函数的原因
虚函数相应一个指向vtable虚函数表的指针,但是这个指向vtable的指针事实上是存储在对象的内存空间的。假设构造函数是虚的,就须要通过 vtable来调用,但是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。

11、抽象类与纯虚函数
纯虚函数: 一个函数只有函数名和形参列表,没有具体实现。
抽象类: 在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象。抽象类是不完整的,它只能用作基类。
之前学过虚函数,语法:virtual 返回值类型 函数名(参数列表),然后这个类也就变成的虚基类,然后子类重写父类的虚函数。
补充:纯虚函数,语法:virtual 返回值类型 函数名(参数列表)=0,当类中有了纯虚函数,这个类也称为抽象类。抽象类特点:无法实例化对象,子类必须重写抽象类中的纯虚函数,否则也属于抽象类。

12、重载、覆盖
重载是参数类型或者个数不同,覆盖是子类重写父类函数。

13、栈和队列
1、规则:栈先入后出,队列先入先出
2、插入删除定义不同:栈只能在一端插入和删除,队列只能在一端插入另一端删除

14、strcpy和memcpy的区别
(1)复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
(2)复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
(3)用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。

15、了解智能指针吗?
主要4个,auto_ptr(C++ 98)、unique_ptr、shared_ptr 和weak_ptr(C++ 11)
auto_ptr :现在用的少,老版C++用,能自动释放。
unique_ptr: 两个unique_ptr 不能指向一个对象,即 unique_ptr 不共享它所管理的对象,并可以放在容器中。
shared_ptr:shared_ptr 是一个标准的共享所有权的智能指针,允许多个指针指向同一个对象,shared_ptr 利用引用计数的方式实现了对所管理的对象的所有权的分享,即允许多个 shared_ptr 共同管理同一个对象。比较麻烦,需要自己写辅助类。
weak_ptr: weak_ptr 是为了配合 shared_ptr 而引入的一种智能指针,它更像是 shared_ptr 的一个助手而不是智能指针,因为它不具有普通指针的行为,没有重载 operator* 和 operator-> ,因此取名为 weak,表明其是功能较弱的智能指针。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值