第一讲 基于WINDOWS编程的基础知识
1.引言
1.1 过程化(procedural programming):程序被认为是在一个数据集合上进行的一系列操作。
1.2 结构化(structured programming):主要思想是:功能分解并逐步求精。 1.3 面向对象的程序设计(object_oriented programming)
实质是把数据和处理这些数据的过程合并为一个单独的“对象”――一个具有确定特性的自完备的实体。
1.4 对象的程序设计的特征
1) 自完备(self_contained):能够完全实现一些严格定义的功能。 2) 封装 3) 继承 4) 多态
2. 类与数据封装
2.1 什么是类?
简单的说,类就是一种用户定义的数据类型,跟结构类似;并且,类具有自己的成员变量和成员函数(方法),通过它们可以对类自身进行操作。 如:汽车可以看作是发动机、车轮、座椅等诸如此类的集合。也可以从功能的角度来研究,譬如,能移动,加速,减速,刹车等。
定义(例子)VC++中讲解
2.2 封装(encapsulation)
定义:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
封装的优点:
◆ 封装允许类的客户不必关心类的工作机理就可以使用它。就象驾驶员不必了解发动机的工作原理就可以驾驶汽车一样,类的客户在使用一个类时也不必了解它是如何工作的,而只需了解它的功能即可。
◆ 所有对数据的访问和操作都必须通过特定的方法,否则便无法使用,从而达到数据隐藏的目的。
2.3 对象
对象就是类的一个实例。类与对象的关系就如类型和变量的关系,所有对类的操作都必须通过对象来实现。当一个类定义了多个对象时,每个对象拥有各自的成员数据。 2.4 类的三种成员类型
◆ 私有成员(private):缺省情况下,一个类中的所有成员都是私有的。私有成员只能被类本身的成员函数访问。并且不具有继承性。
◆ 公有成员(public):公有成员可以被类成员函数和外部函数使用。
◆ 保护成员(protected):在介绍继承时再介绍。
2.5 构造函数与析构函数
1)构造函数
◆ 是特殊的成员函数;在创建对象时首先由系统自动调用。它的作用是为新创建的对象分配空间,或为该对象的数据成员赋值等。
◆ 构造函数的名称必须与其类名称完全相同,并且不允许有返回值。
2)析构函数
◆ 析构函数是构造函数的逆操作。
◆ 析构函数在类名之前加~来命名,它不允许有返回值,也不允许带参数,并且一个类只能有一个析构函数。 2.6 简单介绍
1)const 用法
const 变量: const int i = 5; i = 10; // Error i++; // Error const 型成员函数
Void SomeFunction() const ; 此方法不能改变类中的任何成员。当成员函数不改变对象的属性时,就应当把它说明为CONST 型函数。这可以使编译程序帮助查错,比程序员亲自查错要快得多,而且开销更少。[错误的类型:语法错、编译错、链接错、运行错、逻辑错] 2)类静态成员
静态成员变量被一个类所有的实例所共享。静态变量使用固定地址存放,而不使用对象。
定义:在变量或函数前加关键字static即可。 例:class counter {
static long t1; ??
static GetValue1() {
return t1; }
}
它属于类而不属于对象。调用时,使用类范围运算符;
counter::t1 = 1;
counter::GetValue1();
静态成员函数没有this指针,因此不能被说明为const类型。以因为其它的函数在访问成员变量时需要使用this指针,所以静态成员函数不能访问任何非静态成员变量。
3)类的友员
使用友员函数或友员类的成员函数可以访问类的私有成员。但友员函数不属于类的成员函数。
友员函数的定义:
在类的任何地方定义,只须在函数前加上关键字friend即可;
例:class FriendFun
{ friend void Display(FriendFun*);
char *name; int age; public: FriendFun(char* str, int i) { name = str;
age = i;
}
}
void Display(FriendFun * a)
{ cout << “The friend ” << a->name << “is”<< a->age
}
<<“years old”< void main() { FriendFun dd(“Frank”,45); Display(&dd); } 友员类 ◆ 友员类的成员函数可以象类的友员函数一样访问该类的所有成员; ◆ 友员类不一定是相互的;即类A是类B的友员类,但类B不一定是类A的友员类; ◆ 友员类的定义与友员函数的定义类似; 3. 继承 3.1 传统程序设计的缺点: 增加功能对程序所作的修改工作量非常大 3.2 继承的优点: 继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。 3.3 基类与派生类 1)一个类可以继承其它类的成员,被继承的类叫基类或父类;继承类叫派生类或子类 2)派生类不但拥有自己的数据成员和成员函数,还可以拥有父类的数据成员和成员函数。 3.4 类的保护成员(protected) 前面介绍了类的私有成员只能被类的成员函数和友员函数使用;类的保护成员能被类及其派生类的成员函数和友员函数使用。也就是说,类的保护成员具有继承性,而类的私有成员不具有继承性。 3.5 公用基类和私有基类 1)公用基类中的所有public成员在派生类中仍是public成员,所有protected成员在派生类中仍是protected成员。 2)私有基类中的public成员和protected成员在派生类中均变成private成员。 友员函数不能被继承。 3.6 多重继承 1)多重继承的定义方法 例子 Class A(){?int i; void func1();?} Class B(){?int i; void func1();?} Class C():public A,B {?void Show()?} 缺省情况下基类被定义为 private; 2)继承的不确定性 例子: Class C():public A,B { ? void Show() { j = i*i; func1();} ? } 3)解决多重继承的不确定性: ◆ 由于基类A和B中同时拥有数据成员i和成员函数func1,类C引用基类的成员时,系统无法分辨是调用哪一基类的成员而发生错误; ◆ 使用域操作符指明要调用的基类,即可解决不确定性问题。 Class C():public A,B { ? int j; void Show() { j = A::i*B::i; A::func1(); } ? } 3.7 多层继承 定义:所谓多层继承指的是从一个类派生出另一个类,然后以该派生类作为基类,派生出另一个类,直到最后生成的派生类满足需要为止。 ◆ 见MSDN中的Hierarchy Chart 3.8 派生类的构造函数与析构函数 在继承关系下,派生类的构造函数必须负责调用基类的构造函数来设置基类数据成员值。 例子 class base { ? public: int i; base(int j) {i = j;} ? } class derived:public base { ? public: double f; derive(int, double); ? } derive::derive(int k, double l):base(k) { ? f = l; ? } 3.9 构造函数的调用顺序 ◆ 在定义派生类对象时,系统首先调用基类的构造函数,然后调用派生类的构造函数。 ◆ 析构函数的调用顺序与构造函数的调用顺序相反。 4. 重载 4.1 函数重载 1)如果函数有相同的名称和返回值,而有不同的参数个数或参数类型,则这些函数就是重载函数。 2)派生类继承了基类的某一函数,并且又自定义了一个同名函数,有相同的返回值,不同的参数类型或参数个数。这种情况不属于重载。因为它们属于不同的域。 3)例: class base { ? void func(int i); void func(double f); void func(char ch); ? } class derive:public base { ? void func(float flt); ? } 4.2 操作符重载 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库二次开发初级培训班培训讲义在线全文阅读。
相关推荐: