面向对象程序设计(谭浩强版)_第1页
面向对象程序设计(谭浩强版)_第2页
面向对象程序设计(谭浩强版)_第3页
面向对象程序设计(谭浩强版)_第4页
面向对象程序设计(谭浩强版)_第5页
已阅读5页,还剩494页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象程序设计面向对象程序设计第1章C++的初步知识第2章类和对象第3章关于类和对象的进一步讨论第4章运算符重载第5章继承与派生第6章多态性与虚函数第7章输入输出流第8章C++工具内容简介面向对象的根本思想C++语言的根本概念、根本语法和编程方法C++语言的面向对象特征类与对象继承与派生多态性与虚函数学习方法多练习,掌握根本概念多读程序,学习编程方法与技巧多上机实践,加强动手能力多剖析范例,积累编程经验教材及参考书目C++语言根底教程.吕凤翥著.清华大学出版社.1999C++语言及其程序设计教程〔修订版〕.张国峰编著.电子工业出版社.1997C++语言程序设计.郑莉等编著.清华大学出版社.1999VisualC++程序设计.王育坚编著.清华大学出版社第1章C++初步知识1.1从C到C++1.2最简单的C++程序1.3C++对C的扩充1.4C++程序的编写和实现1.5关于C++上要实践1.6C++程序的结构1.1从C到C++机器语言〔二进制码〕汇编语言20世纪50年代中期,FORTRAN语言20世纪50年代中期,Algol语言在计算机语言开展史上具有划时代的意义,引入了许多程序设计概念。如变量、数组、循环、分支等。提出块(Begin…End)思想,对数据进行保护,是一种初级封装。20世纪60年代中期,Simula67语言

面向对象语言的鼻祖,提出了对象、类的概念,并支持类的继承。20世纪70年代中期,Ada语言

支持数据抽象类型的最重要的语言之一,但不完全支持继承。20世纪70年代中期,Smalltalk语言

最有影响的面向对象语言之一,丰富了面向对象的概念。20世纪80年代中期后出现C++等多种面向对象语言1.1从C到C++C语言的主要特点是:1、C语言是一种结构化的程序设计语言,语言本身简洁、使用灵活方便。既适用于设计和编写大的系统程序,又适用于编写小的控制程序,也适用科学计算。2、它既有高级语言的特点,又具有汇编语言的特点。运算符丰富,除了提供对数据的算术逻辑运算外,还提供了二进制的位运算。并且也提供了灵活的数据结构。用C语言编写的程序表述灵活方便,功能强大。用C语言开发的程序,其结构性好,目标程序质量高,程序执行效率高。3、程序的可移植性好。用C语言在某一种型号的计算机上开发的程序,根本上可以不作修改,而直接移植到其它型号和不同档次的计算机上运行。4、程序的语法结构不够严密,程序设计的自由度大。这对于比较精通C语言的程序设计者来说,可以设计出高质量的非常通用的程序。但对于初学者来说,要能比较熟练运用C语言来编写程序,并不是一件容易的事情。与其它高级语言相比而言,调试程序比较困难。往往是编好程序输入计算机后,编译时容易通过,而在执行时还会出错。但只要对C语言的语法规那么真正领会,编写程序及调试程序还是比较容易掌握的。随着C语言应用的推广,C语言存在的一些缺陷或缺乏也开始流露出来,并受到大家的关注。如:C语言对数据类型检查的机制比较弱;缺少支持代码重用的结构;随着软件工程规模的扩大,难以适应开发特大型的程度等等。为了克服C语言本身存在的缺点,并保持C语言简洁、高效,与汇编语言接近的特点,1980年,贝尔实验室的BjarneStroustrup博士及其同事对C语言进行了改进和扩充,并把Simula67中类的概念引入到C中。并在1983年由RickMaseitti提议正式命名为C++〔CPlusPlus〕。后来,又把运算符的重载、引用、虚函数等功能参加到C++中,使C++的功能日趋完善。当前用得较为广泛的C++有:VC++〔VisualCPlusPlus〕、BC++〔BorlandCPlusPlus〕、AT&TC++等。一、C++的起源在C语言根底上为支持面向对象的程序设计研制的一个通用目的的程序设计语言;由AT&T贝尔实验室BjarneStroustrup博士开发;二、C++的特点与C兼容,既保持了C的简洁、高效和接近汇编的特点,又比C更平安,结构化程度更高;既支持面向过程的程序设计,又支持面向对象的程序设计;注意其两面性1.1从C到C++必须先研究事物,而后才能研究过程。必须先知道一个事物是什么,而后才能觉察这个事物中所发生的变化。《路德维希·费尔巴哈和德国古典文学的终结》恩格斯

三、面向对象的方法1.1从C到C++1.2最简单的C++程序例1.1:输出一行字符:“ThisisaC++program.〞#include<iostream>//用cout输出时需要用此头文件usingnamespacestd;//使用命名空间std(276)intmain(){cout<<"ThisisaC++Program.\n";//用cout的方法输出一行return0;}1.2最简单的C++程序分析:(1)main前的int;return0;表示正常返回(2)/*……*/多行注释,不能嵌套定义(3)cout(c、out),输出对流类的一个对象(4)头文件<iostream>,i-o-stream,输入输出流类(5)usingnamespacestd;命名空间std,表示要用到命名空间std的内容。〔273页〕1.2最简单的C++程序cout:输出(1)cout<<a<<b;(2)cout<<a,b,c;(3)续行符“\〞(4)cout<<“hello\n〞;//原样输出字符串(5)cout<<“a=〞<<a<<endl;错换行1.2最简单的C++程序例1.2:求a和b两个数之和。#include<iostream>//用cout输出时需要用此头文件usingnamespacestd;//使用命名空间stdintmain(){//函数体开始inta,b,sum;//定义变量cin>>a>>b;//输入语句sum=a+b;//赋值语句cout<<"a+b="<<sum<<endl;//输出语句return0;//如程序正常结束,向操作系统返回一个零值}参考9页1.2最简单的C++程序#include<iostream>usingnamespacestd;intmain(){intmax(intx,inty);inta,b,c;cin>>a>>b;c=max(a,b);//函数调用cout<<"max="<<c<<endl;return0;}例1.3:输入两个数x和y,求两数中的大者。intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}函数声明1.2最简单的C++程序例1.4:输入任意短语或句子,计算该短语包含多少个字(word)和字符(character)。注意:输入短语时,必须在字和字之间只空一格。面向过程的方法#include<stdio.h>#include<conio.h>voidmain(){charch;intwdcount,chcount;wdcount=1;chcount=0;printf("***:Pleaseinputanyphrase…\n");while((ch=getche())!='\r'){chcount++;1.2最简单的C++程序if(ch=='')wdcount++;}printf("\n***:Thenumberofwordis

%d\n",wdcount);printf("\n***:Thenumberofcharis

%d\n",chcount);}面向对象的方法#include<iostream.h>#include<conio.h>classcount{public:定义类公有成员1.2最简单的C++程序〔续〕count();voidprocess();voiddisplay();private:intwdcount,chcount;};count::count(){wdcount=1;chcount=0;}voidcount::process(){私有成员构造函数成员函数数据成员1.2最简单的C++程序charch;cout<<"***:Pleaseinputanyphrase…"<<endl;while((ch=getche())!='\r'){chcount++;if(ch=='')wdcount++;}cout<<endl;}voidcount::display(){printf("\n***:Thenumberofwordis

%d\n",wdcount);1.2最简单的C++程序〔续〕printf("\n***:Thenumberofcharis

%d\n",chcount);}voidmain(){countA;A.process();A.display();}运行结果***Pleaseinputanyphrase...Iamateacher***:Thenumberofwordis4***:Thenumberofcharis15定义对象调用公有成员函数1.2最简单的C++程序〔续〕一、面向过程与面向对象程序设计是一种数学思维或计算机思维方法,与人们认识世界的方法不同以不稳定的、多变的“过程〞和“操作〞为中心来构造系统可重用性较差是建立在认识方法学根底上的一项技术科学,比较自然地模拟了人类认识客观世界的方式;以相对稳定的“对象〞和“数据结构〞为中心来构造系统可重用性较好面向过程程序设计面向对象程序设计一、面向过程与面向对象程序设计面向过程程序设计面向对象程序设计P1P2P3P4P5O1O2O3O4O5Changing?P6一、面向过程与面向对象程序设计面向过程程序设计面向对象程序设计P1P2P3P5O1O2O3O4O5Changing?P6O4二、抽象在面向对象中的作用Ⅰ、抽象的概念抽象代表着一个对象的本质特征,这个特征将这个对象与所有其他种类的对象区别开来;抽象是通过从特定的实例中抽取共同的性质以形成一般化的概念的过程;抽象具有层次;汽车轮船飞机交通工具二、抽象在面向对象中的作用(续)Ⅱ、面向对象抽象的原理〔面向对象计算的本质〕数据抽象、行为共享、进化、确定性1、数据抽象为程序员提供了一种对数据和为操作这些数据所需要的算法的抽象;是面向对象方法的核心,包括:模块化:构成了面向对象计算的本质;信息隐藏:将一个模块的细节局部对用户隐藏起来,用户只能通过一个受保护的接口来访问某个模块,而不能直接访问一个模块内部的细节;类公有成员二、抽象在面向对象中的作用(续)2、行为共享行为是由实体的外部接口定义的行为共享指许多实体具有相同的接口,可增加系统的灵活性;支持行为共享的方式分类与层次分类多态与继承对象公有成员函数名二、抽象在面向对象中的作用(续)3、进化需求进化〔虚函数〕进化式的问题求解〔继承的构造函数〕4、确定性确保每个行为项都有一个正确的解释,系统不会因不能响应某一行为而失败;确定性与类型的正确性有关;三、面向对象计算的根本特征面向对象系统的三要素:对象、类和继承;〔一〕、对象1、概念上对象是代表着正在创立的系统中的一个实体;2、实现形式上对象是一个状态和操作〔或方法〕的封装体;3、对象的定义状态:对象的状态由这个对象的属性和这些属性的当前值决定。属性是静态的,当前值是动态的;一个对象具有状态、行为和标识。三、面向对象计算的根本特征(续)行为:一个对象如何以状态变化和消息传递的形式进行作用和对外界进行反响。一个对象的行为代表了这个对象的外部可见的和可测试的活动;一个对象的状态代表着它的行为的累积结果;标识:标识是一个对象固有的一种特性,该特性将这个对象与其他对象区别开来;属性1属性2...属性n值11值21...值n1值12值22...值n2对象1行为值11值21...值n1值12值22...值n2对象2行为三、面向对象计算的根本特征(续)4、对象的分类实体对象界面对象控制对象按作用分类存储信息的对象支持系统的主要功能5、对象确实认创造对象:主要是控制对象;发现对象:主要是实体对象或界面对象;〔二〕、类1、什么是类三、面向对象计算的根本特征(续)类是创立对象的样板,它包含着所创立对象的状态描述和方法的定义。类的完整描述包含了外部接口和内部算法以及数据结构的形式;2、类是对象的抽象及描述类中包含生成对象的具体方法,由一个类所创立的对象称为该类的实例;3、类是抽象数据类型的实现类是所有对象的共同的行为和不同的状态的集合体;〔三〕、继承继承提供了创立新类的一种方法,它的本质特征是行为共享;属性1属性2……属性n行为1行为2……行为m值11值21……值n1值12值22……值n2行为1值11值21……值n1行为m值12值22……值n2对象1对象2对象k对象p类类与对象的关系三、面向对象计算的根本特征(续)四、C++语言中的抽象支持控制抽象:用于排列任意动作的顺序的一种方法;三种语句控制结构:顺序、循环、分支过程抽象〔面向过程〕:对一组输入数据的一个计算动作和产生的输出结果;数据抽象〔面向对象〕:类是实现抽象数据类型的工具;五、C++对面向对象程序设计方法的支持C++支持数据封装〔数据抽象〕C++中,类是支持数据封装的工具,对象那么是数据封装的实现;C++中包含有私有、公有和保护成员

每个可能的消息对应一个相应的方法,方法通过函数来定义;C++中通过发送消息来处理对象C++中允许友元破坏封装性C++中允许函数名和运算符重载C++支持继承性C++支持动态联编六、C++对C语言的改进增加了新的运算符:::,new,delete等;改进了类型系统,增加了平安性;引进了引用概念;允许函数重载,允许设置缺省参数,提高了编程的灵活性;引进了内联函数,提高了程序的效率;可以根据需要随时对变量进行说明;七、C++程序的编辑、编译和运行〔一〕、编辑:源文件的扩展名为.cpp〔二〕、编译1、预处理过程词法分析:单词语法分析:构造程序的格式符号表:程序中的各种符号及其属性错误处理程序:生成目标代码:目标文件扩展名.obj2、编译过程3、连接过程:可执行文件扩展名.exe三、运行八、C++程序的编辑、编译和运行(续)源程序.cpp目标文件.obj可执行文件.exe编译器连接器磁盘中的#include文件C++库文件.LIB编译过程:1〕启动VisualC++,选择“文件〞菜单中的“新建〞命令,选择“文件〞标签中的“C++SourceFile〞选项。2〕选择源程序存放的目录和输入源程序名,单击“确定〞。3〕在编辑器中编写源程序。4〕单击F7或“编译〞中的“重建全部〞编译源程序,假设编译通过,单击“执行〞,在DOS屏上看结果,任按一键返回编辑器。启动VC++编译系统VC++编译系统界面单击“File〞菜单中“New〞命令选择“Files〞选项卡选择C++源文件命令输入文件名输入文件存放位置单击选择驱动器选择驱动器或目录C++源文件编辑界面输入C++源代码可以将此源代码另起文件名存盘选择编译命令,将源文件.cpp生成.obj文件如果编译出错,会出现提示信息,指出错误的位置及种类错误所在行错误的原因双击错误所在行光标移到该行生成可执行文件通过后单击该命令运行程序运行结果显示在DOS屏上注意:不可以在软盘上运行程序!应该把保存在软盘中的源文件拷贝到硬盘的目录中再运行!源程序所在目录未编译前,只有一个源程序编译运行后,出现众多附加文件同时,产生一个子目录DebugDebug目录中,有obj和EXE文件补:C++的字符集大小写的英文字母:a~z,A~Z数字字符:0~9特殊字符词法记号1、关键字〔保存字〕表1-1C++的关键字词法记号〔续〕2、标识符组成规那么:以字母或下划线开始,其后跟零个或多个字母、数字或下划线;不能以数字开始正确标识符:Result,DoubleList,_first,first_错误标识符:1first标识符的长度任意〔受编译器限制〕;区分字母的大小写;不能使用系统的保存字;例如:ADD,Add,add词法记号〔续〕3、运算符单目双目三目运算符5、分隔符(){},分隔符:4、各种文字数字字符文字串文字文字布尔文字;空白一、空白包括:空格、制表符、换行符、注释功能:指示词法记号的开始和结束位置;二、注释/*……*///C++程序的结构一、C++示范程序#include<iostream.h>voidmain(){cout<<"Helloworld!"<<endl;}二、C++程序的组成预处理命令输入输出函数语句变量其他I/O流库,提供所有的输入输出操作cout:流类对象<<:插入符提供屏幕输出;提供键盘输入:cin:流类对象>>:提取符例如:cin>>"Pleaseinputtwointegers:";cin>>a>>b;endl:换行;1.3.1C++的输入输出1、用cout进行输出举例:如果要输出a=2,b=3,c=4(假设已赋值〕cout<<"a="<<a<<','<<"b="<<b<<','<<"c=“<<c<<endl;2、用cin进行输入举例:cin>>a>>b>>c;cin>>a;cin>>b;cin>>c;1.3C++对C的补充根本数据类型一、根本数据类型整型int浮点型(实型)字符型char根本数据类型逻辑型bool空值型void单精度浮点数float双精度浮点数double用于函数和指针根本数据类型〔续〕二、数据类型修饰符signed:有符号unsigned:无符号short:短型long:长型说明:3)

long修饰符还适用于双精度浮点数;2)上述修饰符均可用于整型和字符型;1)类型修饰符可以修饰除void、bool类型以外的其他类型;根本数据类型〔续〕三、根本数据类型列表表2-1C++的基本数据类型根本数据类型〔续〕说明:1)表中的[int]可以省略,即在int之前有修饰符出现时,可以省略关键字int;2)单精度类型float、双精度类型double、长精度类型longdouble统称浮点类型;3)char类型和各种int类型统称整型类型;char类型变量在内存中以它的ASCII码值的形式存储;4)字宽〔字节〕取决于操作系统和编译器的实现,可用sizeof验证;常量一、整型常量〔无小数局部〕1、表示方法十进制八进制十六进制2、十进制表示由0~9的数字组成不能以0开始无前缀例:132,-3453、八进制表示由0~7的数字组成以0为前缀例:010,-05364、十六进制表示由0~9的数字及A~F的字母(大小写均可)组成以0x或0X为前缀例:0x7A,-0X3de常量〔续〕5、说明:1)长整型用L〔或l〕做后缀表示。例如:32765L,793l;2)无符号型用U〔或u〕做后缀表示。例如:4352U,3100u;3)unsignedlong型用后缀U〔或u〕和L〔或l〕一起表示,L与U的先后顺序无关。例如:49321ul,37825LU,41152Lu;4)无后缀时,整型常量类型按如下顺序确定:

int,(unsigned),long,unsignedlong十进制时无常量〔续〕二、浮点型常量由整数局部和小数局部构成;只有十进制表示;一般表示形式〔小数表示形式〕:整数局部与小数局部可以省去一局部,但不能全部省去;例如:5.,.25,4.07常量〔续〕科学表示形式:在小数表示法后面加E〔或e〕表示指数;例如:23.5E6,.032E-5,.3e10指数局部可正可负,但必须为整数;浮点常量的缺省数据类型为double型;后缀F〔或f〕表示float类型;后缀l〔或l〕表示longdouble类型;常量〔续〕三、字符常量由一对单引号括起的一个字符表示;其值为所括起字符在ASCII表中的编码;所括起字符的表示方法:图形表示法该方法适用于有图形符号的可打印字符;例如:'A','a','*'转义序列表示法该方法适用于所有字符,尤其是无图形符号的不可打印字符;常量〔续〕转义序列表示方法:以反斜线(\)开头,后跟字符的ASCII码值;八进制表示:\ddd;例如:\101十六进制表示:\xhh;例如:\x41表2-2C++中常用转义序列符常量〔续〕四、布尔常量有两个值:true和false;五、字符串常量〔串常量,字符串〕一对双引号括起的字符序列,字符序列可以包含空格、转义序列或任何其他字符,这些字符不一定是C++字符集中的字符,只要C++编译器支持即可;例如:"Thisisastring;"串常量与字符常量的区别:常量〔续〕由一个字符型变量存放由一维数组存放字符常量串常量用单引号括起用双引号括起字符串有一个结束符,该结束符用'\0'表示字符常量'a'在内存中占用一个字节字符串常量"a"在内存中占用两个字节可进行加、减法运算可进行连接、拷贝运算常量〔续〕六、符号常量用来表示C++中的常量,即用一个与常量相关的标识符来替代常量;优点:增加可读性,增强可维护性;例如:PI表示3.1415926定义方法:使用类型说明符const;例如:constintsize=80;定义的符号常量必须初始化;一个符号常量可看作是一个只读变量,由const定义的常量的值不可以改变;与#define的区别?1.3.2用const定义常变量宏定义:(1)#definePI3.14159(2)#defineA2#defineB3#defineCA+Bcout<<B*C;(3)#defineMAX(a,b)return(a>b?a:b)

1.3C++对C的补充注意:(1)只是替换(2)没有类型检验(3)而且是在编译前进行,不分配存储空间(4)末尾没有分号,有分号作为宏体的一局部(5)不能有单行注释(6)位置只在文件的上方

1.3C++对C的补充用const定义符号常量的方法:(1)intconsta=3;(2)constinta=3;注意:位置可以任意(局部和全局)要带分号有类型检测,有空间分配,是编译时决定的,其它变量是运行时决定一旦定义后,不能作为左值

1.3C++对C的补充常指针Line1: #include<iostream.h>Line2: constdoublepi=3.1415;Line3: constdoubler;Line4: voidmain()Line5: {Line6: doubleperimeter,area;Line7: perimeter=2*pi*r;Line8: pi=3.14;Line9: area=pi*r*r;Line10: cout<<perimeter<<","<<area<<endl;Line11: }

常量〔续〕constdoubler=3.2;错误错误,不能修改pi的值#define与const定义符号常量的区别const产生一个具有类型的符号#define仅产生文本替换,而不管内容是否正确constdoublePI=3.1415;#definePI3.1415使用const可以定义一个局部常量,可局部在一个函数体内用#define定义的常量的作用域是从定义时开始,直到使用#undef取消定义时为止,如果不取消定义,直到整个文件结束使用const定义常量是一个说明语句,用分号(;)结束使用#define定义常量是一个预处理命令,不能用分号(;)结束地址值变量一、变量的三个根本要素名字类型值三要素数据值地址值intc;c=5;内存5......c地址值1000H变量类型变量名数据值二、变量的定义可以在程序中随时定义变量,只要在该变量被使用前定义即可;定义格式:<类型><变量名表>;例如:inta,b,c;doublex,y,z;变量〔续〕同一程序块内不可以定义同名变量;初始值变量定义时可赋初始值;声明格式:数据类型标识符1(初始值1),…,标识符n(初始值n);数据类型标识符1=初始值1,…,标识符n=初始值n;例如:doubleprice=15.5;

intsize=100;未被初始化的变量的值或者是默认值,或者是无效值,由变量类型决定;变量可被赋值,由变量名标识;1.3.7引用〔C++〕标识对象的一种机制;对对象存储地址的抽象,但引用不是值;引用有类型;变量的别名;1、定义格式<类型>&<引用名>(<变量名>);或<类型>&<引用名>=<变量名>;2、初始化与赋值定义引用时必须初始化;可以将一个引用赋给某个变量;引用可被赋值;引用〔续〕例如:inta=3;int&m=a;intn=m;int*p=&m;m=m+5;3a8pm3n定义引用并初始化将引用赋值给变量a=8,对引用的操作就是对被引用者的操作3、引用的功能用做函数的参数或函数的返回值;函数不能返回对局部对象的引用;引用〔续〕例如:int&f(intindex,inta[]){intr=a[index];returnr;}错,r是局部对象4、指针与引用的区别指针通过地址间接访问某个变量,引用通过别名直接访问某个变量;引用必须初始化,一旦被初始化后不得再作为其他变量的别名;正确:int&r=a[index];为什么?引用〔续〕例1:分析以下程序的输出结果。#include<iostream.h>voidmain(){intval(5);int&refv=val;refv=refv+5;;cout<<val<<endl;int*p=&refv,val1(refv);cout<<*p<<"\t"<<val1<<endl;}输出101010引用〔续〕例2:分析以下程序的输出结果。#include<iostream.h>int&f(intindex,inta[]){int&r=a[index];returnr;}voidmain(){inta[]={1,3,5,7,9};f(2,a)=55;for(i=0;i<5;i++)cout<<a[i]<<"\t";}传址调用(C++中数组自动转换为指针);引用可作左值;输出:135579r5a[0]91357…a[2]r55引用〔续〕对引用的进一步说明:〔1〕不能建立void类型的引用;void&a=9;〔2〕不能建立引用的数组;charc[6]="hello“’char&rc[6]=c;〔3〕可以将变量的引用的地址赋给一个指针,此时指针指向的是原来的变量;inta=3;int&b=a;int*p=&b;int&*p=&a;//错引用〔续〕对引用的进一步说明:〔4〕可以建立指针变量的引用;inti=5;int*p=&i;int*&pt=p;〔5〕可以用const对引用加以限定,不允许改变该引用的值;constint&a=i;引用〔续〕对引用的进一步说明:〔6〕可以用常量或表达式对引用进行初始化,但此时必须用const作声明。const&a=3;inti;const&b=i+6;思:为什么要用const呢?算术运算符1、普通算术运算符单目算术运算符:-〔取负〕、+〔取正〕;双目算术运算符:+、-、*、/、%(只用于int型);单目运算符优先级高于双目运算符;2、增1和减1运算符单目运算符:++、--;++运算符的功能:由该运算符组成的表达式具有一定的值;由该运算符组成的表达式计算后,其变量值要发生改变;算术运算符〔续〕++运算符的两种方式:前缀方式与后缀方式;前缀方式与后缀方式的区别:前缀运算表达式的值为原来变量值加1;后缀运算表达式的值为原来变量值;两种方式的变量的值都加1;例如:inta(1);++a;intb(1);b++;表达式++a的值为2,变量a的值为2;表达式b++的值为1,变量b的值为2;关系运算符双目运算符:>、<、>=、<=、==、!=前四种优先级高于后两种;逻辑运算符双目运算符:&&、||优先级:&&、||、!单目运算符:!位操作运算符1、逻辑位运算符单目逻辑位运算符:~双目逻辑位运算符:&、|、^双目逻辑位运算符的优先级:&、|、^;2、移位运算符双目运算符:<<、>>;<<时移掉的位被丢弃,右边移出的空位补0;>>时移掉的位被丢弃,左边移出的空位补0或符号位;赋值运算符简单赋值运算符:=复合赋值运算符:+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=其他运算符1、三目运算符格式:d1?d2:d3功能:先计算d1,假设其非零,表达式的值为d2的值,否那么为d3的值;表达式类型:d2和d3中类型较高者的类型;2、逗号运算符格式:d1,d2,…,dn表达式的值和类型:由最后一个表达式确定;优先级在所有运算符中最低;3、sizeof运算符其他运算符〔续〕格式:功能:返回其后的类型说明符或表达式所表示的数在内存中所占的字节;4、单目运算符&和*&:取地址;*:用在指针名前,表示取指针的内容;5、强制类型运算符sizeof(<类型说明符>);或sizeof(<表达式>);格式:<类型说明符>(<表达式>);或(<类型说明符>)<表达式>;其他运算符〔续〕强制类型转换可将高类型转换为低类型,是一种不平安的转换;例如:doublef(3.85);inth;h=int(f);该转换是暂时的,一次性的;例如:inta(3),m;doubleb;b=3.56+double(a);m=a+5;表达式的种类由运算符和操作数组成的式子;常见的表达式算术表达式;逻辑表达式;关系表达式;赋值表达式;条件表达式;逗号表达式;表达式的种类〔续〕本卷须知:连续的两个运算符之间用空格分隔;可用括号来改变运算符优先级;双目运算符的左右可以用空格符和操作数分开;过长的表达式可分成几个表达式;表达式的值和类型一、确定表达式的值二、表达式求值方法与确定类型的方法先确定运算符的功能;确定计算顺序:先考虑优先级,再考虑结合性;表达式的值和类型〔续〕例1:分析以下程序的输出结果(算术表达式)。#include<iostream.h>voidmain(){unsigneda(0xab),b(20);a&=b;a^=a;cout<<a<<"\t"<<b<<endl;intx(-3),y(5);x>>y;x<<=y;x|=y^~y;y&=~x+1;cout<<x<<"\t"<<y<<endl;}输出:020-11表达式的值和类型〔续〕例2:分析以下程序的输出结果(关系表达式)。#include<iostream.h>voidmain(){charx('m'),y('n');intn;n=x<y;cout<<n<<endl;n=x==y-1;cout<<n<<endl;n=('y'!='Y')+(5>3)+(y-x==1);cout<<n<<endl;}输出:113表达式的值和类型〔续〕例3:分析以下程序的输出结果(逻辑表达式)。#include<iostream.h>voidmain(){intx,y,z;x=y=z=1;--x&&++y&++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;++x&&++y&&++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;++x&&y--||++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;}输出:011122212注意逻辑表达式的求值方法表达式的值和类型〔续〕例4:分析以下程序的输出结果(条件表达式)。#include<iostream.h>voidmain(){inta(3),b(4),c;c=a>b?++a:++b;cout<<a<<","<<b<<","<<c<<endl;c=a-b?a+b:a-3?b:a;cout<<a<<","<<b<<","<<c<<endl;}3,5,53,5,8注意三目运算符的判断条件输出表达式的值和类型〔续〕例5:分析以下程序的输出结果(赋值表达式)。#include<iostream.h>voidmain(){intx(1),y(3),z(5);x+=y*=z-=2;cout<<x<<","<<y<<","<<z<<endl;x*=y/=z-=x;cout<<x<<","<<y<<","<<z<<endl;x=y=z=2;z=(x+=2)+(y+=4)+2;cout<<x<<","<<y<<“,"<<z<<endl;}输出:10,9,3-10,-1,-74,6,12表达式的值和类型〔续〕例6:分析以下程序的输出结果(逗号表达式)。#include<iostream.h>voidmain(){inta,b,c;a=1,b=2,c=a+b+3;cout<<a<<","<<b<<","<<c<<endl;c=(a++,a+=b,a+b);cout<<a<<","<<b<<","<<c<<endl;}1,2,64,2,6输出表达式中的类型转换一、隐含转换双目运算中操作数的类型转换;是一种保值转换,转换类型由低到高;转换规那么:intunsignedlongunsignedlongdoubleshort,charfloat二、强制转换显式强制转换〔通过强制转换运算符实现〕;表达式中的类型转换(续)隐式强制转换:在赋值表达式中,当左值〔赋值运算符左边的值〕和右值〔赋值运算符右边的值〕的类型不同时,一律将右值类型强制转换为左值的类型;在函数有返回值的调用中,将return后面的表达式的类型强制转换为该函数的类型;显式隐式赋值表达式函数返回值隐含转换强制转换类型转换类型定义1、格式typedef<已有类型名><新类型名表>;例如:typedefdoublewages,bouns;wagesweekly;bounsmonthly;2、自定义类型的作用改善程序的可读性,增加所定义变量的信息书写简练提高程序的可移植性预处理和语句预处理功能语句选择语句循环语句转向语句预处理功能一、预处理命令及预处理功能1、预处理命令C++源程序中包含的各种编译命令在程序被正常编译之前执行;预处理命令不是C++语言的一局部;2、预处理功能由预处理命令实现的功能;二、常用的预处理命令文件包含命令宏定义命令预处理功能〔续〕以"#"为引导;每条预处理命令单独占用一行,同一行不能有其他预处理命令和语句;三、预处理命令使用说明条件编译命令停止编译命令预处理命令的位置可以放在开头、中间和结尾;预处理命令可以续行,续行符为"\";预处理命令不是语句,不能以分号(;)结束;文件包含命令一、功能指示C++编译器将一个文件〔头文件〕的内容嵌入到该指令所在的文件中该指令所在位置处;头文件指存放与标准函数有关的信息,或者存放符号常量、类型定义、类和其他复杂类型的定义以及与程序环境相关信息的.h文件;二、格式#include

<文件名>由系统提供并放在指定子目录中的头文件;#include

"文件名"由用户定义,放在当前目录或其他目录下的头文件或其他源文件;文件包含命令〔续〕三、说明文件包含命令一般放在程序头;一条文件包含命令只能包含一个文件;文件名:myfile.h#include"myfile2.h"#include"myfile3.h"文件包含命令可以嵌套;包含文件不易过多;条件编译命令一、功能用来定义某些编译内容要在满足一定条件下才参与编译,否那么不参与编译;可使同一源程序在不同的编译条件下产生不同的目标代码。二、格式格式一:#ifdef<标识符><程序段1>#else<程序段2>#endif或#ifdef<标识符><程序段1>#endif条件编译命令〔续〕格式二#ifndef<标识符><程序段1>#else<程序段2>#endif或#ifndef<标识符><程序段1>#endif格式三#if<常量表达式1><程序段1>#elif<常量表达式2><程序段2>#elif<常量表达式3><程序段3>...#else<程序段n+1>#endif条件编译命令〔续〕例1:分析以下程序的输出结果。#include<iostream.h>#defineA10voidmain(){#ifA>0cout<<"a>0"<<endl;#elifA<0cout<<"a<0"<<endl;#elsecout<<"a==0"<<endl;#endif}输出:a>0条件编译命令〔续〕例2:防止重复引用某个头文件。//main.cpp#include"myfile1.h"#include"myfile2.h"//myfile1.h#include"myhead.h"//myfile2.h#include"myhead.h"改进://myfile1.h#ifndefMYHEAD_H#defineMYHEAD_H#include"myhead.h"#endif//myfile2.h#ifndefMYHEAD_H#defineMYHEAD_H#include"myhead.h"#endif条件编译命令〔续〕例3:用于调试。调试时:#defineDEBUG1...#ifDEBUG=1cout<<"OK"<<endl;#endif...调试后:#defineDEBUG0...停止编译命令一、格式#error<字符序列>二、功能当编译器遇到该指令时,显示“字符序列〞,即错误信息,然后停止对该程序的编译,从而可以在编译阶段发现程序中的错误;三、例如假设country值为:US、ENGLAND、CHINA程序中有如下语句:停止编译命令〔续〕//…#else#errorYoudefinecountryincorrectly#endif当country的值不是上述三者之一时,编译器将显示:然后停止编译。Youdefinecountryincorrectly语句1、表达式语句和空语句表达式语句:任何一个表达式加上分号(;);空语句:只有一个分号(;)的语句;2、复合语句和分程序复合语句:由两条或两条以上的程序构成,并由一对花括号括起;分程序:又称块结构,含有一条或多条说明语句的复合语句;条件语句if(<条件1>)<语句1>elseif(<条件2>)<语句2>elseif(<条件3>)<语句3>...elseif(<条件n>)<语句n>else<语句n+1>说明:if语句可以嵌套,在此情况下,else与最近的一个没有与else配对的if配对。开关语句switch(<整型表达式>){case<整常型表达式1>:<语句序列1>case<整常型表达式2>:<语句序列2>...case<整常型表达式n>:<语句序列n>default<语句序列n+1>}注意:在执行语句序列中如果遇到break语句,那么退出switch语句,执行后面的语句;如果其后的语句序列中没有break语句,那么一直执行至switch语句结束。开关语句〔续〕例3:分析以下程序的输出结果。#include<iostream.h>voidmain(){inti(1),j(0),m(1),n(2);switch(i++){case1:m++;n++;case2:switch(++j){case1:m++;case2:n++;}case3:m++;n++;break;case4:m++;n++;}cout<<m<<','<<n<<endl;}

输出:4,5循环语句1、while循环语句while(<条件>)<语句>;2、do-while循环语句do<语句>while(<条件>);do-while循环与while循环的区别:do-while循环至少执行一次循环体,while循环可能一次也不执行循环体;3、for循环语句for

(d1;d2;d3)<语句>;4、多重循环转向语句1、goto语句格式:goto<语句编号>;goto语句只能在一个函数内进行转向;2、break语句格式:break;适用情况:用于开关语句的语句序列中,其功能是退出开关语句,执行其后的语句;用于循环体中,其功能是用来退出该重循环;3、continue语句格式:continue;功能:在循环体中用来结束本次循环;函数和作用域函数的根本概念函数的定义和说明函数的调用函数的参数内联函数函数重载异常处理根底作用域返回类型为void类型的函数抽象为过程抽象函数的根本概念函数结构:由花括号括起来的一个语句序列;函数抽象:使用标识符对语句序列进行的抽象;函数调用:函数级上的控制抽象,一种控制转移;参数化:在函数抽象中对其所操作的值进行抽象的过程;形参与实参函数抽象与过程抽象函数抽象的目的是进行求值过程抽象的目的是更新对象C++中只有函数抽象函数的定义格式<类型><函数名>(<参数表>){<假设干条语句>}说明:<类型>为函数返回值类型,假设为void,那么为过程调用;<参数表>中的参数为形参,在函数被调用时进行初始化,从而从被调用处获得数据;函数体函数的说明方法(函数的声明)一、函数的说明原那么如果一个函数定义在先,调用在后,调用前可以不必说明;如果一个函数定义在后,调用在先,调用前必须说明;二、函数的说明方法〔原型说明〕<类型><函数名>(<参数表>);三、例如参数表中的参数名称可以省略1.3C++对C的补充1.3.3函数原型声明一般形式:函数类型函数名〔参数表〕;注意:参数表中一般包括参数类型和参数名,也可以只包括参数类型而不包括参数名。例如:intmax(intx,inty);或intmax(int,int);intmax(inta[],intn);或intmax(int[],int);intmax(int*p);或intmax(int*);函数的说明方法(续)#include<iostream.h>voidfun1(),fun2(),fun3();voidmain(){cout<<"Itisinmain."<<endl;fun2();cout<<"Itisbackinmain."<<endl;}voidfun1(){cout<<"Itisinfun1."<<endl;fun3();cout<<"Itisbackinfun1."<<endl;}例1:分析以下程序的输出结果。函数原型声明函数的说明方法(续)voidfun2(){cout<<"Itisinfun2."<<endl;fun1();cout<<"Itisbackinfun2."<<endl;}voidfun3(){cout<<"Itisinfun3."<<endl;}Itisinmain. Itisbackinfun1.Itisinfun2.Itisbackinfun2.Itisinfun1.Itisbackinmain.Itisinfun3.输出函数的值和类型说明:实参表的个数由形参决定,用来初始化实参,多个实参用逗号分隔;实参的个数与类型必须与形参的个数与类型完全一致;一、函数调用格式<函数名>(<实参表>);实参对形参的初始化按其位置进行;函数的值和类型〔续〕关于return语句的说明:有返回值的return语句可以返回一个表达式的值,从而实现函数之间的信息传递;无返回值的函数必须用void说明其返回类型;二、返回语句格式格式一:return<表达式>;格式二:return;函数的传值调用一、传值调用的分类二、传值调用的实现机制和特点传值调用:传递变量本身的值〔数据值〕;传址调用:传递变量的地址值;用法:调用函数的实参用常量、变量(数据)值或表达式值,被调用函数的形参用变量;实现机制:系统将实参拷贝一个副本给形参(数据值)

;特点:形参值的改变不影响实参值;函数的传值调用〔续〕#include<iostream.h>voidswap1(intx,inty){inttemp;temp=x;x=y;y=temp;cout<<"x="<<x<<","<<"y="<<y<<endl;}voidmain(){inta(5),b(9);swap1(a,b);cout<<"a="<<a<<","<<"b="<<b<<endl;}例2:分析以下程序的输出结果(传值调用)。输出:x=9,y=5a=5,b=9函数的传址调用传址调用的实现机制和特点用法:调用函数的实参用地址值,被调用函数的形参用指针;实现机制:让形参的指针直接指向实参;特点:可以通过改变形参所指向的变量值来影响实参值;函数的传址调用〔续〕#include<iostream.h>voidswap2(int*x,int*y){inttemp;temp=*x;

*x=*y;

*y=temp;cout<<"x="<<*x<<","<<"y="<<*y<<endl;}voidmain(){inta(5),b(9);swap2(&a,&b);cout<<"a="<<a<<","<<"b="<<b<<endl;}输出:x=9,y=5a=9,b=5例3:分析以下程序的输出结果(传址调用)。函数的引用调用(C++特有)引用调用的实现机制和特点用法:调用函数的实参用变量名,被调用函数的形参用引用;实现机制:直接通过引用来改变实参的数据值;特点:起到传址调用的作用,但比传址调用更方便、更直接;函数的引用调用(续)#include<iostream.h>voidswap3(int&x,int&y){inttemp;temp=x;

x=y;

y=temp;cout<<"x="<<x<<","<<"y="<<y<<endl;}voidmain(){inta(5),b(9);swap3(a,b);cout<<"a="<<a<<","<<"b="<<b<<endl;}输出:x=9,y=5a=9,b=5例4:分析以下程序的输出结果(引用调用)。函数的引用调用(续)三种调用方式比较函数参数的求值顺序当一个函数带有多个参数时,C++语言没有规定函数调用时实参的求值顺序;编译器根据对代码进行优化的需要自行规定对实参的求值顺序;在实参中注意不要使用带有副作用的运算符,此时可能产生二义性;例4.5:由于使用对参数求值顺序不同的编译器造成的二义性。函数参数的求值顺序〔续〕#include<iostream.h>intadd(intx,inty){returnx+y;}voidmain(){intx(4),y(6);intz=add(++x,x+y);cout<<z<<endl;}产生二义性可能的结果〔按照编译器对实参求值顺序不同〕:自左至右,两个实参的值分别为5和11;自右至左,两个实参的值分别为5和10;注意:函数参数求值顺序与参数默认值补足顺序不同参数求值顺序:由编译器决定求值方向;参数默认值补足顺序:自左向右1.3.6设置函数参数的默认值C++中,在函数声明或定义时可以为一个或多个参数指定缺省参数值;intadd(intx,inty=10);进行函数调用时,假设未指定足够的实参,那么编译器将按从左向右的顺序用函数声明或定义中的缺省值来补足所缺少的实参;add(15);add(15,10);设置函数参数的默认值(续)在一个指定了缺省值的参数的右边,不能出现没有指定缺省值的参数;voidf(intx,inty=1,intz);在给某个参数指定缺省值时,不仅可以是一个数值,而且可以是任意复杂的表达式;intf();……voiddelay(intk,inttime=f());错误例如:f(2,4);理想:f(2,1,4),实际:z参数未被赋值设置函数参数的默认值(续)#include<iostream.h>voidfun(inta=1,intb=3,intc=5){cout<<"a="<<a<<","<<"b="<<b<<","<<"c="<<c<<endl;}voidmain(){fun();fun(7);fun(7,9);fun(7,9,11);cout<<"OK!"<<endl;}输出:a=1,b=3,c=5a=7,b=3,c=5a=7,b=9,c=5a=7,b=9,c=11OK!例5:分析以下程序的输出结果。普通函数内联函数内联函数引入的原因(C++)目的

解决程序中一些函数体代码不是很大,但又频繁地被调用的函数的函数调用的效率问题。解决方法以目标代码的增加为代价来换取时间上的节省;即在编译时将函数体中的代码替换到程序中,增加目标程序代码量,进而增加空间开销,从而在时间开销上不像函数调用时那么大。内联函数的定义方法在函数定义的前面加上关键字inline

inlineintadd(intx,inty,intz){returnx+y+z;}使用内联函数的本卷须知在内联函数内不允许用循环语句或开关语句;内联函数的定义必须出现在该内联函数第一次被调用之前;类结构中所有在类说明内部定义的函数都是内联函数;对内联函数不能进行异常接口说明;内联函数无法递归调用;内联函数具有与带参数的宏定义#define相同的作用和相似的机理,但内联函数具有宏定义的所有优点而没有其缺点,它消除了宏定义的不平安性。include<iostream.h>#definef(x)x*x

voidmain(){ intx(2); cout<<f(x)<<endl; cout<<f(x+1)<<endl;}程序运行结果:45原因:f(x) 替换为2*2f(x+1) 替换为2+1*2+1include<iostream.h>inlineintf(intx){ returnx*x;}voidmain(){ intx(2); cout<<f(x)<<endl; cout<<f(x+1)<<endl;}程序运行结果:49原因:f(x) 替换为 2*2f(x+1) 替换为 3*3使用内联函数的本卷须知函数重载函数重载是指同一个函数名可以对应着多个函数的实现;要求:编译器能够唯一确定调用一个函数时应执行哪个函数代码;条件:参数个数不同;参数类型不同;注意:

返回值类型不能作为重载条件;参数类型不同的重载函数#include<iostream.h>intadd(int,int);doubleadd(double,double);voidmain(){cout<<add(5,10)<<endl;cout<<add(5.0,10.5)<<endl;}intadd(intx,inty){cout<<"int"<<endl;returnx+y;}例7:分析以下程序的输出结果。两个add函数的参数类型不同参数类型不同的重载函数(续)doubleadd(doublex,doubley){cout<<"double"<<endl;returnx+y;}输出int15double15.5参数个数不同的重载函数#include<iostream.h>intmin(inta,intb);intmin(inta,intb,intc);intmin(inta,intb,intc,intd);voidmain(){cout<<min(13,5,4,9)<<endl;cout<<min(-2,8,0)<<endl;}intmin(inta,intb){returna<b?a:b;}例:分析以下程序的输出结果。三个min函数的参数个数不同参数个数不同的重载函数(续)intmin(inta,intb,intc){intt=min(a,b);returnmin(t,c);}intmin(inta,intb,intc,intd){intt1=min(a,b);intt2=min(c,d);returnmin(t1,t2);}输出4-2带有缺省参数时的函数重载使用缺省参数时,注意满足函数重载条件;voidfun(intx,inty=0);voidfun(intx);fun(3);重载哪个函数?此时函数fun不能进行重载,因为编译器不能唯一确定调用哪个函数〔fun(3)或fun(3,0)均可〕。1.3C++对C的补充1.3.5函数模板:类型作为参数一般形式:template<typenameT>template<classT>注:template:模板class与typename都是表示“类型名〞,二者可互换目的是简化程序1.3C++对C的补充#include<iostream>usingnamespacestd;template<typenameT>Tmax(Ta,Tb,Tc){if(b>a)a=b;if(c>a)a=c;returna;}intmain(){inti1=8,i2=5,i3=6,i;doubled1=56.9,d2=90.765,d3=43.1,d;longg1=6.7843,g2=-456,g3=78123,g;i=max(i1,i2,i3);d=max(d1,d2,d3);g=max(g1,g2,g3);cout<<"i_max="<<i<<endl;cout<<"d_max="<<d<<endl;cout<<"g_max="<<g<<endl;return0;}例1.8用函数模板实现求不同类型的三个数的最大值。1.3C++对C的补充运行结果如下:i_max=8d_max=90.765g_max=78123注:类型参数可以不只一个,可根据需要确定个数。template<classT1,classT2>适用情况:只适用于函数物参数个数相同而类型不同,且函数体相同的情况,如参数个数不同,那么不能用函数模板。1.3C++对C的补充思考:求通用数组的最大值。异常处理根底一、异常当一个函数在执行过程中出现了一些不平常的情况,或运行结果无法定义的情况,使操作不得不被中断时,就出现了异常。二、异常处理的三个关键步骤引发异常、捕获异常、异常处理三、引发异常(throw)throw<表达式>;当一个异常被一个函数引发后,执行流程返回到该函数的调用者中;表达式类型称为异常类型

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论