您好,欢迎访问三七文档
1面向对象程序设计教材:C++程序设计实践教程光盘:学习指导、习题祥解、模拟试卷出版:华中科技大学出版社编著:马光志讲授:华中科技大学计算机学院马光志maguangzhi@mail.hust.edu.com2第1章引论31.1程序设计语言机器语言:计算机自身可以识别的语言汇编语言:接近于机器语言的符号语言高级语言:接近自然语言的程序设计语言,如ADA、C、PASCAL、FORTRAN、BASIC面向对象的语言:描述对象“特征”及“行为”的程序设计语言,如C++、SMALLTALK等面向对象基于组件的语言:面向对象且类型能成为组件的程序设计语言,如Java、C#等41.2程序编译技术编译过程:预处理、词法分析、语法分析、代码生成、模块连接。预处理:通过#define宏替换和#include插入文件内容生成纯的不包含#define和#include等的C或C++程序。词法分析:产生一个程序的单词序列。一个单词或词法单位可以是保留字如if和for、标识符如sin、运算符如+、常量如5和abcd等。语法分析:检查程序语法结构,例如if后面是否出现else。代码生成:生成低级语言代码如机器语言或汇编语言。C和C++语言的标识符编译为低级语言标识符时会换名,C和C++的换名策略不一样。模块连接:形成一个可执行的程序。静态连接是编译时由编译程序完成的连接,动态连接是运行时由操作系统完成的连接。关于BC与VC:BC完全支持国际标准,VC支持70%左右。编译器推荐C++builder6.0。否则本书的例子有很多不能运行。5•预处理的例子:假如stdio.h的文件内容如下:externintscanf(constchar*,…);externintprintf(constchar*,…);程序test.c的文件内容如下:#includestdio.h#definepi3.14voidmain(){printf(area=%lf,pi*5*5);}•预处理的结果,由test.c文件得到如下内容:externintscanf(constchar*,…);externintprintf(constchar*,…);voidmain(){printf(area=%lf,3.14*5*5);}61.3面向对象的语言及程序设计•纯OO型语言:程序全部由类构成。SMALLTALK、JAVA、C#、OBJECT-ORIENTEDPASCAL。•混合型OO语言:程序由类、过程或函数以及变量定义构成。C++、VB.NET。•面向对象程序设计经历系统分析、系统设计、对象设计和对象实现四个阶段。•系统分析最初建立对象模型、动态模型及功能模型,供其他阶段细化。其中对象模型最为重要,描述对象、类型之间的关系。•面向对象的分析与设计各阶段共用上述三个模型,阶段之间的界限不是十分明显,能更好地支持软件工程的快速原型法。71.4面向对象的基本概念•函数绑定:函数调用和函数入口关联的过程。早期绑定:发生在程序开始执行以前,由编译程序静态连接,或者由操作系统动态连接完成,将函数入口地址填写到函数调用处。晚期绑定:发生在程序执行过程中间,由程序自己完成。•对象:现实世界具体的或抽象的“事物”,经历产生、活动、死亡等阶段。体育比赛的“运动员”和“赛局”分别为具体和抽象的对象。•类:描述对象特征和行为的类型。有结构的类属于复杂类型。简单类型和复杂类型变量(对象)初始化(产生)形式趋向统一。•对象既可以是变量,也可以是常量。就象简单类型既有变量也有常量一样。统一起来,对象分为简单类型对象和复杂类型对象。8•封装:将对象的“特征”和“行为”包装在一起,形成对象的类型定义,分别描述对象的“组织结构”和“功能”。封装定义了对象的边界,提供了外部访问的接口,屏蔽了对象的“行为”细节。•交互:直接交互指一对象调用另一对象的“操作”、“功能”或“函数”;间接交互通过发送或监听消息完成。•C++程序的对象既可以直接交互,也可以通过操作系统提供的消息机制间接交互。•面向对象基于组件的语言可通过自己的事件、消息机制间接交互。9•重载:一个函数名称用来定义完成不同功能的多个函数,参数个数和类型随完成功能的不同而不同。将运算符看作函数,操作数就是-参数。-5和8-3分别是有一个和两个参数的减法函数,可记为operator-(int)、operator-(int,int)。•多态:通过一个函数名调用函数表现出的不同行为。早期绑定的多态是静态多态,晚期绑定的多态是动态多态。重载函数表现的行为是静态多态,虚函数表现的行为是动态多态。由此可见,重载函数使用早期绑定,虚函数使用晚期绑定。“多态”一般指动态多态。•C++已经自嵌入地重载了简单类型运算函数,故不允许对简单类型进行运算符重载。换言之,运算符重载函数的参数不能都为简单类型,必须至少有一个参数代表对象。例如-5、8-3调用的是自嵌入的减法运算重载函数(函数名见上)。重载函数要么参数个数不同,要么参数类型不同。10•继承:一个对象获得另一个或多个对象的“特征”和“行为”,从而实现了软件重用。例如,小孩长相象父母是获得父母“特征”,走路象父亲是获得父亲“行为”。•继承有取代继承、包含继承、受限继承和异化继承等方式。•抽象:一种抽象形式是从对象(事物)到类型(概念),另一种形式是从低级类型(概念)到高级类型(概念)。从事物“张三”、“李四”抽象出“学生”的概念,从“学生”、“教师”的概念可抽象出“师生”的概念。•抽象类:抽象级别最高的类,无法描述具体特征和行为。例如,从“点”、“线”、“圆”抽象出“图形”的概念。无法说出“图形”有何特征,也无法说明其绘图行为。111.5C++语言的特点•C的超集,完全兼容C,代码质量高、速度快。•多继承的强类型的混合型的OO语言。•支持面向对象的运算符重载:至少一个操作数的类型代表对象的类型。•提供函数模板和类模板等高级抽象机制。•支持面向对象的异常处理。•支持名字空间namespace。121.6C++的程序结构•支持C的注解/*…*/和C++新注解//到本行结束。•强类型要求变量和函数先声明再使用:printf等标准函数必须先#includestdio.h再使用。•扩展名为.h的文件只应包含变量、函数的说明,其定义应出现在扩展名为.cpp的程序文件里。–变量说明:externintx;//说明只含类型和名称–变量定义:intx,y=3;externintz=4;//定义包括初值–函数说明:无函数体的原型声明,可无参数名。例如:doublesin(double);•C++须说明externClongsum(int)以调用C的sum:编译成低级语言后,C++和C的sum的低级语言名称相同。•类iostream对象cin通过函数输入、cout通过输出。13•继续支持stdio.h,强类型要求必须先#include再使用,其中包含了变量和函数说明:intscanf(constchar*,…);//返回成功输入变量的个数。intprintf(constchar*,…);//返回成功输出字符的个数。intx=printf(9876543210);//结果x=10,输出10个字符。inty=printf(%d,98765);//y=5正好是十进制有效位数。•流iostream类对象(变量)cin通过重载运算符函数完成输入。就象+运算符一样,可以自左至右连续运算。试比较变量cin、x、y、z的运算:x+y+z;//x+y的和(一个值)再和z进行+运算。cinyz;//ciny的结果(为cin)再和z进行运算。//等于ciny;cinz•cin关于运算的结果为cin,cout关于运算的结果cout。可用cin或cout的运算结果连续进行和运算。14第2章C++类型、变量及函数152.1声明及定义•常量表达式:值能被编译程序计算且结果为常量的表达式。单个或多个常量构成的常量表达式如下:3;//单个常量构成的常量表达式3.14*3*3;//r=3的圆面积,含义明确且不降低效率sizeof2;sizeof(int[2]);//sizeof非函数。如是,以下//表达式应调用printfsizeof(3+printf(“ABC”))//=sizeof(int),//未调printf,不打印ABC•任意表达式:由常量、变量、函数调用等构成的表达式,不能被编译程序计算,只能在程序运行时计算。•类型表达式:int[2]是类型表达式,非数值表达式。16•左值表达式:在等号左边出现的值表达式(如下红色标注)。非const类型的变量:intx;x=2;引用非const类型的变量:int&y=x;y=3;非const指针和非const内容:char*p=&z;p=ab;*p=1引用非const类型的函数:int&f(){};f()=3;前置++和--运算:intC=1;(++C)=5;赋值运算:(C=2)=3;(C+=2)=3;•右值表达式:只能出现在等号右边的数值表达式,上述C变量的C++是右值。constintx=3;x为右值,因为不能有赋值语句x=8。C语言的函数调用为右值,因C的函数调用只在等号右边出现;但C++返回左值的函数可以出现在等号左边,见上int&f()。•一个表达式既然能出现在等号左边,就必然能出现在等号右边。故左值表达式是右值表达式,反之则不一定成立。例如,常量8是右值表达式,它不能出现在赋值号=的左边。17•变量定义须有初值,函数定义须有函数体。否则只能称为说明或声明。•C语言声明和定义:变量声明和定义必须在语句之前。一般只允许以常量表达式初始化变量。只有函数内定义的非static变量可用任意表达式初始化。•C++语言声明和定义:变量声明和定义不必在语句之前。所有变量都可以用任意表达式初始化。函数内定义的非static变量如不初试化,其值不确定。新编译器允许在if、while和for的条件部分定义变量,仅限于其语句部分可以访问。由开工函数产生(初始化全局变量),由收工函数消灭全局变量。18#includestdio.hexterninth=0;//C变量定义方式:常量表达式初始化externinti;//变量声明,C和C++都可先声明后定义inti;//C定义方式,初始化i=0intj=i+printf(“ABC”);//C++方式:任意表达式。输出ABCstaticintp=j+sizeofprintf(“ABC”);//C++方式:不输出ABCvoidmain(void){staticintn=j+5;//C++定义方式:任意表达式初始化intk,i=20;//C定义方式,k值随机for(intj=k+2;j9;j++){intm=5;//C定义方式};intq=23;//C++定义方式,定义出现在for语句后struct{intk,m;}b={j+3,5};//C++定义方式inta[4]={scanf(%d,&k),1};//C++定义方式}//即使main函数体为空也会输出ABC。程序作为对象(产生、//活动和灭亡)。192.2类型定义•解释原则:定义中出现的运算符,优先级高的先解释,相同时按结合性解释(自左至右,或反之如**、*&)。–char(f)(int);//按结合性先解释(f),(f)无实质意义,等于charf(int)•括号在C和C++中优先级最高,可以提高解释优先级。–char(*f)(int);//按结合性先解释(*f),f是一个指针,指向函数–char*f(int);//按优先级先解释f(int),f是一个函数,返回指针•对typedef和强制类型转换,都要按以上原则解释类型。–typedefint(*F[8])(int,int);–F*f;//*先于F解释,对*f加()替换F得int(*(*f)[8])(int,int)•自左至右结合是指两个运算符优先级相同时先计算左边的,如x+y+z则先计算
本文标题:C++教程
链接地址:https://www.777doc.com/doc-4285447 .html