最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

天天快资讯:C++面经(持续更新)

来源:博客园

一. c,c++区别<九大点>

    c: 面向过程c++: 面向对象(封装,继承,多态)对象:对数据和作用于数据的操作组成的封装实体类:描叙了一组有相同属性和方法的对象<虚拟>对象为类的实例化,类为对象的抽象

      c: 不支持函数重载c++: 支持函数重载<_Z + len(函数名) + 函数名 + 参数类型首字母> int add(int,int) -> _Z3addii原因与对函数名修饰规则有关

        c: 函数参数为空表示可传任意参数,不传参数需加voidc++: 函数参数为空表示无法传递参数


        (相关资料图)

          c: struct中不能有函数c++: struct中可以有函数

            c:不支持函数参数给定默认值c++:支持函数参数给定默认值

              c: 不支持引用c++: 支持引用

                c: 不支持内联函数c++: 支持内联函数

                  c: 采用malloc,free管理堆空间c++: 采用new, delete管理

                    c: 仅有全局,局部两个作用域c++: 有全局,局部,类,namespace作用域

                    二. 四种类型转换

                    1.static_cast: 静态转换,用于基类派生类引用和指针的转换<向上安全,向下不安全>;基本数据类型转换<无动态检查>

                    2.dynamic_cast:动态转换,拥有动态检查,向下转换更安全

                    3.const_cast:常量转换,常量转非常量<去常量>

                    4.reinterpret_cast:重新解释,随意转换,最不安全

                    三. c++引用概念

                    1.引用可看做的数据的别名<类似快捷方式>

                    2.引用必须引用合法空间,定于必须初始化,绑定后不许更换<本质为指针常量>

                    四. 指针常量,常量指针

                    1.指针常量:int* const p,指针本身值不可变,始终指向同一地址,定于必须初始化

                    2.常量指针:const int* p,指向“常量”,可指向其他地址,但不能修改内容

                    ......const... 指针常量...const...... 常量指针<从左往右读>

                    五. 内联函数作用<特点>

                    1.inline关键字,避免函数调用带来的开销,如果内联函数太复杂,编译器忽略

                    2.原理:预处理时,调用inline会将语句复制在调用处<还能解决宏定义问题>

                    六. new 的实现原理,new 和 malloc 的区别

                    1.new原理:简单类型直接调用operator new(),new()调用malloc函数,如果失败则调用_callnewh(),如果返回0则抛异常bac_alloc;复杂类型(类),先调用new(),然后在分配的内存上调用构造函数

                    2.两者区别:new为操作符,malloc为函数;new无需确定内存大小,malloc则需要指出大小;分配失败一个抛出异常一个返回NULL;new会调用构造函数,malloc不会;new可以重载,malloc不行;new从自由存储区分配内存,malloc从上动态分配<两者有包含关系,两者区别>;malloc可以用realloc重新分配内存实现扩充,new没有

                    七. 重载,复写,隐藏的区别

                    1.重载:同一作用域,同名函数的形参不同,构成函数重载,与返回值无关

                    2.重写:派生类与基类同名、同返回值、同参的虚函数重定义,构成虚函数覆盖<重写>

                    3.隐藏:不同作用域,同名函数构成隐藏,比如派生类成员函数隐藏与其同名的基类成员函数隐藏的实质是:在函数查找时,名字查找先于类型检查。如果派生类中成员和基类中的成员同名,就隐藏掉。编译器首先在相应作用域中查找函数,如果找到名字一样的则停止查找。

                    八. C++ 中智能指针和指针的区别是什么?

                    1.智能指针是普通指针加上一层封装,本质是一个类模板,可以自动释放所指内存;而普通指针是一种基本类型,需要自己手动释放内存

                    九. 简述一下 C++ 中的多态

                    1.多态是同一个事物在不同场景下的多种形态。多态分为静态多态和动态多态。

                    2.静态多态:编译器在编译期间完成的,根据实参类型来选择调用函数<函数重载,运算符重载,泛型编程等>

                    3.动态多态:程序在运行时根据基类的引用(指针)指向的实际对象来确定具体调用哪一个虚函数<条件:在继承关系中,有对虚函数的重写,且使用基类引用(指针)指向不同对象>

                    十.为什么将析构函数设置成虚函数

                    1.主要是防止内存泄漏,在基类指针指向派生类对象时,如果基类析构函数没有声明为虚函数,则基类指针释放时不会调用派生类析构函数,如果派生类中有对内存的释放,就会造成内存泄漏<构造函数不能为虚函数,如果构造函数是虚函数,就需要vptr指定,而此时vptr本身还未初始化,构成矛盾>

                    十一.简述一下堆和栈的区别

                    1.管理方式:栈是由编译器自动管理,而堆得分配和释放都是程序员控制的

                    2.空间大小:栈空间小于堆,堆内存几乎没有什么限制,而栈一般有一定大小

                    3.碎片问题:栈是先进后出的数据结构,内存不存在碎片化,而堆由程序员控制,频繁操作会导致内存空间不连续,产生大量内存碎片

                    4.生长方向:栈生长方向向下,沿内存地址减小方向增长,堆则是向上,向内存地址增大方向增长

                    5.分配方式:堆空间都是动态分配,没有静态分配的堆。而栈有静态分配和动态分配,但都是由编译器自动管理的,动态分配可用alloca函数

                    6.分配效率:栈是机器系统提供的数据结构,有底层支持,因此栈的效率很高。堆是由c/c++函数提供的,机制复杂,效率低。

                    十二.请你介绍一下死锁,产生的必要条件,产生的原因,怎么预防死锁

                    1.死锁:两个或两个以上的进程在执行过程中,因争夺共享资源而造成的一种相互等待的现象,若无外力作用,它们将无法推进下去,此时系统处于死锁状态。

                    2.必要条件:互斥,进程对资源占有具有排它性,其他进程请求该资源只能等待,直至释放;请求和保持,进程已经保持至少一个资源而又提出新的请求,而该资源已被其他进程占有,此时请求阻塞,但自身资源无法释放;不抢占:进程占有的资源在未结束前不能被剥夺,只能由自身释放;循环等待:多个进程产生对占有资源请求环链

                    3.预防:打破四个必要条件的其中一条即可,有著名的银行家算法

                    关键词: 析构函数 构造函数 必要条件