1、知识 要点,课程 内容,面向对象程序设计,【掌握】C+的输入输出、const常量的定义、函数的重载、有默认参数的函数和内置函数、new和delete运算符。,面向对象程序设计,课程内容,面向对象程序设计,C+非面向对象的特点,C+语言概述,新的I/O流,const、define与inline,几个特殊函数,引用,new与delete,面向对象程序设计,C+语言概述*,C的优点 语言简洁、紧凑、使用灵活方便 运算符和数据类型丰富 可以直接访问内存地址,能进行位操作 生成的目标代码质量高,程序运行效率高,可移植性好 C的缺点 类型检查机制相对较弱 本身几乎没有支持代码重用的语言结构 程序规模大时,
2、程序员很难控制程序复杂性,1-1,面向对象程序设计,C+语言概述*,C+的特色 是一种多范型的语言,支持多种编程范型 支持抽象性的数据形式 可以实现面向对象程序设计,1-2,back,面向对象程序设计,面向对象程序设计,以对象为基础,以事件或消息来驱动对象来执行相应处理的程序设计方法; 将数据及对数据的操作封装在一起,作为一个相互依存、不可分离的整体对象; 采用数据抽象和信息隐蔽技术,将这个整体抽象 成一种新数据类型类; 面向对象以数据为中心而不是以功能为中心来描述系统,因为数据相对于功能而言更具稳定性。类的集成度越高,就越适合大型程序的开发。,面向对象程序设计,类与对象的概念,在客观世界中,
3、类这一术语是对一组相似对象的抽象和描述。 面向对象程序设计方法中的对象,是构成软件系统的一个基本单位,是描述客观事物的一个实例; 对象由一组属性(Attribute)和一组行为(Action)构成,对象只有在具有属性和行为的情况下才具有意义; 属性是用来描述对象静态特征的数据项,行为是用来描述对象动态特征的一系列操作。,面向对象程序设计,类是具有相同属性和行为的一组对象的集合。 类给出了属于该类的全部对象的抽象定义,而对象则是符合该类特征的一个实体。因此,对象又称作类的一个实例。 分类所依据的基本原则是抽象,即忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,把具有共同性质的事物划分为
4、一类。,面向对象程序设计,面向对象语言的特点,抽象性:抽象是指分析和提取事物中与当前目标有关的本质特征、忽略非本质特征,找出事物的共同特性,将具有共性的事物分为一类。 封装性:即将对象的属性和行为封装在对象的内部,形成一个独立的单位,并尽可能隐蔽对象的内部细节。 继承性:派生类对象自动地拥有父类的全部属性与行为 。 多态性:在父类中定义的属性或行为,被派生类继承之后,可以具有不同的数据类型或表现出不同的行为特性。,面向对象程序设计,C+非面向对象的特点*,程序的一般格式及特点 与传统的C一样,程序同样由main函数以及多个子函数构成,函数体以 括起,2-1,面向对象程序设计,C+非面向对象的特
5、点*,2-1,#include using namespace std; int add(int a, int b) int c; c=a+b;return c; int main() int x,y ;coutx; ciny;int sum; sum=add(x,y);coutsumendl; return 0; ,#include using namespace std;,int add(int a, int b),int x,y ; coutx; ciny; int sum;,面向对象程序设计,新的I/O流 iostream.h提供的I/O流 cin cout,cout 输出流 格式:c
6、out变量1变量2,2-2,C+非面向对象的特点*,面向对象程序设计,新的I/O流 cin 与析取运算符 在输入数据时,如果有多个数据,各个数据之间用空格(回车)分隔,以回车结束输入,2-3,C+非面向对象的特点*,int x1; double x2; char x3; cinx1x2x3;,5 3.4 A,5 3.4 A,面向对象程序设计,新的I/O流 cout与插入运算符换行与分隔,2-6,C+非面向对象的特点*,换行:n endl 分隔: t 空格,int x=10, y=10,z=10; coutx ytzendl; coutx n;,1.cpp,面向对象程序设计,新的I/O流 cou
7、t与插入运算符更多的格式控制2.cpp,C+非面向对象的特点*,2-7,面向对象程序设计,注意: 在使用setw(n)与setprecision(n)时,还需要包含输入/输出操纵符头文件iomanip, iomanip意为input and output manipulate (操纵). setprecision(n)仅对带有小数的数有效,n为整数与小数但不包括小数点的位数。,面向对象程序设计,常用的操纵符使用举例,运行结果,Please input three numbers: 101 201 300 The average of 101 , 201 and 300 is: 200.6666
8、71753,面向对象程序设计,自由的变量说明,void main() int i;i=10;int j;j=10; ,2-11,C+非面向对象的特点*,void main() int k;for (int i=1;i10;i+) int j;j=10; ,面向对象程序设计,C+非面向对象的特点,结构、联合、枚举名可直接作为类型名,enum bool FALSE, TRUE; struct stringchar *ptr; int length; bool done; /enum bool done; string str; /struct string str;,2-11,面向对象程序设计,C
9、+非面向对象的特点,函数 函数说明,void write(char *s) ,C+中的合法表示,2-15,back,面向对象程序设计,C+非面向对象的特点,const、inline与define define 用于定义宏不带参数的宏定义:定义常量带参数的宏定义:类似函数,#define A 10 int main() coutAendl;return 0; ,#define s(a,b) a*b int main() int area=s(2,3);coutarea;return 0; ,2-12,面向对象程序设计,C+非面向对象的特点,const、inline与define const 常量
10、定义用const定义常量 必须初始化其值const可以有数据类型常量定义后,其值不可改变,const int a=100; #define a 100;,2-13,面向对象程序设计,C+非面向对象的特点,const、inline与define,2-13,#include #define T1 a+a #define T2 T1-T1 void main() int a=1;cout “T2 is”T2endl;,#include void main() int a=1;const T1=a+a;const T2=T1-T1;cout “ T2 is ”T2endl; ,面向对象程序设计,C+非
11、面向对象的特点,const、inline与define inline定义的内置函数,P28例2.8用函数体替代函数调用语句,减少调用开销,仅用于较短的函数 在一个文件中定义的内联函数不能在另一个文件中使用。它们通常放在头文件中共享。 不能有循环语句、if语句或switch语句 内联函数要在函数被调用之前声明。 inline比define更安全,提示与分析,2-14,面向对象程序设计,C+非面向对象的特点,const、inline与define,#include #define doub1(x) x*2 inline int doub2(int x) return x*2; void main(
12、) cout “1+2 double is”;coutdoub1(1+2)endl; cout“1+2 double is”;coutdoub2(1+2)endl; ,2-14,doub1(1+2),doub2(1+2),#define doub1(x) x*2,inline int doub2(int x),back,面向对象程序设计,C+非面向对象的特点,参数特殊的函数 带缺省参数的函数函数参数具有默认值,int special(int x=5, float y=5.3) coutxyendl; special() special(6) special(6,7);,void delay(
13、int n=1000) int j=0;while (j=n) j+; int main() delay(500);delay();return 0;,提示与分析,2-16,面向对象程序设计,int f(int a,float b=5.0,char c=.,int d=10); /正确 int f(int a=1,float b=5.0,char c=.,int d); /错误, d未给值 int f(int a=1,float b,char c=.,int d=10); /错误, b未给值,(1) 若函数具有多个形参,则缺省形参值必须自右向左连续地定义,并且在一个缺省形参值的右边不能有未指定
14、缺省值的参数。,假如有如下声明:int f(int a,float b=5.0,char c=., int d=10); 采用如下调用形式是错误的:f(8, , ,4); /语法错误,(2) 在调用一个函数时,如果省去了某个实参,则直到最右端的实参都要省去(当然,与它们对应的形参都要有缺省值)。,面向对象程序设计,(3) 缺省形参值的说明必须出现在函数调用之前。这就是说,如果存在函数原型,则形参的缺省值应在函数原型中指定;否则应该在函数定义中指定。另外,若函数原型中已给出了形参的缺省值,则在函数定义中不得重复指定,即使所指定的缺省值完全相同也不行。,int sub(int x=8,int y=
15、3); /缺省形参值在函数原型中给出 void main(void) sub(20,15); /20-15sub(10); /10-3sub(); /8-3 int sub(int x,int y) /缺省形参值没有在函数定义时给出 return x-y; ,面向对象程序设计,C+非面向对象的特点,函数重载 定义:同一个函数名可以有多个函数实现 进行函数调用时根据函数名和函数参数来决定调用的函数 实现函数名重载的条件 要么参数的个数不同 要么参数的类型不同,范例,提示与分析,2-18,面向对象程序设计,C+非面向对象的特点,函数重载,2-18,#include using namespace
16、std; int sum (int x, int y) return x+y; int sum( float x, float y) return x+y; int main() coutsum(1,2)endl;coutsum(3.3, 4.4)endl;return 0; ,sum(1,2),sum(3.3, 4.4),int sum (int x, int y),int sum( float x, float y),面向对象程序设计,C+非面向对象的特点,2-18,函数重载,建立一个被称为sroot的函数,返回其参数的二次方 根。要求重载sroot,让它能够计算整数,双精度数 的二次方根
17、。,面向对象程序设计,C+非面向对象的特点,2-18,函数重载,#include #include using namespace std; int sroot(int a) return sqrt(a); double sroot(double a) return sqrt(a); int main() coutsroot(5)endl;coutsroot(5.4)endl;return 0; ,面向对象程序设计,/* C+无法区分这两个函数。因为在没有确定函数调用是对哪一个重载的函数之前,返回类型是不知道的。*/ int add(int i1,int i2);float add(int f
18、1,int f2);,注意: (1) 各个重载函数的返回类型可以相同,也可以不同。但如果函数名相同、形参表也相同,仅仅是返回类型不同,则是非法的。在编译时会认为是语法错误。,面向对象程序设计,/将char型转换成int型,然后与add(int,int)绑定。 add(A,A+0); /*函数实参向(double,double)转换,然后与add(double,double)绑定。*/ add(float(8),float(9);,(2) 确定对重载函数的哪个函数进行调用的过程称为绑定(binding), 绑定的优先次序为精确匹配、对实参的类型向高类型转换后的匹配、实参类型向低类型及相容类型转换
19、后的匹配。,面向对象程序设计,绑定(匹配)二义性 两个重载函数,编译器不知道进行哪种类型的转换,与哪个函数绑定,这种现象就叫绑定(匹配)二义性。,注意: 重载函数与带默认形参值的函数一起使用时,有可能引起二义性。 例如: void add(int x, int y, int z=0);当调用add(8,9)时,不知是和add(int,int)绑定,还是和add(int,int,int=0)绑定?消除这种二义性的办法是增加或减少实参个数。,面向对象程序设计,C+非面向对象的特点,作用域运算符: 可以在局部变量作用域中引用全局同名变量,2-17,#include int avar; main( )
20、 int avar; avar=25; :avar=10; cout“local avar=“avarendl; cout“global avar=“ :avar endl; ,back,面向对象程序设计,C+非面向对象的特点,new与delete 格式,2-17,=new =new (初始值) =new 表达式 /分配数组空间delete delete 表达式 ,int *p; p=new int; *p=10; delete(p);,int *p; p=new int(10); delete(p);,面向对象程序设计,C+非面向对象的特点,new与delete 为数组分配空间,2-17,i
21、nt *p=new int10;,int c; int *p; cinc; p=new int c;,int c=10; int ac; /C语言中不允许的形式,back,面向对象程序设计,#include using namespace std; int main() int * p = NULL , * t ; int i ;p = new int 10 ;if ( p = NULL ) cout “allocation faiuren“ ; return 1; for ( i = 0 ; i 10 ; i + ) pi = 100 + i ; cout endl ;for ( t = p
22、 ; t p+10 ; t + ) cout *t “ “ ;cout endl ;delete p ;return 0; ,例 用 new 算符建立动态数组,i 是偏移量 p 指针本身值不变,面向对象程序设计,#include using namespace std; int main() int * p = NULL , * t ; int i ;p = new int 10 ;if ( p = NULL ) cout “allocation faiuren“ ; return 1; for ( i = 0 ; i 10 ; i + ) pi = 100 + i ; cout endl ;
23、for ( t = p ; t p+10 ; t + ) cout *t “ “ ;cout endl ;delete p ;return 0; ,for ( i = 0 ; i 10 ; p +,i+ ) cout *p “ “ ;,释放什么空间?,面向对象程序设计,C+非面向对象的特点,引用 为变量建立别名 格式,2-17, &=为变量名2 建立别名(变量名1) 变量1和变量2占用同一内存 引用必须在建立时初始化,面向对象程序设计,C+非面向对象的特点,引用 引用的定义初始化,2-17,可以用引用变量赋初值 int i=5; int ,面向对象程序设计,C+非面向对象的特点,引用 错误的形
24、式,2-17,int /不能建立引用的引用 int &ref1=NULL /不能定义空引用,/错误的表示 int i; int /不能为常量建立引用,面向对象程序设计,C+非面向对象的特点,引用 引用是一种隐式指针,2-17,int i=15; int *ip=,注意:引用变量的使用同一般变量 P38 例2.18,面向对象程序设计,C+非面向对象的特点,引用和函数 引用类型的参数的操作实际是对传递给它的实参操作,2-17,void swap(int *m, int * n) int temp;temp=*m; *m=*n; *n=temp; int a=5,b=10 swap(,void swap(int ,面向对象程序设计,C+非面向对象的特点,引用和函数 引用返回类型 函数的返回值为引用 可以使函数出现在赋值号左方 P42 例2.22 P43 例2.23,2-17,