-
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安全;
-