1. 起保护作用;
2. 提高编译的效率。
98. windows消息系统由哪几部分构成?
1. 消息队列:操作系统负责为进程维护一个消息队列,程序运行时不断从该消息队列中获取消息、处理消息;
2. 消息循环:应用程序通过消息循环不断获取消息、处理消息。
3. 消息处理:消息循环负责将消息派发到相关的窗口上,然后使用关联的窗口过程函数进
行处理。
99. 什么是消息映射?
消息映射就是让程序员指定MFC类(有消息处理能力的类)处理某个消息。然后由程序员完成对该处理函数的编写,以实现消息处理功能。
100. 什么是UDP和TCP的区别是什么?
TCP的全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信。 UDP全称为用户报文协议,它可以提供非连接的不可靠的点到多点的通信。用TCP还是UDP,那要看你的程序注重哪一个方面?可靠还是快速?
101. winsock建立连接的主要实现步骤:
服务器端:socket()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接, accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesocket()关闭套接字。
客户端:socket()建立套接字,连接(connect)服务器,连接上后使用send()和recv(),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。
102. 进程间主要的通讯方式? 信号量,管道,消息,共享内存
103. 构成Win32 API 函数的三个动态链接库是什么? 答:内核库,用户界面管理库,图形设备界面库。
104. 创建一个窗口的步骤是?
答:填充一个窗口类结构->注册这个窗口类->然后再创建窗口->显示窗口->更新窗口。
105. 模态对话框和非模态对话框有什么区别:
1. 调用规则不同:前者是用DoModal()调用,后者通过属性和ShowWindow()来显示。 2.模态对话框在没有关闭前用户不能进行其他操作,而非模态对话框可以。
3.非模态对话框创建时必须编写自己的共有构造函数,还要调用Create()函数。
106. 从EDIT框中取出数据给关联的变量,已经把关联的变量的数据显示在EDIT框上的函数是什么?
答: UpdateData(TRUE), Updatedata(FALSE).
107. 简单介绍GDI?
答;GDI是Graphics Device Interface 的缩写,译为:图形设备接口;是一个在Windows应用程序中执行与设备无关的函数库,这些函数在不同的输出设备上产生图形以及文字输出。
108. Windows消息分为几类?并对各类做简单描述。
1.窗口消息:与窗口相关的消息,除WM_COMMAND之外的所有以WM_开头的消息; 2.命令消息;用于处理用户请求,以WM_COMMAND表示的消息; 3.控件通知消息:统一由WM_NOTIFT表示 4.用户自定义消息。
109. 如何自定义消息?
使用WM_USER 和WM_APP两个宏来自定义消息
110. 简述Visual C++ 、Win32 API和MFC之间的关系?
(1) Visual C++是一个以C++程序设计语言为基础的、集成的、可视化的编程环境; (2) Win32 API是32位Windows操作系统以C/C++形式提供的一组应用程序接口; (3) MFC是对Win32 API的封装,简化了开发过程。
111.怎样消除多重继承中的二义性? 1.成员限定符 2.虚基类
112什么叫静态关联,什么叫动态关联
在多态中,如果程序在编译阶段就能确定实际执行动作,则称静态关联, 如果等到程序运行才能确定叫动态关联。
113.多态的两个必要条件
1. 一个基类的指针或引用指向一个派生类对象, 2. 虚函数
114. 什么叫智能指针?
当一个类中,存在一个指向另一个类对象的指针时,对指针运算符进行重载,那么当前类对象可以通过指针像调用自身成员一样调用另一个类的成员。
115. 什么时候需要用虚析构函数?
当基类指针指向用new运算符生成的派生类对象时,delete基类指针时,派生类部分没有释放掉而造成释放不彻底现象,需要虚析构函数。
116. MFC中,大部分类是从哪个类继承而来:CObject
117. 什么是平衡二叉树?
答:左右子树都是平衡二叉树,而且左右子树的深度差值的约对值不大于1
118. 语句for( ;1 ;)有什么问题?它是什么意思? 答:无限循环,和while(1)相同。
119.派生新类的过程要经历三个步骤 1.吸收基类成员 2. 改造基类成员 3. 添加新成员
57. IP地址的编码分为哪俩部分?
答:IP地址由两部分组成,网络号和主机号。
121. TCP/IP 建立连接的过程:
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手
124怎样定义一个纯虚函数?含有纯虚函数的类称为什么? 在虚函数的后面加=0,含有虚函数的类称为抽象类。
128.如何打印出当前源文件的文件名以及源文件的当前行号? 答案:
cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。
129.文件中有一组整数,要求排序后输出到另一个文件中 答案:
void Order(vector
int count = data.size() ; int tag = false ;
for ( int i = 0 ; i < count ; i++) {
for ( int j = 0 ; j < count - i - 1 ; j++) {
if ( data[j] > data[j+1]) {
tag = true ;
int temp = data[j] ; data[j] = data[j+1] ; data[j+1] = temp ; } }
if ( !tag ) break ; } }
void main( void ) {
vector
ifstream in(\if ( !in)
{
cout<<\exit(1); }
int temp;
while (!in.eof()) {
in>>temp;
data.push_back(temp); }
in.close();
Order(data);
ofstream out(\if ( !out) {
cout<<\exit(1); }
for ( i = 0 ; i < data.size() ; i++) out< 130.一个链表的结点结构 struct Node{ int data ; Node *next ; }; typedef struct Node Node ; 已知链表的头结点head,写一个函数把这个链表逆序 ( Intel): Node * ReverseList(Node *head){ //链表逆序 if ( head == NULL || head->next == NULL ) return head; Node *p1 = head ; Node *p2 = p1->next ; Node *p3 = p2->next ; p1->next = NULL ; while ( p3 != NULL ) { p2->next = p1 ; p1 = p2 ; p2 = p3 ; p3 = p3->next ; } p2->next = p1 ; head = p2 ; return head ; } 131. 一个链表的结点结构 struct Node { int data ; Node *next ; }; typedef struct Node Node ; 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。 Node * Merge(Node *head1 , Node *head2) { if ( head1 == NULL) return head2 ; if ( head2 == NULL) return head1 ; Node *head = NULL ; Node *p1 = NULL; Node *p2 = NULL; if ( head1->data < head2->data ) { head = head1 ; p1 = head1->next; p2 = head2 ; } else { head = head2 ;