一、多态的三个条件
1.要有继承关系,即有基类和派生类
2.有其中基类有虚函数,派生类有虚函数的重写
3.父类指针指向子类对象
二、new和malloc区别
都是从申请堆上的空间动态内存操作。
1.new是操作符,malloc是库函数。
2.malloc需要申请指定内存空间大小,new不需要。
3.new返回的是对象类型指针,类型与对象匹配,无需类型转换;malloc返回的是void型指针,需要通过类型的强制转换换成所需数据类型。
4.new会自动调用对象的构造函数,delete会调用析构函数;而malloc无法自定类型的构造和析构。
三、
线程是进程的实体,CPU调用和分派的基本单位
进程是资源分配的基本单位
同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行
四、STL
五、static作用
在C中static的作用如下
第一、在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
第二、static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。
第三、static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候自动初始化为0;
(1)不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用static修饰
(2)考虑到数据安全性(当程想要使用全局变量的时候应该先考虑使用static)
还有在C++下的作用。C++中static关键字作用总结 - sold_out - 博客园
六、全局数据,局部数据,静态全局数据和静态局部数据,动态数据的存储(存储区域和生命周期)
全局数据和静态数据存储在静态存储区,局部变量和动态数据存储在动态存储区。
全局变量:从定义到程序结束。
局部变量:其定义的函数内有效
静态全局变量:定义到程序结束,本文件内有效
静态局部变量:函数内有效,函数返回不消失
动态存储区(堆)、动态存储区(栈)、静态存储区、程序代码区
动态存储区(堆):(动态分配)
程序员自己分配自己释放,malloc动态分配在heap堆区。
动态存储区(栈):(动态分配)
由编译器自动分配释放,存放函数的参数值,局部变量等值。其操作方式类似于数据结构中的栈。
静态存储区:(静态分配)
extern全局变量,在static静态存储区。
静态存储区,一旦分配,不会被回收,可读可写
程序代码区:(静态分配)
main函数、其他函数在code程序代码区。
程序代码区,一旦分配,可读不可写,不可改变
堆栈的区别
1、空间分配
栈是由系统自动分配释放;堆是有程序员自行申请分配释放,若程序员不释放,程序结束时可能由系统来释放。
2、结构
栈就为数据结构的栈;堆则类似于数据结构的树型,通过链表存储。
3、效率
通常栈分配效率比堆快。
七、指针
各指针
数组名和普通指针区别
八、链表
九、预处理
宏定义 文件包含 条件编译
十、线程同步方式
临界区,互斥锁,信号量,事件对象
十一、TCP和UDP的报文内容
序列号 SYN、ACK、FIN
十二、char *str1="hello!" 和 char str2[]="hello!" 的区别
str1是char型指针变量,本身是个变量,可被赋值多次;其存放的是字符串的首地址。
str2是数组名,定义后为常量指针。赋值时不能拆开赋,需直接后接赋的值。
十三、API
背景: 常见的模块化开发、代码复用、组件化、动态链接库(DLL)、 软件框架、分布式计算以及面向服务的架构(SOA),都隐含了对髙超的API设计技能的需求。
目标: 健壮而优雅、稳定而耐用、抽象而隐藏,最主要的: 变更管理----应对变化、新需求、功能要求及错误修复。
API的一个重要的基本定义是:API是一个明确定义的软件组件的逻辑接口, 可以为其他软件提供特定服务,可大可小,可互相依赖,隐藏了内部实现细节。API是为其所提供的服务或者行为定义的一个契约。
C++API通常会包含如下的元素:
(1)头文件:一组.h头文件
(2)一个或多个静态库或动态库文件
(3)文档
Win32 API是纯C API,而非C++API。可以在C++程序中直接使用C API, C++API中的杰出代表是STL( Standard Template Library,标准模板库)。STL包含了一组容器类、对容器中元素进行遍历的迭代器以及作用于容器的各种算法。例如,该算法集合中包括很多高级操作,比如std::search()、std::reverse()、std::sort()和std::set_intersection()。因此,STL 提供的是操作元素集合任务的逻辑接口,且没有暴露每个算法内部的实现细节。
原文:https://blog.csdn.net/j_s_3721/article/details/70175105?utm_source=copy
十四、RTP (TCP UDP)
1.1. RTP是什么
RTP全名是Real-time Transport Protocol(实时传输协议)。它是IETF提出的一个标准,对应的RFC文档为RFC3550(RFC1889为其过期版本)。RFC3550不仅定义了RTP,而且定义了配套的相关协议RTCP(Real-time Transport Control Protocol,即实时传输控制协议)。RTP用来为IP网上的语音、图像、传真等多种需要实时传输的多媒体数据提供端到端的实时传输服务。RTP为Internet上端到端的实时传输提供时间信息和流同步,但并不保证服务质量,服务质量由RTCP来提供。
1.2. RTP的应用环境
RTP用于在单播或多播网络中传送实时数据。它们典型的应用场合有如下几个。
(1)简单的多播音频会议。语音通信通过一个多播地址和一对端口来实现。一个用于音频数据(RTP),另一个用于控制包(RTCP)。
(2)音频和视频会议。如果在一次会议中同时使用了音频和视频会议,这两种媒体将分别在不同的RTP会话中传送,每一个会话使用不同的传输地址(IP地址+端口)。如果一个用户同时使用了两个会话,则每个会话对应的RTCP包都使用规范化名字CNAME(Canonical Name)。与会者可以根据RTCP包中的CNAME来获取相关联的音频和视频,然后根据RTCP包中的计时信息(Network time protocol)来实现音频和视频的同步。
(3)翻译器和混合器。翻译器和混合器都是RTP级的中继系统。翻译器用在通过IP多播不能直接到达的用户区,例如发送者和接收者之间存在防火墙。当与会者能接收的音频编码格式不一样,比如有一个与会者通过一条低速链路接入到高速会议,这时就要使用混合器。在进入音频数据格式需要变化的网络前,混合器将来自一个源或多个源的音频包进行重构,并把重构后的多个音频合并,采用另一种音频编码进行编码后,再转发这个新的RTP包。从一个混合器出来的所有数据包要用混合器作为它们的同步源(SSRC,见RTP的封装)来识别,可以通过贡献源列表(CSRC表,见RTP的封装)可以确认谈话者。
十五、ifndef和extern “C”
C++语言支持函数重载,C语言不支持函数重载。函数被C++编译器编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int y); 该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。
十六、位域
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。位段成员必须声明为int、unsigned int或signed int类型(short char long)。
1. 如果一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。
2.位域的长度不能大于数据类型本身的长度,比如int类型就能超过32位二进位。
3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。
struct foo2 { char a : 2; char b : 3; char c : 1; }; struct foo3 { char a : 2; char b : 3; char c : 7; };
sizeof(struct foo2) = 1
sizeof(struct foo3) = 2