C++基础知识易错点总结(3)

1. 异步通信和同步通信的区别?

  • 同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可以经过任意长的时间间隔再发送下一个字节;
  • 同步通信效率高,异步通信效率低;
  • 同步通信复杂,双方时钟允许的误差小;异步通信简单,双方时钟可以允许一定误差;
  • 同步通信可用于点对多点,异步通信只适用于点对点;

2. TCP协议的作用?三次握手?

TCP提供面向连接的可靠数据传输服务,依靠接收端TCP软件按序号对收到的数据分组进行逐一确认实现。

三次握手过程:

  • 第一次握手,建立连接时,客户端发送SYN(syn=j)包到服务器,进入SYN_SEND状态,等待服务器确认;
  • 第二次握手,服务器收到SYN包,确认客户的SYN(ack=j+1),同时自己发送一个SYN(syn=k)包,即SYN+ACK包,此时服务器进入SYN_RECV状态;
  • 第三次握手,客户端收到服务器的SYN+ACK包,向服务器发送ACK(ack=k+1),此包发送完毕后,客户端和服务器进入ESTABLISHED状态,完成三次握手;

3. 操作系统执行程序时,内存分配是怎样的?

  • 栈(stack)区:由编译器自动分配与释放,存放函数的参数值,局部变量等,主要操作方式类似于数据结构中的栈;
  • 堆(heap)区:一般由程序员分配与释放,若程序员不释放,程序结束时,可能由OS回收。它与数据结构中的堆无关,分配方式类似于链表;
  • 全局区(静态区):全局变量和静态变量的存储区域,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放;
  • 文字常量区:常量字符串存储区域,程序结束后,由系统释放;
  • 程序代码区:存放函数体的二进制代码;

4. 堆与栈的区别?

  • stack空间由操作系统自动分配与释放,堆上的空间需要手动分配和释放;
  • 栈stack空间有限,堆heap有很大的自由空间;
  • 程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用参数的传递也在栈上进行;

5. 进程之间通信方式?

  • 信号( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;
  • 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  • 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
  • 管道(有名管道,无名管道,高级管道):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信;无名管道( pipe )是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系;高级管道(popen)将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。
  • 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

7. 面向对象的三个特征,分别的作用?

  • 封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法让可信的类或对象操作,对不可信的进行隐藏;
  • 继承:它可以使用现有的类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展;继承是面向对象软件技术当中的一个概念。如果一个类B继承自另一个类A,就把这个B称为A的子类,而把A称为B的父类。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。
  • 多态(Polymorphisn):多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说:允许将子类类型的指针赋值给父类类型的指针。多态性在C++中都是通过虚函数(Virtual Function)实现的。虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的做法,称为“覆盖”或者称为“重写”(override)。

8. C++与Java的区别?

  • 内存管理:java有垃圾回收机制,jvm管理内存;C++通过new与delete运算符由程序员控制内存的分配与释放;
  • 全局变量:Java不在所有类之外定义全局变量,而是在某个类中定义一种公用静态的变量来完成全局变量的功能。
  • Java不支持头文件,面C和C++语言中都用头文件来定义类的原型,全局变量,库函数等,这种采用头文件的结构使得系统的运行维护相当繁杂。
  • Java不支持宏定义,而是使用关键字final来定义常量,在C++中则采用宏定义来实现常量定义,这不得于程序的可读性.
  • 类型转换不同.在C和C++中,可通过指针进行任意的类型转换,常常带来不安全性,而在Java中,运行时系统对对象的处理要进行类型相容性检查,以防止不安全的转换.
  • Java不用goto语句,而是用try-catch-finally异常处理语句来代替goto语句处理出错的功能.
  • Java对每种数据类型都分配固定长度.比如,在Java中,int类型总是32位的,而在C和C++中,对于不同的平台,同一个数据类型分配不同的字节数,同样是int类型,在PC机中为二字节即16位,而在VAX-11中,则为32位.这使得C语言造成不可移植性,而Java则具有跨平台性(平台无关性).
  • 结构和联合的处理.在C和C++中,结构和联合的所有成员均为公有,这就带来了安全性问题,而在Java中根本就不包含结构和联合,所有的内容都封装在类里面
  • Java不再使用指针.指针是C和C++中最灵活,也最容易产生错误的数据类型.由指针所进行的内存地址操作常会造成不可预知的错误,同时通过指针对某个内存地址进行显式类型转换后,可以访问一个C++中的私有成员,从而破坏安全性.而Java对指针进行完全地控制,程序员不能直接进行任何指针操作.

9. Windows编程中,消息机制,一个自定义消息如何实现?

  • 自定义消息:#define
  • 在头文件中声明函数;
  • 在消息映射中添加对应关系;
  • 定义消息函数并实现;

核心:函数原型,关联消息与消息响应函数的宏,函数实现;

你可能感兴趣的:(C++基础知识易错点总结(3))