搜档网
当前位置:搜档网 › VC 学习心得

VC 学习心得

第三章MFC运行原理:

MFC程序运行过程:先创建应用程序全局对象,并产生该类对象,后进入父类和子类对象构造函数,最后进入WINMAIN函数运行,初始化、设计窗口类(MFC已经设计好了)、注册窗口类、产生窗口、显示窗口、更新窗口、消息循环、消息响应。CMAINFRAME、CVIEW 都是窗口类,它们分别表示一个窗口,ctestAPP是应用程序类,CDocument表示的是一个文档类,数据存储和加载都在该类中完成。

几个类的组织:通过单文档模版应用程序把几个类组织在一起了。

CAboutDlg类,本身也是一个窗口类,可有可无。

第四章MFC消息影射

MFC消息产生通过消息映射机制来响应消息,与消息循环本质上还是差不多的,通过句柄去调用基类windowproc函数,消息映射,调用消息函数,响应。

静态函数中不能调用非静态变量或函数,但是在非静态函数中能够调用静态成员或函数,因为,静态成员属于类本身,而并不属于某个具体的对象。只有在内存中产生的东西,我们才能使用。静态成员变量必须初始化,

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。

堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区(未初始化的变量都被初始化成0或空串,C中也一样)。

常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多

1.C++优势主要体现在封装性、继承性和多态性。

封装性把数据与操作数据的函数组织在一起,不仅使程序更加紧凑,并且提高了类内部数据的安全性;

继承性增加了软件的可扩充性及代码的重用性;

多态性使设计人员在设计程序时可以对问题进行更好的抽象,有利于代码的维护和可重用。

2.C++中结构体允许有函数,称为成员函数,C里面不允许有函数。函数调用方式也用.操作符。C++中结构体和类的差别:关键字不同:class|struct;更重要的就是在成员的访问控制方面也有所差异。结构体在默认情况下,其成员都是公有的;类在默认情况下,其成员都是私有的。

3.构造函数的作用是对对象本身做初始化工作,也就是给用户提供初始化类中成员变量的一种方式。如果一个类中没有定义任何的构造函数,那么C++编译器在某些情况下会为该类提供一个默认的构造函数,这个默认的构造函数是一个不带参数的构造函数,只要一个类中定义了一个构造函数,不管这个构造函数是否是带参数的构造函数,C++编译器就不再提供默认构造函数。也就是说,如果为一个类定义了一个带参数的构造函数,还想要无参数的构造函数,那必须要自己去定义。

4.析构函数格式:~类名(),它是反向的构造函数。不允许有返回值,更重要的是析构函数不允许带参数,并且一个类中只能有一个析构函数。对于一个对象来说,析构函数是最后一个被调用的成员函数。

~point()

{delete[]x,y;}

5.函数重载构成的条件:函数的参数类型、参数个数不同,才能构成重载。特别注意函数带有默认参数的情况。

6.This指针是一个隐含的指针,它指向对象本身,代表对象的地址。

7.类的继承,派生类可以有自己的成员变量和成员方法,除此之外,还可以继承基类的成员变量和成员方法。基类中的private成员不能被派生类访问,因此,private成员不能

被派生类所继承。

8.三种成员访问权限比较:

1)Public定义的成员可以在任何地方被访问。

2)Protected定义的成员只能在该类及其子类中访问。

3)Private定义的成员只能在该类自身中访问。

9.多重继承一个类可以从多个基类中派生。在派生类由多哥基类派生的多重继承模式中,基类是用基类表语法成分来说明的,定义形式:

CLASS派生类名:访问权限基类名称,访问权限基类名称{}

10.虚函数与多态性、纯虚函数

用virtual关键字声明的函数叫虚函数,当C++编译器在编译的时候,发现类函数是虚函数的时候,这时候C++就会采用迟绑定技术。也就是编译时并不确定具体调用的函数,而是在运行的时候,依据对象的类型来确认调用的是哪一个函数,这种能力叫做C++的多态性。在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。

11.函数覆盖发生的条件为:

●基类函数必须是虚函数

●发生覆盖的两个函数要分别位于派生类和基类中。

●函数名称与参数列表必须完全相同。函数覆盖总是和多态联系在一起,在函

数覆盖的情况下,编译器会在运行时根据对象的实际类型来确定要调用的函数。

12.函数隐藏:基类和派生类中有同名的函数,称为函数的隐藏,从而在派生类中隐藏了基类的同名函数。

两种函数隐藏的情况:

1.派生类与基类的函数完全相同(函数名和参数列表都相同),只是基类的函数没有

使用虚函数。此时基类的函数将被隐藏,而不是覆盖。

2.派生类的函数与基类的函数同名,但参数列表不同,在这种情况下,不管基类的函

数声明是否是虚函数,基类的函数都将被隐藏。与函数重载的区别:函数重载发生

在同一个类中。

MFC框架程序剖析

1.MFC是开发Windows应用程序的C++接口。提供了面向对象的框架,程序开发人员可以基于这一框架开发WINDOWS应用程序。

2.设计WIN32应用程序的主要步骤:首先进入WINMAIN函数,然后设计窗口类,注册窗口类、产生窗口、注册窗口、显示窗口、更新窗口,最后进入消息循环。将消息路由到窗口过程函数中去处理。MFC程序的整个运行机制,实际上与Win32SDK程序是一致的。

3.MFC程序运行顺序:theApp全局对象定义处、testApp构造函数,然后WINMAIN函数。在程序运行时,无论全局变量还是全局对象,在加载main函数之前,就已经为全局变量或全局对象分配了内存空间。先运行。

4.C+工程名+APP主窗口,C+VIEW视类窗口两者都派生于CWND类

微软在设计基础类库时候,考虑到要把数据本身与它的显示分离开,于是采用文档类和视类结构来实现这一想法。数据的存储和加载由文档类来完成,数据的显示和修改由视类来完成。从而把数据管理和显示方法分离开来。

5.窗口类、窗口类的对象和窗口之间的关系:C++窗口类对象与窗口并不是一回事,它们之间唯一的关系是C++窗口类对象内部定义了一个窗口句柄变量,保存了与这个C++窗口类对象相关的哪个句柄。窗口销毁时,与之对应的C++窗口类对象销毁与否,要看其生命周期是否结束。但C++窗口类对象销毁时,与之相关的窗口也将销毁。

简单绘图

1.MFC消息机制:WM-LBUTTONDOWN,WM-LBUTTONUP

网络编程

1、端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序通

过系统调用与某端口建立连接后,传输层传给端口的数据都被相应的进程所接

收,相应进程发给传输层的数据都通过该端口输出。

2、套接字:存在于通信区域(地址族)中,也是一个抽象的概念。

3、客户机/服务器模式是指客户向服务器提出请求,服务器接收到请求后,提供

相应的服务。

4、Windows Sokets是基于TCP/IP协议,套接字的类型;

流式套接字(SOCK_STREAM)

提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送,且按发

送顺序接收。实际上是基于TCP协议实现的。

数据报式套接字(SOCK-DGRAM)

提供无连接服务,数据包以独立包形式发送,不提供无错保证,数据可能

丢失或重复,并且接收顺序混乱。数据报式套接字实际上是基于UDP协

议实现的。

原始套接字(SOCK-RAW)

5、基于面向连接(TCP)的套接字编程的服务器端程序流程如下:

1.创建套接字;

2.将套接字绑定到一个本地地址和端口上(bind);

3.将套接字设为监听模式,准备接收客户请求(listen)

4.等待客户请求到来,当请求到来后,接受连接请求,返回一个新的对应于

此次连接的套接字(ACCEPT)

5.用返回的套接字和客户端进行通信(SEND/RECV)

6.返回,等待另一客户请求。

7.关闭套接字。

基于TCP的SOCKET编程的客户端流程如下:

1、创建套接字

2、向服务器发出连接请求(CONNECT)

3、和服务器端进行通信

4、关闭套接字

多线程

1、线程的两个组成部分:

(1)线程的内核对象。操作系统用它来对线程实施管理。内核对象也

是系统用来存放线程统计信息的地方。

(2)线程栈,它用于维护线程在执行代码时需要的所有函数参数和局

部变量。线程只有一个内核和一个栈,保留的记录很少,因此所

需要的内存也很少,开销较进程少,因此在编程中经常采用多线

程来解决问题。尽量避免创建新进程。

2、线程的运行:

操作系统给每一个运行线程安排一定CPU时间----时间片。系统通过一种循

环的方式为线程提供时间片,线程在自己的时间内运行,因为时间片很短,

因此给用户的感觉就是多个线程同时运行一样。单线程和多线程。。。

采用多线程编程的原因:(1)对进程的创建来说,系统要为进程分配私有的4GB的虚拟地址空间,当然它占有的资源就比较多,而对多线

程程序来说,多个线程是共享同一个进程的地址空间,所以占用

的资源就比较少。

(3)当进程间切换时,需要交换整个地址空间,而线程之间的切换只

是执行环境的改变,因此效率比较高。

3、多线程程序容易出现的问题:

带来不可重现的错误,修改起来异常困难,

4、利用互斥对象实现线程同步

互斥对象属于内核对象,它能够确保线程拥有对单个资源的互斥访问权。

互斥对象包含一个使用数量,一个线程ID和一个计数器。

另外两种实现线程同步的方法:事件对象和关键代码段。

异步套接字编写网络应用程序。。。

进程间通信的四种方式:剪切板,油槽,

相关主题