1.72k likes | 1.81k Views
绪 论. 面向对象程序设计: 通过增加软件可扩充性和可重用性来改善并提高程序员的生产能力,并控制维护软件的复杂性和软件维护的开销. OOP :具有结构化程序设计的一切优点 将数据和对数据的操作放在一起,作为一个相互依存、不可分割的一个整体,抽象成一种新的数据类型 — 类 两大技术(两个重要原理) 数 据 抽 象 信 息 隐 藏. 自行车类: ( 1 )数据: 尺寸、颜色、材料等(属 性) ( 2 )操作: 转弯、移动、修理等(操 作)
E N D
面向对象程序设计: 通过增加软件可扩充性和可重用性来改善并提高程序员的生产能力,并控制维护软件的复杂性和软件维护的开销
OOP:具有结构化程序设计的一切优点 将数据和对数据的操作放在一起,作为一个相互依存、不可分割的一个整体,抽象成一种新的数据类型—类 两大技术(两个重要原理) 数 据 抽 象 信 息 隐 藏
自行车类: (1)数据:尺寸、颜色、材料等(属 性) (2)操作:转弯、移动、修理等(操 作) 每一辆具体的自行车就是属于自行车类的一个对象
OPP支持的软件开发策略 编写可重用代码 编写可维护的代码 共享代码 精化已有的代码
OOP的五大基本概念 1.对象(Object):数据及可以对这些数据施加的操作结合在一起所构成的独立实体的总称,是计算的最基础的构造块 成员变量(数据):表明对象的状态 成员方法(操作):表明对象的行为 一组成员变量和相关的方法集合
2.类(Class):对一组具有相同数据和相同操作的对象的描述(定义),依据共同的行为将有关对象进行的一种分组2.类(Class):对一组具有相同数据和相同操作的对象的描述(定义),依据共同的行为将有关对象进行的一种分组 类中所有对象共享类中所有共同的特性 类是对象的抽象 程序中:只有类 对象是类的实例 运行时:只有对象
3.实例(Instance):由某个特定类所描述的一个对象3.实例(Instance):由某个特定类所描述的一个对象 通常,对象和类的实例是同义词
4.消息(Message):要求某个对象执行类中所定义的某个操作的规格说明4.消息(Message):要求某个对象执行类中所定义的某个操作的规格说明
5.方法(Method):对象所能执行的操作 它是类中定义的函数,描述对象执行操作的算法,即响应消息的方法
OOP方法学的四大要点 1.认为世界由各种对象(object)组成,任何事物都是对象,是某个对象类(class)的实例(instance) 2.把所有对象都划分成各种对象类,每个对象类都定义了一组方法(method),即允许施加于该类对象上的各种操作
3.对象之间除了互相传递消息的联系之外,再没有其他联系 4.对象类将按照“类”、“子类”与“父类”的关系构成一个层次结构的系统
OOP的三大核心特征 封装性(Encapsulation) 继承性(Inheritance) 多态性(Polymorphism)
1.封装性:数据和加工处理该数据的方法紧密结合在一起构成黑匣子的整体 对私有数据不能执行该对象的成员函数之外的任何其它函数
2.继承性:一个类直接继承其父类的全部描述(数据和函数) 继承具有传递性: 若类C继承类B,类B继承类A,则类C继承类A 类实际上继承了类等级中在其上层的全部基类(父类)的所有描述
继承方式分类(一) 取代继承:徒弟学会全部技术,可以取 代师傅 包含继承:水果是对象,苹果是特殊的 水果,包含了水果具有的所 有特征 受限继承:驼鸟是对象鸟的一个特例, 它不能继承鸟会飞的特征 特化继承:工程师是一类特殊的人,比 一般人具有更多的特有信息
继承方式分类(二) 单继承:一个类只有一个父类时 (树结构) 多继承:一个类可有多个父类时 (图结构)
3.多态性:在类等级的各层中共享(公用)一个行为(函数)的名字,而类等级中的每个类却各自按照自己的需要来实现这个行为3.多态性:在类等级的各层中共享(公用)一个行为(函数)的名字,而类等级中的每个类却各自按照自己的需要来实现这个行为 一个名字,多种语义 相同界面,多种实现
函数重载表达了最简单的多态性 void f( int, int, char ); void f( char, float ) ; void f( int, int ) ; void f( float, float ); 参数数量、类型、顺序不同,函数体也可以完全不同
OOP的两个重要原理 1.数据抽象:通过从特定的实例中抽取共同性质以形成一般化的概念的过程 强调部分特性(用户所关心的特性) 忽略其他特性(用户不关心的特性) 用户:只关心做什么 , 不关心怎么做 OOP技术比任何一种编程技术都更强调抽象在软件开发中的重要性
2.行为共享: (1)实体(模块)的外部接口称为行 为 (2)行为共享允许多个实体(模块) 具有相同的接口集 (3)行为共享增强系统的灵活性 (4)行为共享增强系统的抽象
流 流是一个抽象的概念,它指的是数据从一个源(source)到一个终点(sink)的流动 c++提供四个预定义的开放流
cin: 标准输入,通常指键盘,对应于 c中的stdin, cout:标准输出,通常指屏幕,对应于 c中的stdout cerr:标准错误输出,通常指屏幕,对 应于c中的stderr clog:cerr的全缓冲版(c中没有等价 的)cerr:无缓冲 clog:有缓冲
1.const 比较 # define pai 3.1415927 预处理中的宏定义 const float pai=3.1415927 或者 floatconst pai=3.1415927 常量修饰符 pai是类型化的,有地址,可用指针指向它
定义或说明一个常数组可采用如下格式: • <类型说明符> const <数组名>[<大小>]… • 或者 • const <类型说明符> <数组名>[<大小>]… • int const a[5]={1, 2, 3, 4, 5};
常对象是指对象常量,定义格式如下: • <类名> const <对象名> • 或者 • const <类名> <对象名> • 定义常对象时,同样要进行初始化,并且该对象不能再被更新
下面定义的一个指向字符串的常量指针: • char * const prt1 = stringprt1; • 其中,ptr1是一个常量指针。因此,下面赋值是非法的。 • ptr1 = stringprt2; • 而下面的赋值是合法的: • *ptr1 = "m"; • 因为指针ptr1所指向的变量是可以更新的,不可更新的是常量指针ptr1所指的方向(别的字符
下面定义了一个指向字符串常量的指针: • const char * ptr2 = stringprt1; • 其中,ptr2是一个指向字符串常量的指针。ptr2所指向的字符串不能更新的,而ptr2是可以更新的。因此, • *ptr2 = "x"; • 是非法的,而: • ptr2 = stringptr2; • 是合法的。
(1)指向常量的指针: 指向的常量不能改变 1)const char * pc=”asdf”;//指向常量 的指针 pc[3]= ’a’; //错 pc=”ghik”; //对 2)const char * step[3] ={”left”,”right”,”top”}; step [2]=”skip”; //对 step [2][1]=’i’; //错
(2)常指针:指针本身不能改变,指向的对象可以改变(2)常指针:指针本身不能改变,指向的对象可以改变 1)char * const pc=”asdf”; //常指针 pc[3]=’a’; //对 pc =”ghik”; //错 2)char * const step [3] ={“left”,”right”,”top”}; step[2]=”skip”; //错 step[2][1]=’i’; //对
(3)指向常量的常指针:指针本身及指向的对象均不能改变(3)指向常量的常指针:指针本身及指向的对象均不能改变 const char * const pc=”asdf”; //指向常量 的常指针 pc[3]=’ a’; //错 pc =”ghik”; //错
注意: (1)const总是修饰紧随其后的东西 (2)指向常量的指针不能赋给一般 的指针,一般的指针可以赋给 指向常量的指针
2. 常引用 • 使用const修饰符也可以说明引用,被说明的引用为常引用,该引用所引用的对象不能被更新。其定义格式如下: • const <类型说明符> & <引用名> • 例如: • const double & v; • 在实际应用中,常指针和常引用往往用来作函数的形参,这样的参数称为常参数。 • 在C++面向对象的程序设计中,指针和引用使用得较多,其中使用const修饰的常指针和常引用用得更多。使用常参数则表明该函数不会更新某个参数所指向或所引用的对象,这样,在参数传递过程中就不需要执行拷贝初始化构造函数,这将会改善程序的运行效率。
#include • const int N = 6; • void print(const int *p, int n); • void main() • { • int array[N]; • for (int i=0; i cin>>array[i]; • print(array, N); • } • void print(const int *p, int n) • { • cout<<"{"<<*p; • for (int i=1; i cout<<","<<*(p+i); • cout<<"}"< }
常成员函数 • 使用const关键字进行说明的成员函数,称为常成员函数。只有常成员函数才有资格操作常量或常对象,没有使用const关键字说明的成员函数不能用来操作常对象。常成员函数说明格式如下: • <类型说明符> <函数名> (<参数表>) const; • 其中,const是加在函数说明后面的类型修饰符,它是函数类型的一个组成部分,因此,在函数实现部分也要带const关键字。下面举一例子说明常成员函数的特征。
void R::print() { cout< } void R::print() const { cout< } void main() { R a(5, 4); a.print(); const R b(20, 52); b.print(); } 该例子的输出结果为: 5,4 20;52 • #include • class R • { • public: • R(int r1, int r2) { R1=r1; R2=r2; } • void print(); • void print() const; • private: • int R1, R2; • };
2.Inline 内联函数 包含在类的说明中的成员函数称为内部函数 它告诉编译器一旦有可能就直接用该函数的代码取代对该函数的调用,以避免函数调用的开销
class 类名 { 成员变量; 成员函数; } 即使不是在类说明中定义的函数,也可以说明为内部的(加inline) 以空间换时间
内联函数的限制 (1)内联函数不能包含任意静态数据 (2)内联函数不能使用任何循环 switch,goto语句 (3)内联函数不能是递归的 (4)内联函数中不能有数组说明(可 放在外面说明)
几个重要概念 1.函数原型 int get_ word ( char *, int , float ); 把函数的函数名,返回类型及使用的参数的类型和个数提前告诉编译程序 1)函数原型通常放在程序的顶部 2)c++需要所有函数都有原型
2.缺省参数 int g( char a, int b, int c=0 ); 调用时若未给第三个参数,则缺省为0 (1)所有取缺省值的参数都必须出现在不取缺省值的参数的右边 (2)缺省值只需在第一次被提及的地方指定
3.引用类型 数据的一种类型(同指针类型很相似) c只能通过传值传递参数,不能通过传递引用传递参数 c++不仅通过传值传递参数,也可通过传递引用传递参数
(1)引用的概念 引用是给对象(变量)取一个别名,它引入了对象的一个reference 在C中只能使用指针建立别名,不能使用引用建立别名 在C++中不仅使用指针建立别名,也可使用引用建立别名
定义引用的关键字是type &,它的含义是“type类型的引用”,此引用与type类型对象或变量的地址相联系
例一 int i; int &j =i; 创建了一个整型引用变量j,它是i的地址的别名,即j是i的同义词,它们表示同一个对象
例二 int i; int &j; 错 j= i ; 定义引用类型变量时就必须初始化 而extern int & i; // 正确,不必给出初值
例三 int i; int &j=i; i=5; j=i+1; i,j的值均为6 引用是对象本身,而不是副本,所以对对象或对引用的任何操作都会影响到它们共同的对象
一个引用可看作一个特殊类型的指针 引用与指针的差别 (1)引用必须初始化 (2)初始化后不能再作为其他对象 的别名
引用可以使用临时变量来进行初始化 (1)用常量初始化引用(引用为—常量的别名) int &ir=1024; int T1=1024; int &ir =T1; (T1为临时变量)