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