1.与Windows紧密结合。
MFC类库集成了大量已经预先定义好的类,用户可以根据编程的需要定义相应的类,或根据需要自己定义相应的类。因此Visual C++在使用API等方面和Windows联系的最为紧密
2.强大的类库支持和类改造能力。
代码重用是C++追求的目标,重用就是从已有的基类派生处新的C++类;MFC提供了大量的基类供程序员们根据不同的应用要求生成新的类以满足要求。VC++有了MFC,具有非常强大对类改造的能力。只要集成MFC类,稍加修改就可以得到符合要求的控件类或应用类。
3.拥有高效的运行速度。
高的运行速度取决于两点:1.软件本身编写的质量,2.编程工具的编译质量。。因为VC++非常接近Windows底层,所以编译器所编译的质量相当高,从而保证了VC++编写出来的软件产品拥有高效的运行速度。
1) main函数不在任何类里面,因为这点,所以做不到完全面向对象,下面其他的都是可以解决的
2)基本的数据类型也不是对象(从这点上看JAVA也不是完全面向对象的)
3)友元会破坏封装性
4)支持独立的函数,数据,即过程化编程
其实所谓的完全面向对象,是一些人想出来的卖点,并没有太大的实际意义,难道把main包含进class这种语言就强大了?
C++支持面向过程、基于对象、和面向对象三种模式
所谓基于对象是指:我们采用对象封装技术,将数据和操作捆绑在一起,但是并没有合理地使用多态、继承等面向对象技术进行软件设计。很多以前从事C程序开发的人,当他采用面向对象的编程语言(如C++)进行开发时,写出来的程序却是基于对象的。或者说他们是采用面向对象的语言编写面向过程的程序!
纯粹面向对象:
(1) 所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。理论上讲,可从要解决的问题身上提出所有概念性的组件,然后在程序中将其表达为一个对象。
(2) 程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。为了向对象发出请求,需向那个对象“发送一条消息”。更具体地讲,可将消息想象为一个调用请求,它调用的是从属于目标对象的一个子例程或函数。
(3) 每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现有对象,可制作出新型对象。所以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。
(4) 每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”(Class)是“类型”(Type)的同义词。一个类最重要的特征就是“能将什么消息发给它?”。
(5) 同一类所有对象都能接收相同的消息。这实际是别有含义的一种说法,大家不久便能理解。由于类型为“圆”(Circle)的一个对象也属于类型为“形状”(Shape)的一个对象,所以一个圆完全能接收形状消息。这意味着可让程序代码统一指挥“形状”,令其自动控制所有符合“形状”描述的对象,其中自然包括“圆”。这一特性称为对象的“可替换性”,是OOP最重要的概念之一。
面向对象其实是现实世界模型的自然延伸。现实世界中任何实体都可以看作是对象。对象之间通过消息相互作用。
如果说传统的过程式编程语言是以过程为中心以算法为驱动的话,面向对象的编程语言则是以对象为中心以消息为驱动。
用公式表示:
过程式编程语言为:程序=算法+数据;
面向对象编程语言为:程序=对象+消息。
读者可能很熟悉编程和编程语言的基本概念,下面从普遍的意义上简要描述一下本书将用到的一些术语,并阐述C++与其他编程语言的关系。
无论使用哪种编程语言,编写出来的程序都是由各个指令构成的。这些指令就称为源代码,存储在磁盘的源文件中。目前有许多编程语言,每一种语言都有其优缺点,都有其吹捧者和批评者。除了C++之外,读者一定还听说过BASIC、COBOL、FORTRAN、PASCAL和C等编程语言。
例如,FORTRAN语言就有将近40年的历史了,目前仍广泛应用于科学和工程计算中,但C++和其他语言也逐渐进入这些领域。COBOL语言专门用于商务数据处理应用程序,它的历史几乎与FORTRAN语言一样长。目前几乎不用COBOL编写新代码,而是多年前编写的大量代码仍在使用。C++也逐渐成为许多商务数据处理程序的可选语言。
C是C++的前身,因为这两种语言有许多共同的语法和功能。实际上,C编程语言是C++的一个子集。但是,C++在发展过程中进行了许多扩展和改进,使之成为一种成熟的语言,而且,C++比功能更强大,用途更广泛。
1.1.1 解释性的程序和编译性的程序的执行过程
编程语言的目的是,与计算机可以执行的程序相比,能够更简单地描述希望计算机执行的动作。计算机只能执行包含机器指令(也称为机器代码)的程序,不能直接执行我们编写的程序。用前面提到的语言编写的程序基本上有两种执行方式,在大多数情况下,一种语言会选择其中一种执行方式。例如,用BASIC语言编写的程序通常是解释性的,也就是说,另一个称为解释器的程序会检查BASIC源代码,确定该程序要做什么,再让计算机完成这些动作。见图1-1。
图 1-1
而C++是一种编译语言。在执行C++程序之前,必须用另一个程序(即编译器)把它转换为机器语言。编译器会检查C++程序,并生成机器指令,以执行源代码指定的动作。当然,解释和编译都不像这里描述的那样简单,但其工作原理就是这样。
使用解释性语言,执行过程是间接的,也就是说,每次执行程序时,都需要确定源代码的意图。因此,这种语言比编译语言的对应程序的执行速度慢得多,有时要慢100倍。任何一种语言要么是解释性的,要么是编译性的,这通常由该语言的设计和用途来决定。
这个规则的一个例外是Java,它是一种相当新的语言,它具有C++的许多特性。由于Java主要用于在不同计算机之间移植以及用在Internet上,所以它基本上是一种解释性的语言。尽管如此,还有一种just-in-time编译器可以在执行过程中,为Java源代码生成对应的机器码,从而大大提高了执行速度。
1.1.2 库
每次编写程序时,如果总是要从头开始编写,就相当烦琐。在许多程序中,常常需要某种相同的功能,例如从键盘上输入数据,或在屏幕上显示信息。为了解决这个问题,编程语言提供了大量预先编写好的代码,以执行标准的输入输出操作,这样就不必重新编写这些代码了。
可用于任意程序的标准代码都保存在一个库中。编程语言附带的库跟语言本身一样重要,因为库的质量和使用范围对完成某一编程任务所需的时间有非常大的影响