面经百度

xiaoxiao2022-06-11  19

new、malloc的区别

属性:运算符、函数;

参数:分配大小

返回类型:new返回对象的类型 malloc返回void(*);

分配失败:new 抛出bac_alloc异常 malloc返回NULL;

自定义类型:

new先调用operator new 函数申请足够的内存(底层使用的malloc) 然后再调用类型的构造函数,初始化成员变量,最后返回自定义的类型指针;

delete先调用析构函数,再调用operator delete函数释放内存(底层是free);

重载:new可以重载,malloc不可以重载;

内存区域:new操作符从自由存储区上为对象动态分配内存,而malloc从堆上分配内存;

delete 和delete[]区别

delete   ptr   代表用来释放内存,且只用来释放ptr指向的内存。

delete[]   rg   用来释放rg指向的内存,!!还逐一调用数组中每个对象的destructor!!

对于像int/char/long/int*/struct等等简单数据类型,由于对象没有destructor,所以用delete 和delete [] 是一样的!但是如果是C++对象数组就不同了!

new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。

C++的特性

封装:是指将客观视为抽象成类,每个类堆自身的数据和方法进行保护;类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏;

继承:可以使用现有类的所有功能,而不需要重新编写原来的类,它的目的是为了进行代码复用和支持多态;

多态:指同一个实体同时具有多种形式,主要体现在类的继承中体系中,将父类设置成为一个或更多的它的子对象相等的几乎是,赋值以后,父对象可以根据当前赋值给他的子对象的特性以不同的方式运作;简单的说就是允许子类类型的指针赋值给父类类型的指针;

编译时多态为静态多态;

运行时为动态多态;

多态的实现:虚函数,在基类函数签加上virtual关键字,在派生类中重写该函数,运行时会根据对象的实际类型来调用相应的函数,如果对象是派生类就调用派生类的函数,如果是基类就调用基类的函数;

用virtual修饰的函数叫做虚函数;虚函数肯定是类的成员函数;

存在虚函数的类都有一个一维的虚函数表,类的对象有一个指向虚函数表开始的虚指针;虚表和类是对应的;虚函数指针和对象是对应的;

多态性是一个接口的多种实现,是面向对象的核心,分为类的多态性和函数的多态性;

多态用虚函数来实现,结合动态绑定;

纯虚函数是虚函数再加上=0;

抽象类是包括至少一个纯虚函数的类;

纯虚函数;virtual void fun()=0;抽象类,必须在子类实现这个函数,也就是先有名称,没有内容,在子类中实现内容;

虚函数和纯虚函数的区别,纯虚函数可以实例化吗,虚函数的实现(同上);

构造函数和析构函数可以为虚函数吗,在父类情况下哪个可以为虚函数,哪个不可以

构造函数不可以设置为虚函数:因为构造函数是构造一个对象,虚函数是在运行期间,如果设置为虚函数,在运行期间构造对象?与构造函数的原理违背;

析构函数可以设置为虚函数;在继承关系中 父类的析构函数设置为虚函数;防止内存泄漏;

如果基类是虚析构函数;这时候看p所赋值的对象是父类的对象还是子类的对象;如果是子类的对象,先调用子类的析构函数再调用父类的析构函数;如果是基类的对象就不用调用子类的析构函数了;

如果基类不是虚析构函数;只看指针的数据类型不会去调用赋值的对象;

什么是引用,引用和指针的区别,什么是常引用,什么时候用常引用。sizeof引用和指针的时,值分别是什么

相同点:两者都是地址的概念

不同:

指针是一个实体,引用是一个别名

指针使用的时候需要解引用,引用不必;

引用只能在定义的时候被初始化一次,指针可变;

引用不能为空,指针可以为空;

sizeof得到的是引用的对象的大小,指针的为指针本身的大小为4;

自增意义不一样;

常引用:常引用声明方式:const  类型标识符  &引用名 = 目标变量名;

如果既想要提高程序的效率,又想要保护传递给函数的数据在函数中不被改变,那么这时候用常引用;

引用作为返回值 :

以引用返回函数值,定义函数时需要在函数名前加&

用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。

需要注意的点:

不能返回局部变量的引用

不能返回函数内部new分配的内存的引用。

可以返回类成员的引用,但最好是const。

结构和联合的区别

结构体和联合体都是由不同的数据类型组成的,但是在任意同一时刻,联合体中只存在一个被选中的成员,而结构体中所有的成员都存在;在结构体中所有的成员都有自己的内存空间,他们是同时存在的;一个struct变量的总长度等于所有的成员的长度之和;在联合体中所有的成员不能同时占用它的内存空间,他们不能同时存在,它的长度等于最长的成员的长度;

对联合体的不同的成员赋值会对其他的数据成员进行重写,原来的成员的值就不存在了,而对于结构体的不同的成员的赋值是互不影响的;

重载(overload)和重写(override)的区别

重载:

重写:

区别:

范围:重载是同一类,覆盖是子类和父类;

个数:覆盖只能由一个方法或者是一对方法产生,重载是多个方法之间的关系;

参数:覆盖要求参数表相同;重载要求参数表不相同;

覆盖关系中,调用的方法具体是根据对象的类型来决定;而重载是根据参数表;

什么函数可以在main函数之前执行;全局对象的构造函数;

内存管理有哪些:

常量区:bss、数据段、代码段;

栈;

他们有什么区别:(堆栈)

生长方向;

管理方式;(释放)

空间大小:堆理论上最大可达到4G但是一般不超过2G;栈windows下 2m,linux下8M;

碎片问题;

分配方式:堆动态;栈(静态:编译器完成,动态:alloc函数与堆不同 由编译器释放)。

分配效率

栈:机器系统提供,底层支持栈,分配专门的寄存器存放栈的地址,入栈出栈有专门的指令;

堆;c/C++库函数提供,机制比较复杂;

const和define的区别:

定义常量上:const带类型;

作用阶段:const 编译阶段,define:预处理阶段;

作用方式:const有类型检查;

占用空间(存储区域):define代码段、const数据段;

调试:define不可以调试;

再定义;

防止头文件重复引用;

map和unordered_map的区别:

底层数据结构不同:红黑树和哈希表

时间复杂度:logn 和O(1);

使用场景:

map:(考虑有序,查询速度快,稳定容器元素少于1000、非频繁查询)

hashmap(无序,查询速度快、数据量大、高频查询);

vector和list的区别

底层数据结构:数组和双向链表

查询比较:一个随机访问,一个不随机访问

插入比较:插入需要移动很多;只需要修改指针;

动态绑定和静态绑定

静态类型:对象在声明的时候采用的类型,编译阶段已经确定;

动态类型:通常指一个指针或者是引用目前所指对象的类型;在运行阶段确定;

静态绑定:绑定的是静态类型;所对应的函数或者是属性依赖于对象的静态类型,发生在编译阶段;

动态绑定:绑定的是动态类型,所对应的函数或者是属性依赖于对象的动态类型;发生在运行阶段;

c与C++的区别

面向过程:主要以函数为主,和面向对象主要以类为主;

头文件不同

cin cout;bool 、const

c++支持重载;

tcp和udp的区别

区别:

可靠性的保障

检验和

序列号:对每个字节进行编号

可靠性

按序到达

提高效率多次发送一次确认

去重

数据传输过程中的确认应答处理、重发控制、等功能都可以通过序列号来实现

确认应答机制 ACK

超时重传

链接管理 三次握手 四次挥手;

流量控制:防止较快主机致使缓冲区溢出;

拥塞控制;

保证消息有序:

为了保证消息的可靠性传输,发送方将自己发送的数据保留在缓冲区;

并且为每个发送的数据保留一个超时定时器;

如果在定时器超时之前收到了对方的应答消息,释放缓冲区;

否则重传该数据包;直到应答或者是重传次数超过设定的最大次数为止;

接收到数据后进行crc校验如果正确就交给上层协议;然后给发送方发送一个累积应答包;表明该数据已经收到;如果也有数据要发送就将应答包放在数据中一块发过去;

get、post的区别

效率:

get得,从服务器获取数据,效率比较高

post:可以向服务器发送和下载数据,效率低;

缓存:

get请求能被缓存,默认的请求方式也是缓存的;重复请求是幂等的,结果都一样;

post请求默认不被缓存,post请求的url没有参数,每次请求的url都是一样的数据体可能不同,无法对应;所以缓存没有意义;

安全性:

get的所有参数全部包装在url中,明文显示,且服务器的访问日志会记录,非常不安全;

post的url中只有资源路径,不包含参数,参数封装在二进制的数据体中;服务器不会记录参数,相对安全;

数据量:http没有对get和post请求的数据大小进行限制但是实际应用的时候受软硬件的限制;

get:不同的浏览器不同,一般在2~8K,更加常见的事1K之内

post方法提交的数据比较大,大小靠服务器的设定值限制;php默认2M;

http状态码

1XX表示服务器接收到请求,需要请求者继续执行操作;

2XX表示操作被成功接收并处理

3XX重定向,需要进一步的操作以完成请求;

4XX客户端错误

5XX服务器错误

http与https的区别

http是超文本传输协议,信息是明文的,不安全,https则具有安全性的ssl加密传输协议;

https需要到ca申请证书,一般免费证书少,需要费用;

两种使用不通的链接方式,使用端口不同 80和443;

http的链接简单无状态;https协议是由ssl协议+http协议构建的可进行加密传输、身份认证的网络协议,比http安全;

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-4930771.html

最新回复(0)