}
protected:
private:
};
inthuman:
:
human_num=0;
humanf1(humanx)
{
x.print();
returnx;
}
intmain(intargc,char*argv[])
{
humanh1;
h1.print();
humanh2=f1(h1);
h2.print();
return0;
}
输出:
1
1
0
0
-1
-2
----------------------------
分析:
humanh1;//调用构造函数,---hum_num=1;
h1.print();//输出:
"humanis1"
humanh2=f1(h1);//再调用f1(h1)的过程中,由于函数参数是按值传递对象,调用默认的复制构造函数,它并没有对hum_num++,所以hum_num仍=1,所以x.print()输出:
"humanis1";在推出f1函数时,要销毁X,调用析构函数(human_num--),输出:
"humanis0"(,由于该函数返回一个human对象,所以又调用默认构造函数,创建一个临时对象(human_num=0;),把临时对象赋给h2,又调用默认构造函数(human_num=0);h2.print();//输出:
humanis0;
//在退出main()函数是,先销毁h2,调用析构函数(human_num--),输出"human_numis-1"然后销毁h1,调用析构函数(--),输出"human_numis-2"
1.3Windows的消息机制
1.的消息机制1Windows
Windows是一个消息(Message)驱动系统。
Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。
应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理来完成。
Windows系统中有两种消息队列:
系统消息队列和应用程序消息队列。
计算机的所有输入设备由Windows监控。
当一个事件发生时,Windows先将输入的消息放入系统消息队列中,再将消息拷贝到相应的应用程序消息队列中。
应用程序的消息处理程序将反复检测消息队列,并把检测到的每个消息发送到相应的窗口函数中。
这便是一个事件从发生至到达窗口函数必须经历的过程。
必须注意的是,消息并非是抢占性的,无论事件的缓急,总是按照到达的先后派对,依次处理(一些系统消息除外),这样可能使一些实时外部事件得不到及时处理。
2.的消息机制2Windows
Windows中的消息是放在对应的进程的消息队列里的。
可以通过GetMessage取得,并且对于一般的消息,此函数返回非零值,但是对于WM_QUIT消息,返回零。
可以通过这个特征,结束程序。
当取得消息之后,应该先转换消息,再分发消息。
所谓转换,就是把键盘码的转换,所谓分发,就是把消息分发给对应的窗口,由对应的窗口处理消息,这样对应窗体的消息处理函数就会被调用。
两个函数可以实现这两个功能:
TranslateMessage和DispatchMessage。
另外,需要注意,当我们点击窗口的关闭按钮关闭窗口时,程序并没有自动退出,而是向程序发送了一个WM_DESTROY消息(其实过程是这样的,首先向程序发送WM_CLOSE消息,默认的处理程序是调用DestroyWindow销毁窗体,从而引发WM_DESTROY消息),此时在窗体中我们要响应这个消息,如果需要退出程序,那么就要向程序发送WM_QUIT消息(通过PostQuitMessage实现)。
一个窗体如果想要调用自己的消息处理函数,可以使用SendMessage向自己发消息。
如上所述,大部分(注意是大部分)的消息是这样传递的:
首先放到进程的消息队列中,之后由GetMessage取出,转换后,分发给对应的窗口。
这种消息成为存储式消息。
存储式消息基本上是使用者输入的结果,以击键(如WM_KEYDOWN和WM_KEYUP讯息)、击键产生的字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN)的形式给出。
存储式消息还包含时钟消息(WM_TIMER)、更新消息(WM_PAINT)和退出消息(WM_QUIT)。
但是也有的消息是直接发送给窗口的,它们被称为非存储式消息。
例如,当WinMain调用CreateWindow时,Windows将建立窗口并在处理中给窗口消息处理函数发送一个WM_CREATE消息。
当WinMain调用ShowWindow时,Windows将给窗口消息处理函数发送WM_SIZE和WM_SHOWWINDOW消息。
当WinMain调用UpdateWindow时,Windows将给窗口消息处理函数发送WM_PAINT消息。
2网络知识
2.1OSI和TCP/IP
1.的七层网络结构图(功能及特点)OSI
1)物理层:
为数据链路层提供物理连接,在其上串行传送比特流,即所传送数据的单位是比特。
此外,该层中还具有确定连接设备的电气特性和物理特性等功能。
2)数据链路层:
负责在网络节点间的线路上通过检测、流量控制和重发等手段,无差错地传送以帧为单位的数据。
为做到这一点,在每一帧中必须同时带有同步、地址、差错控制及流量控制等控制信息。
3)网络层:
为了将数据分组从源(源端系统)送到目的地(目标端系统),网络层的任务就是选择合适的路由和交换节点,使源的传输层传下来的分组信息能够正确无误地按照地址找到目的地,并交付给相应的传输层,即完成网络的寻址功能。
4)传输层:
传输层是高低层之间衔接的接口层。
数据传输的单位是报文,当报文较长时将它分割成若干分组,然后交给网络层进行传输。
传输层是计算机网络协议分层中的最关键一层,该层以上各层将不再管理信息传输问题。
5)会话层:
该层对传输的报文提供同步管理服务。
在两个不同系统的互相通信的应用进程之间建立、组织和协调交互。
例如,确定是双工还是半双工工作。
6)表示层:
该层的主要任务是把所传送的数据的抽象语法变换为传送语法,即把不同计算机内部的不同表示形式转换成网络通信中的标准表示形式。
此外,对传送的数据加密(或解密)、正文压缩(或还原)也是表示层的任务。
7)应用层:
该层直接面向用户,是OSI中的最高层。
它的主要任务是为用户提供应用的接口,即提供不同计算机间的文件传送、访问与管理,电子邮件的内容处理,不同计算机通过网络交互访问的虚拟终端功能等。
2.(功能及特点)TCP/IP
1)网络接口层:
这是TCP/IP协议的最低一层,包括有多种逻辑链路控制和媒体访问协议。
网络接口层的功能是接收IP数据报并通过特定的网络进行传输,或从网络上接收物理帧,抽取出IP数据报并转交给网际层。
2)网际网层(IP层):
该层包括以下协议:
IP(网际协议)、ICMP(InternetControlMessageProtocol,因特网控制报文协议)、ARP(AddressResolutionProtocol,地址解析协议)、RARP(ReverseAddressResolutionProtocol,反向地址解析协议)。
该层负责相同或不同网络中计算机之间的通信,主要处理数据报和路由。
在IP层中,ARP协议用于将IP地址转换成物理地址,RARP协议用于将物理地址转换成IP地址,ICMP协议用于报告差错和传送控制信息。
IP协议在TCP/IP协议组中处于核心地位。
3)传输层:
该层提供TCP(传输控制协议)和UDP(UserDatagramProtocol,用户数据报协议)两个协议,它们都建立在IP协议的基础上,其中TCP提供可靠的面向连接服务,UDP提供简单的无连接服务。
传输层提供端到端,即应用程序之间的通信,主要功能是数据格式化、数据确认