第2章 VisualC++_第1页
第2章 VisualC++_第2页
第2章 VisualC++_第3页
第2章 VisualC++_第4页
第2章 VisualC++_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2022-3-201前言2.4 什么是什么是Windows编程?编程?1. 你编写的程序是否遵循了Windows的编程模型?2. 是否调用了Windows操作系统的应用程序编程接口函数API,或者对其封装后的基础类库(如MFC)。2022-3-202前言2.4.1 关于关于Windows编程的四个问题编程的四个问题1. 什么是Windows API? 3. 什么是MFC?4. 为什么要使用MFC?2. 什么是C+?2022-3-203前言1. 什么是什么是 Windows API? 从从Windows应用程序,操作系统,计算机硬件之应用程序,操作系统,计算机硬件之间的相互关系开始说起间的相互关

2、系开始说起 应用程序的机能就是:通知操作系统控制计算机硬应用程序的机能就是:通知操作系统控制计算机硬件,执行某个具体的动作,完成特定的功能。件,执行某个具体的动作,完成特定的功能。 例如:操作系统能够控制声卡发出声音,但它并不例如:操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需要应用程序告诉操作系知道应该何时发出何种声音,需要应用程序告诉操作系统该发出什么样的声音。统该发出什么样的声音。那么,应用程序是如何通知操作系统执行某个功能的呢?那么,应用程序是如何通知操作系统执行某个功能的呢?4前言1. 什么是什么是 Windows API?(续)?(续) 有过编程经验的同学都应该

3、知道,在传统应用程序中要完有过编程经验的同学都应该知道,在传统应用程序中要完成某个功能,都是以成某个功能,都是以函数调用函数调用的形式实现的,同样,的形式实现的,同样,Windows应用程序也是以函数调用的方式来通知操作系统执行相应的功应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。能的。 操作系统所能够完成的每一个特殊功能通常都有一个函数操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应,也就是说,操作系统把它所能够完成的功能以函数与其对应,也就是说,操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫的形式提供给应用程序使用,应用程序

4、对这些函数的调用就叫做做系统调用系统调用,这些函数的集合就是,这些函数的集合就是Windows应用程序编程接口应用程序编程接口(Application Programming Interface),简称,简称Windows API。5前言1. 什么是什么是 Windows API?(续)?(续) Windows编程的本质:编程的本质: 利用利用Windows API 函数编写应用程序,让操作系统完成某种特定函数编写应用程序,让操作系统完成某种特定的功能的功能 。Windows/System32/Kernel32.dll、 USER32.dll、GDI32.dllWindows API 函数在哪

5、里?函数在哪里? 怎样使用怎样使用Windows API?C和和Windows SDK开发包(开发包( API函数是用纯函数是用纯C写的,都在写的,都在windows.h中有声明)中有声明)然而如今,然而如今,C+取代了取代了C,成为专业,成为专业Windows程序员首选的语言,程序员首选的语言,所以所以MFC横空出世了横空出世了2. 什么是什么是C+?C+是基于是基于C语言发展起来的一种新的程序设计语言语言发展起来的一种新的程序设计语言。C语言语言诞生于诞生于20世纪世纪70年代,是一种应用相当广泛的程序设计语言年代,是一种应用相当广泛的程序设计语言(尤其是在系统程序设计领域)。(尤其是在系

6、统程序设计领域)。C语言简洁、高效,但是语言简洁、高效,但是C语言也有其自身的缺点,例如弱的类型检查机制等,使得使语言也有其自身的缺点,例如弱的类型检查机制等,使得使用用C语言开发大型的应用程序比较困难。语言开发大型的应用程序比较困难。C+简介简介20世纪世纪80年代,美国贝尔实验室的年代,美国贝尔实验室的Bjarne Stroustrup博士及博士及其同事在其同事在C语言的基础上引入了语言的基础上引入了面向对象面向对象的编程思想和一个的编程思想和一个class关键字关键字,形成了最早的,形成了最早的C+语言原型。后来,语言原型。后来,C+语言语言被融入了越来越多的语言特性,其中最具有意义、影

7、响最深被融入了越来越多的语言特性,其中最具有意义、影响最深远的莫过于远的莫过于template(模板)的引入,最终美国国家标准化(模板)的引入,最终美国国家标准化协会协会ANSI(American National Standard Institute)和国际)和国际标准化组织标准化组织ISO(International Standards Organization)一)一起对起对C+语言进行了标准化工作,并于语言进行了标准化工作,并于1998年正式发布了年正式发布了C+语言的国际标准语言的国际标准ISO/IEC:98-14882。C+已经成为最流已经成为最流行的程序设计语言之一。行的程序设计

8、语言之一。C+和和Visual C+的关系的关系C+是一种语言,是一种语言,VC+是是C+的编译器的编译器。但另一方面说:但另一方面说:VC+本来是本来是C+语言的编译器,但是随着它语言的编译器,但是随着它的发展版本推陈出新,微软不断地在里面添加了部分不属于的发展版本推陈出新,微软不断地在里面添加了部分不属于标准标准C+语言的部分,也就是自己的类库。结果令它和标准语言的部分,也就是自己的类库。结果令它和标准C+的区别越来越大。所以很多人误以为的区别越来越大。所以很多人误以为VC+是另一种语言是另一种语言(从某个角度来说,(从某个角度来说,VC+确实越来越像一门独立的语言)。确实越来越像一门独立

9、的语言)。Visual C+集成开发环境集成开发环境集成开发环境(集成开发环境(IDE)是一个将程序编辑器、编译器、调试工具)是一个将程序编辑器、编译器、调试工具和其他建立应用程序的工具集成在一起的用于开发应用程序的软和其他建立应用程序的工具集成在一起的用于开发应用程序的软件系统。件系统。Visual C+软件包中的软件包中的Developer Studio就是一个集成开就是一个集成开发环境,它集成了各种开发工具和发环境,它集成了各种开发工具和VC编译器。程序员可以在不离编译器。程序员可以在不离开该环境的情况下编辑、编译、调试和运行一个应用程序。开该环境的情况下编辑、编译、调试和运行一个应用程

10、序。IDE中还提供大量在线帮助信息协助程序员做好开发工作。中还提供大量在线帮助信息协助程序员做好开发工作。Developer Studio中除了程序编辑器、资源编辑器、编译器、调试器外,还中除了程序编辑器、资源编辑器、编译器、调试器外,还有各种工具和向导(如有各种工具和向导(如AppWizard和和ClassWizard),以及),以及MFC类库,这些都可以帮助程序员快速而正确地开发出应用程序。类库,这些都可以帮助程序员快速而正确地开发出应用程序。Visual C+简介简介向导是一个通过一步步的帮助引导你工作的工具。向导是一个通过一步步的帮助引导你工作的工具。AppWizard:用:用来创建一

11、个来创建一个Windows程序的基本框架结构程序的基本框架结构。AppWizard向导会一步向导会一步步向程序员提出问题,询问他所创建的项目的特征,然后步向程序员提出问题,询问他所创建的项目的特征,然后AppWizard会根据这些特征自动生成一个可以执行的程序框架,程会根据这些特征自动生成一个可以执行的程序框架,程序员然后可以在这个框架下进一步填充内容。序员然后可以在这个框架下进一步填充内容。ClassWizard:用来定义:用来定义AppWizard所创建的程序中的类所创建的程序中的类。可以利。可以利用用ClassWizard在项目中增加类、为类增加处理消息的函数等。以在项目中增加类、为类增

12、加处理消息的函数等。以及将及将MFC对象或者类的成员变量与对话框中的控件联系起来。对象或者类的成员变量与对话框中的控件联系起来。2.什么是什么是MFC库库库(库(library)是可以重复使用的源代码和目标代码的集合)是可以重复使用的源代码和目标代码的集合。MFC(Microsoft Fundation Classes)是是Visual C+开发环境所带的类库,该开发环境所带的类库,该类库把类库把Windows API进行了封装,它是一个类的集合,为编程提供了一进行了封装,它是一个类的集合,为编程提供了一个个面向对象面向对象的界面。这些类可以提供程序框架、进行文件和数据库操作、的界面。这些类可

13、以提供程序框架、进行文件和数据库操作、建立网络连接、进行绘图和打印等各种通用的应用程序操作。建立网络连接、进行绘图和打印等各种通用的应用程序操作。 MFC使使Windows程序员能够利用程序员能够利用C+面象对象的特性进行编程。面象对象的特性进行编程。VC+不同于标准不同于标准C+的核心就是的核心就是MFC。VC+编程的精髓也是编程的精髓也是MFC。12前言3. 为什么要使用为什么要使用MFC?n 可重用性可重用性n 封装后使方法和属性更紧密的捆绑封装后使方法和属性更紧密的捆绑n 常用的功能自动化,减少编写代码的数量常用的功能自动化,减少编写代码的数量n 提供应用程序的框架结构提供应用程序的框

14、架结构 框架结构提供了抽象功能,它远远超出了框架结构提供了抽象功能,它远远超出了Windows API的功能。例如:的功能。例如:MFC的文档的文档/视图体系结构在视图体系结构在API上上建造了一个功能强大的基础结构,它把程序中数据的图建造了一个功能强大的基础结构,它把程序中数据的图形表示(或称为视图)与数据本身分开。这种抽象对形表示(或称为视图)与数据本身分开。这种抽象对API而言完全是陌生的,而且在而言完全是陌生的,而且在MFC框架结构之外或类框架结构之外或类似的类库中也不存在。似的类库中也不存在。参考书参考书 Visual C+ 开发教程 清华出版社 Visual C+ 技术内幕 MFC

15、 Windows 程序设计 深入浅出MFC2.5 C+基础2.5.1 简单简单C+程序程序 #include void main() double r, area; / 声明变量声明变量 coutr; / 从键盘上输入从键盘上输入r的值的值 area = 3.14159 * r * r; / 计算面积计算面积 cout圆的面积为:圆的面积为:arean; / 输出输出 该程序经编译、链接、运行后,屏幕上显示:输入圆的半径:此时等待用户输入,当输入10并按Enter键后,屏幕显示:圆的面积为:314.159Press any key to continue2.5.2 从结构到类从结构到类 例Ex

16、_StructToClass 从结构到类的示例#include struct MY_CIRCLE int ID; /圆的ID.int x, y; /圆心坐标int radius ; / 半径;float GetArea(MY_CIRCLE circle) / 计算平均成绩return(3.14*circle.radius*circle.radius); void main() MY_CIRCLE C1;C1.radius=10; C1.ID=1;cout圆C1.ID的面积是:GetArea(C1)endl;运行结果如下:运行结果如下:圆圆1的面积是的面积是3142.5.3 结构体的缺点结构体的

17、缺点 无法把函数定义在结构体里。无法把函数定义在结构体里。 封装度不够封装度不够 数据不够安全数据不够安全2.5.4 类和对象类和对象类类(Class) 面向对象思想来源于对现实世界的认知。现实世界缤纷复杂、种类面向对象思想来源于对现实世界的认知。现实世界缤纷复杂、种类繁多,难于认识和理解。但是聪明的人们学会了把这些错综复杂的事繁多,难于认识和理解。但是聪明的人们学会了把这些错综复杂的事物进行分类,从而使世界变得井井有条。比如我们由各式各样的汽车物进行分类,从而使世界变得井井有条。比如我们由各式各样的汽车抽象出汽车的概念,由形形色色的猫抽象出猫的概念,由五彩斑斓的抽象出汽车的概念,由形形色色的

18、猫抽象出猫的概念,由五彩斑斓的鲜花抽象出花的概念等。汽车、猫、鲜花都代表着一类事物。每一类鲜花抽象出花的概念等。汽车、猫、鲜花都代表着一类事物。每一类事物都有特定的状态,比如汽车的品牌、时速、马力、耗油量、座椅事物都有特定的状态,比如汽车的品牌、时速、马力、耗油量、座椅数,小猫的年龄、体重、毛色,鲜花的颜色、花瓣形状、花瓣数目,数,小猫的年龄、体重、毛色,鲜花的颜色、花瓣形状、花瓣数目,都是在描述事物的状态。每类事物也都有一定的行为,比如汽车启动、都是在描述事物的状态。每类事物也都有一定的行为,比如汽车启动、行驶、加速、减速、刹车、停车,猫捉老鼠,鲜花盛开。这些不同的行驶、加速、减速、刹车、停

19、车,猫捉老鼠,鲜花盛开。这些不同的状态和行为将各类事物区分开来。状态和行为将各类事物区分开来。2.5.4 类和对象(续)类和对象(续)对象(对象(object) 对象则是类的具体实例。比如人是一个类,司马迁、李白、杜甫都是对象则是类的具体实例。比如人是一个类,司马迁、李白、杜甫都是对象;首都是一个类,则北京、伦敦、华盛顿、莫斯科都是对象;动对象;首都是一个类,则北京、伦敦、华盛顿、莫斯科都是对象;动画猫是一个类,则画猫是一个类,则Kitty、Grafield和和Doraemon都是对象都是对象2.5.4 类和对象(续)类和对象(续)类是抽象的概念,对象是真实的个体。我们可以说类是抽象的概念,对

20、象是真实的个体。我们可以说Kitty猫的体重是猫的体重是1.5kg,而不能说猫类的体重是,而不能说猫类的体重是1.5kg;可以;可以说刘翔在跨栏比赛中夺冠,而不说人类在跨栏比赛中夺说刘翔在跨栏比赛中夺冠,而不说人类在跨栏比赛中夺冠。一般情况下我们认为状态是描述具体对象而非描述冠。一般情况下我们认为状态是描述具体对象而非描述类的,行为是由具体对象发出的而非类发出的。类的,行为是由具体对象发出的而非类发出的。 2.5.4 类和对象(续)类和对象(续)封装封装(Encapsulation) 制造汽车的过程中什么人最牛?当然不是焊钢板的,也不制造汽车的过程中什么人最牛?当然不是焊钢板的,也不是装轮胎的

21、,更不是拧螺丝的,而是设计汽车的工程师,因为是装轮胎的,更不是拧螺丝的,而是设计汽车的工程师,因为他知道汽车的运行原理。但是我们开车时,需要知道汽车的运他知道汽车的运行原理。但是我们开车时,需要知道汽车的运行原理吗?显然不需要。汽车的运行原理已经被伟大的工程师行原理吗?显然不需要。汽车的运行原理已经被伟大的工程师封装在汽车内部,提供给司机的只是一个简单的使用接口,司封装在汽车内部,提供给司机的只是一个简单的使用接口,司机操纵方向盘和各种按钮就可以灵活自如的开动汽车了。机操纵方向盘和各种按钮就可以灵活自如的开动汽车了。 与制造汽车相似,面向对象技术把事物的状态和行为的实与制造汽车相似,面向对象技

22、术把事物的状态和行为的实现细节封装在类中,形成一个可以重复使用的现细节封装在类中,形成一个可以重复使用的“零件零件”。类一。类一旦被设计好,就可以像工业零件一样,被成千上万的对其内部旦被设计好,就可以像工业零件一样,被成千上万的对其内部原理毫不知情的程序员使用。类的设计者相当于汽车工程师,原理毫不知情的程序员使用。类的设计者相当于汽车工程师,类的使用者相当于司机。这样程序员就可以充份利用他人已经类的使用者相当于司机。这样程序员就可以充份利用他人已经编写好的编写好的“零件零件”,而将主要精力集中在自己的专署领域。,而将主要精力集中在自己的专署领域。2.5.4 类和对象(续)类和对象(续)接口接口

23、(Interface) 假设你是一个环保人士,最近你用节能灯代替了普通的白炽灯。白炽假设你是一个环保人士,最近你用节能灯代替了普通的白炽灯。白炽灯通过加热电阻丝照亮整个屋子;荧光灯则是激活空气中的某些分子灯通过加热电阻丝照亮整个屋子;荧光灯则是激活空气中的某些分子的电子能而发光。虽然它们的原理不同,但是它们的的电子能而发光。虽然它们的原理不同,但是它们的接口却是相同的。接口却是相同的。所以你只需拧下白炽灯,然后再拧上荧光灯即可,轻易的实现所以你只需拧下白炽灯,然后再拧上荧光灯即可,轻易的实现“零件零件”的更新换代。同样,在面向对象编程中,只要保持接口不变,你可以的更新换代。同样,在面向对象编程

24、中,只要保持接口不变,你可以任意更改类的实现细节,用一个设计更好的类替换原来的类,实现类任意更改类的实现细节,用一个设计更好的类替换原来的类,实现类的升级换代。的升级换代。现在软件维护和修改的成本已经占到了整个软件开发的现在软件维护和修改的成本已经占到了整个软件开发的80%,类,类的这一编成思想极大的方便了程序的维护和修改,降低了软件成本。的这一编成思想极大的方便了程序的维护和修改,降低了软件成本。2.5.5 类的定义类的定义 类一般分为声明部分和实现部分。类一般分为声明部分和实现部分。类体类体C+中定义类的一般格式如下:中定义类的一般格式如下: class private: public:

25、; class是定义类的关键字,是定义类的关键字,class的后面是用户定义的类名。类中的后面是用户定义的类名。类中的数据和函数是类的成员,称为数据成员和成员函数。的数据和函数是类的成员,称为数据成员和成员函数。 2.5.5 类的定义(续)类的定义(续)定义类时还应注意:定义类时还应注意: (1) 在在“public:”或或“private:”后面成员都是公有或私后面成员都是公有或私有的,直到下一个有的,直到下一个“public:”或或“private:”出现为止。出现为止。 (2)关键字)关键字public和和private在类中出现多次,前后的顺在类中出现多次,前后的顺序没有关系。序没有关

26、系。 (3)除了)除了public和和private外,关键字外,关键字protected也可修饰也可修饰成员的类型。成员的类型。 (4)数据成员的类型可以是任意的,包含整型、浮点型、)数据成员的类型可以是任意的,包含整型、浮点型、字符型、数组、指针等。字符型、数组、指针等。 Visual C+ 6.0为用户创建的应用程序框架中都是将各个为用户创建的应用程序框架中都是将各个类以类以.h和同名的和同名的.cpp文件来组织的。文件来组织的。2.5.5 类的定义(续)类的定义(续)MY_CIRCLE类定义了一个类定义了一个getArea()函数。函数。class MY_CIRCLE public:i

27、nt x,y, radius;int ID;public:double getArea();MY_CIRCLE();virtual MY_CIRCLE();double MY_CIRCLE:getArea() return 3.14*radius*radius; MY_CIRCLE:MY_CIRCLE() MY_CIRCLE:MY_CIRCLE() 2.5.6 对象的定义对象的定义 一个类定义后,就可以定义该类的对象,如下面的格式:一个类定义后,就可以定义该类的对象,如下面的格式: 类名是用户已定义过的类的标识符,对象名可以有一个或多个,类名是用户已定义过的类的标识符,对象名可以有一个或多个,

28、多个时要用多个时要用 逗号分隔。逗号分隔。 MY_CIRCLE c1, *c2;一个对象就是该对象的类所定义的成员,引用时可用下列方式:一个对象就是该对象的类所定义的成员,引用时可用下列方式: .()前者表示引用数据成员,后者表示引用成员函数。前者表示引用数据成员,后者表示引用成员函数。“.”是成员是成员运算符运算符 c1.x, c1.GetArea();对于指针对象的成员引用可用下列方式:对于指针对象的成员引用可用下列方式:-()c2-GetArea(); c2-ID“-”也是一个成员运算符,与也是一个成员运算符,与“.”运算符的区别是:运算符的区别是:“-”用来用来访问指针对象的成员,而访

29、问指针对象的成员,而“.”用来访问一般对象的成员。用来访问一般对象的成员。 2.5.7 对象的定义和使用对象的定义和使用class MY_CIRCLE public:int x,y, radius;int ID;public:double getArea();MY_CIRCLE();virtual MY_CIRCLE();double MY_CIRCLE:getArea() return 3.14*radius*radius; MY_CIRCLE:MY_CIRCLE() MY_CIRCLE:MY_CIRCLE() main()MY_CIRCLE C1;C1.ID=20; C1.radius=1

30、0;cout圆圆C1.ID的面积的面积:C1.getArea()endl;2.5.7 构造函数构造函数 C+规定:构造函数必须与相应的类同名构造函数规定:构造函数必须与相应的类同名构造函数不能指定函数返回值的类型,也不能指定为不能指定函数返回值的类型,也不能指定为void类型。类型。 class MY_CIRCLE public:int x,y, radius;int ID;public:double getArea();MY_CIRCLE();virtual MY_CIRCLE();double MY_CIRCLE:getArea() return 3.14*radius*radius; MY_CIRCLE:MY_CIRCLE() MY_CIRCLE:MY_CIRCLE() 2.5.8 析构函数析构函数 析构函数也要与相应的类同名,并在名称前面加上一析构函数也要与相应的类同名,并在名称前面加上一个个“”符号。符号。析构函数只有在两种情况下才会被自动调用:析构函数只有在两种情况下才会被自动调用: (1) 当对象定义在一个函数体中,该函数调用结束后,当对象定义在一个函数体中,该函数调用结束后,析构函数被自动调用。析构函数被自动调用。 (2) 用用new为对象分配动态内存后,当使用为对象分配动态内存后,当使用del

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论