




已阅读5页,还剩483页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象程序设计 前言 第1章 C+语言概述 第2章 数据类型和表达式 第3章 预处理和语句 第4章 函数和作用域 第5章 类和对象(一) 第6章 类和对象(二) 第7章 继承性和派生类 第8章 多态性和虚函数 第9章 C+的I/O流库 内容简介 面向对象的基本思想 C+语言的基本概念、基本语法和编程方法 C+语言的面向对象特征 k类与对象 k继承与派生 k多态性与虚函数 学习方法 多练习,掌握基本概念 多读程序,学习编程方法与技巧 多上机实践,加强动手能力 多剖析范例,积累编程经验 教材及参考书目 C+语言基础教程吕凤翥著清华大学出版 社1999 C+语言及其程序设计教程(修订版)张国 峰编著电子工业出版社1997 C+语言程序设计郑莉等编著清华大学出 版社1999 第1章 C+语言概述 1.1 C+的起源及特点 1.2 面向对象的方法 1.3 面向对象的程序设计语言C+ 1.4 C+程序的编辑、编译和运行 1.5 C+的词法及词法规则 1.6 C+程序的结构 1.1.1 面向对象的由来和发展 机器语言(二进制码) 汇编语言 20世纪50年代中期,FORTRAN语言 20世纪50年代中期,Algol语言 在计算机语言发展史上具有划时代的意义, 引入了许多程序设计概念。如变量、数组、循环 、分支等。 提出块(BeginEnd)思想,对数据进行保护, 是一种初级封装。 1.1.1 面向对象的由来和发展(续 ) 20世纪60年代中期,Simula 67语言 面向对象语言的鼻祖,提出了对象、类的概 念,并支持类的继承。 20世纪70年代中期,Ada语言 支持数据抽象类型的最重要的语言之一,但 不完全支持继承。 20世纪70年代中期,Smalltalk语言 最有影响的面向对象语言之一,丰富了面向 对象的概念。 20世纪80年代中期后出现C+等多种面向对象语言 1.1.2 C+的起源和特点 一、C+的起源 在C语言基础上为支持面向对象的程序设计研 制的一个通用目的的程序设计语言; 由AT int wdcount,chcount; wdcount=1; chcount=0; printf(“*:Please input any phrasen“); while(ch=getche()!=r) chcount+; 1.2.1 面向过程与面向对象程序设计(续) if(ch= ) wdcount+; printf(“n*:The number of word is %dn“,wdcount); printf(“n*:The number of char is %dn“,chcount); 面向对象的方法 #include #include class count public: 定义类 公有成员 1.2.1 面向过程与面向对象程序设计(续) count(); void process(); void display(); private: int wdcount,chcount; ; count:count() wdcount=1; chcount=0; void count:process() 私有成员 构造函数 成员函数 数据成员 1.2.1 面向过程与面向对象程序设计(续) char ch; cout void main() cout:提取符 例如: cin“Please input two integers:“; cinab; endl:换行; 第2章 数据类型和表达式 2.1 基本数据类型 2.2 常量和变量 2.3 数组类型 2.4 枚举类型 2.5 指针和引用 2.6 运算符 2.7 表达式 2.8 类型定义 2.1 基本数据类型 一、基本数据类型 整型int 浮点型(实型) 字符型char 基本数 据类型 逻辑型bool 空值型void 单精度浮点数float 双精度浮点数double 用于函数和指针 2.1 基本数据类型(续) 二、数据类型修饰符 signed:有符号 unsigned:无符号 short:短型 long:长型 说明: 3) long修饰符还适用于双精度浮点数; 2) 上述修饰符均可用于整型和字符型; 1) 类型修饰符可以修饰除void、bool类型以外的 其他类型; 2.1 基本数据类型(续) 三、基本数据类型列表 表2-1 C+的基本数据类型 2.1 基本数据类型(续) 说明: 1) 表中的int可以省略,即在int之前有修饰符出 现时,可以省略关键字int; 2) 单精度类型float、双精度类型double、长精度 类型long double统称浮点类型; 3) char类型和各种int类型统称整型类型;char类 型变量在内存中以它的ASCII码值的形式存储; 4) 字宽(字节)取决于操作系统和编译器的实现 ,可用sizeof验证; 2.2.1 常量 一、整型常量(无小数部分) 1、表示方法 十进制 八进制 十六进制 2、十进制表示 由09的数字组成 不能以0开始 无前缀 例:132, -345 3、八进制表示 由0 7的数字组成 以0为前缀 例:010, -0536 4、十六进制表示 由09的数字及A F的字母(大小写均可) 组成 以0x或0X为前缀 例:0x7A, -0X3de 2.2.1 常量(续) 5、说明: 1) 长整型用L(或l)做后缀表示。例如: 32765L,793l; 2) 无符号型用U(或u)做后缀表示。例如: 4352U,3100u; 3) unsigned long型用后缀U(或u)和L(或l)一 起表示,L与U的先后顺序无关。例如: 49321ul,37825LU,41152Lu; 4) 无后缀时,整型常量类型按如下顺序确定: int, (unsigned), long, unsigned long 十进制时无 2.2.1 常量(续) 二、浮点型常量 由整数部分和小数部分构成; 只有十进制表示; 一般表示形式(小数表示形式): k整数部分与小数部分可以省去一部分, 但不能全部省去; k例如:5.,.25,4.07 2.2.1 常量(续) 科学表示形式: k在小数表示法后面加E(或e)表示指数 ; k例如:23.5E6,.032E-5,.3e10 k指数部分可正可负,但必须为整数; 浮点常量的缺省数据类型为double型; 后缀F(或f)表示float类型; 后缀l(或l)表示long double类型; 2.2.1 常量(续) 三、字符常量 由一对单引号括起的一个字符表示; 其值为所括起字符在ASCII表中的编码; 所括起字符的表示方法: k图形表示法 该方法适用于有图形符号的可打印字符; 例如:A,a,* k转义序列表示法 该方法适用于所有字符,尤其是无图形符号 的不可打印字符; 2.2.1 常量(续) K转义序列表示方法:以反斜线()开头,后跟字符 的ASCII码值; K八进制表示: ddd; 例如:101 K十六进制表示 :xhh; 例如:x41 表2-2 C+中常用转义序列符 2.2.1 常量(续) 四、布尔常量 有两个值:true和false; 五、字符串常量(串常量,字符串) 一对双引号括起的字符序列,字符序列可以 包含空格、转义序列或任何其他字符,这些字 符不一定是C+字符集中的字符,只要C+编译 器支持即可; 例如:“This is a string; “ 串常量与字符常量的区别: 2.2.1 常量(续) 由一个字符型变量存 放 由一维数组存放 字符常量串常量 用单引号括起 用双引号括起 字符串有一个结束符 ,该结束符用0表示 字符常量a在内存中 占用一个字节 字符串常量“a“在内存 中占用两个字节 可进行加、减法运算 可进行连接、拷贝运算 2.2.1 常量(续) 六、符号常量 用来表示C+中的常量,即用一个与常量相关 的标识符来替代常量; 优点:增加可读性,增强可维护性; 例如:PI表示3.1415926 定义方法:使用类型说明符const; 例如:const int size=80; 定义的符号常量必须初始化; 一个符号常量可看作是一个只读变量,由const 定义的常量的值不可以改变; Line1:#include Line2:const double pi=3.1415; Line3:const double r; Line4:void main() Line5: Line6: double perimeter,area; Line7: perimeter=2*pi*r; Line8: pi=3.14; Line9: area=pi*r*r; Line10: cout ; 例如:int a,b,c; double x,y,z; 2.2.2 变量(续) 同一程序块内不可以定义同名变量; 初始值 k变量定义时可赋初始值; k声明格式: 数据类型 标识符1(初始值1), ,标识符n(初始值n); 数据类型 标识符1=初始值1, ,标识符n=初始值n; k例如:double price=15.5; int size=100; k未被初始化的变量的值或者是默认值,或者是 无效值,由变量类型决定; 变量可被赋值,由变量名标识; 2.3 数组类型 数目固定、类型相同的若干个变量的有序 集合; 2.3.1 数组的定义 1、格式 ; 说明: 方括号( )表示数组的维; 某维的大小必须是大于1的常量表达式; 2、示例 int a3; char b35; const int size=80; int msize; 2.3.2 数组的赋值 1、数组元素的表示 下标表示: ; 说明: k为常量表达式; k下标从0开始; k各个元素在内存中按其下标的升序顺序连续 存放; 指针表示: 2.3.2 数组的赋值(续) 2、数组元素赋初值 利用初始值表(由一对花括号括起来的若干数 据项组成)实现; 数组元素的个数要大于等于初始值表中数据项 的个数; 例如:int a5=1,2,3,4,5; int a4=5,4; int b23=1,2,3,4,5,6; int b23=1,2,3,4,5,6; int c232=5,4,3,2,1,0; 3、数组元素的赋值 例如:int m3; m0=5; m1=3; m2=1; 2.3.3 字符数组 说明: 字符数组是指数组元素是char类型的数组; 注意字符常量、字符数组与字符串常量的区别 ; 例如: char s14=a, b, c, d;字符数组 char s25=a, b, c, d, 0;字符数组 (字符串常量) 等价于 char s25=“abcd“; char s35=“abcde“; char s3=“abcde“; 2.4 枚举类型 枚举类型是若干个有名字的整型常量的集 合; 2.4.1 枚举声明和枚举变量 一、枚举声明 enum ; 由若干个枚举符组成,多个枚举符之 间用逗号分隔; 枚举符是用标识符表示的整型常量,又称枚举 常量; 枚举常量的值默认为最前边的一个为0,其后 的值依次加1; 枚举常量的值也可显式定义,未显式定义的则 在前一个值的基础上加1; 2.4.1 枚举声明和枚举变量(续 ) 二、枚举变量 例如:enum day Sun,Mon,Tue,Wed,Thu,Fri,Sat; enum day Sun=7,Mon=1, Tue,Wed,Thu,Fri,Sat; 枚举变量的值不一定互不相同; enum ; 多个枚举变量之间用逗号分隔; 例如: enum day d1,d2,d3; enum day Sun,Mon,Tue,Wed,Thu,Fri,Sat d1,d2,d3; 2.4.2 枚举变量的值 其值是该枚举变量所属的枚举声明的枚举表的某 一个枚举符; 利用枚举符所表示的整型值给枚举变量赋值时, 需要进行类型强制; 例如: d1=Sun; d2=Sat; d3=(enum day)4; 2.5.1 指针 1、什么是指针 指针是用来存放某个变量的地址值的一种变量; 指针的类型是它所指向 变量的类型; 指针本身数据值的类型 是unsigned long int型; 例如: int a(5); int *p= 内存 1000H 5 . a 地址值 1000H 3000Hp 2.5.1 指针(续) 2、如何定义指针 例如: int *pi; char (*pa)3; float *pl; int (*pf)(); char *pc; int *pp; *, *,; 3、指针的赋值(内存地址值) 指针必须被赋值后才可使用; 一般变量、数组元素、结构成员的地址值为变 量名前加运算符 double sin(double x); int *p= double (*pf)(); int a10,*p=a; pf=sin; 3、指针的运算 赋值运算。例如:int a,*p= q=p; 一个指针可以加上或减去一个整数值; 在一定条件下(指向同一数组的不同元素),两个 指针可以相减; 在一定条件下(指向同一数组元素),两个指针可 以比较; a与 数组表示法:ai,i=0,1,2,3,4 指针表示法:*(a+i) 2.5.2 指针和数组(续) 3、二维数组的指针表示法 int b25; 数组表示法:bij i=0,1; j=0,1,2,3,4 指针表示法: *(*(b+i)+j) *(bi+j) (*(b+i)j ( int i,j; i=a0+a4; j=*(a+2)+*(a+4); cout void main() static char s1=“abcde“,s25=m, n, p, q, 0; char *ps=s1; cout void main() static char t35=“abcd“, “efgh“, “ijkl“, “mnop“, “qrst“, “uvwx“; cout 或 2、初始化与赋值 定义引用时必须初始化; 可以将一个引用赋给某个变量; 引用可被赋值; 2.5.3 引用(续) 示例: int a=3; int int n=m; int *p= m=m+5; 3a8 p m 3n 定义引用并初始化 将引用赋值给变量 a=8,对引用的操作就是 对被引用者的操作 3、引用的功能 用做函数的参数或函数的返回值; 函数不能返回对局部对象的引用; 2.5.3 引用(续) 示例: int return r; 错,r是局部对象 4、指针与引用的区别 指针通过地址间接访问某个变量,引用通过别 名直接访问某个变量; 引用必须初始化,一旦被初始化后不得再作为 其他变量的别名; 正确:int 2.5.3 引用(续) 例2.4:分析下列程序的输出结果。 #include void main() int val(5); int refv=refv+5; cout int return r; void main() int a=1,3,5,7,9; f(2,a)=55; for(i=0;i、=、; 时移掉的位被丢弃,左边移出的空位补0或 符号位; 2.6.5 赋值运算符 简单赋值运算符:= 复合赋值运算符:+=、-=、*=、/=、%=、 或 sizeof(); 格式: (); 或 () ; 2.6.6 其他运算符(续) 强制类型转换可将高类型转换为低类型,是一 种不安全的转换; 示例: double f(3.85); int h; h=int(f); 该转换是暂时的,一次性的; 示例: int a(3),m; double b; b=3.56+double(a); m=a+5; 2.6.7 运算符和优先级和结合性 P46,表2.3 2.7.1 表达式的种类 由运算符和操作数组成的式子; 常见的表达式 k算术表达式; k逻辑表达式; k关系表达式; k赋值表达式; k条件表达式; k逗号表达式; 2.7.1 表达式的种类(续) 注意事项: k连续的两个运算符之间用空格分隔; k可用括号来改变运算符优先级; k双目运算符的左右可以用空格符和操作数分开; k过长的表达式可分成几个表达式; 2.7.2 表达式的值和类型 一、确定表达式的值 二、表达式求值方法与确定类型的方法 先确定运算符的功能; 确定计算顺序:先考虑优先级,再考虑结合性; 2.7.2 表达式的值和类型(续 ) 例2.6:分析下列程序的输出结果(算术表达式)。 #include void main() unsigned a(0xab),b(20); a a=a; couty; x void main() char x(m),y(n); int n; n=x3)+(y-x=1); cout void main() int x,y,z; x=y=z=1; -x cout void main() int a(3),b(4),c; c=ab?+a:+b; cout void main() int x(1),y(3),z(5); x+=y*=z-=2; cout void main() int a,b,c; a=1,b=2,c=a+b+3; cout ; 例如: typedef double wages,bouns; wages weekly; bouns monthly; 2、自定义类型的作用 改善程序的可读性,增加所定义变量的信息 书写简练 提高程序的可移植性 第3章 预处理和语句 3.1 预处理功能 3.2 语句 3.3 选择语句 3.4 循环语句 3.5 转向语句 3.1 预处理功能 一、预处理命令及预处理功能 1、预处理命令 C+源程序中包含的各种编译命令在程序被正 常编译之前执行; 预处理命令不是C+语言的一部分; 2、预处理功能 由预处理命令实现的功能; 二、常用的预处理命令 文件包含命令 宏定义命令 3.1 预处理功能(续) 以“ # “为引导; 每条预处理命令单独占用一行,同一行不能 有其他预处理命令和语句; 三、预处理命令使用说明 条件编译命令 停止编译命令 预处理命令的位置可以放在开头、中间和结尾; 预处理命令可以续行,续行符为“ “; 预处理命令不是语句,不能以分号(;)结束; 3.1.1 文件包含命令 一、功能 指示C+编译器将一个文件(头文件)的内容 嵌入到该指令所在的文件中该指令所在位置处; 头文件指存放与标准函数有关的信息,或者存 放符号常量、类型定义、类和其他复杂类型的定 义以及与程序环境相关信息的.h文件; 二、格式 #include 由系统提供并放在指定子目录中的头文件; #include “文件名“ 由用户定义,放在当前目录或其他目录下的头文 件或其他源文件; 3.1.1 文件包含命令(续) 三、说明 文件包含命令一般放在程序头; 一条文件包含命令只能包含一个文件; 文件名:myfile.h #include “myfile2.h“ #include “myfile3.h“ 文件包含命令可以嵌套; 包含文件不易过多; 3.1.2 宏定义命令 一、功能 用来将一个标识符定义为一个字符串,该标识 符称为宏名,被定义的字符串称为替换文本; 二、宏定义命令格式 1、两种定义格式 简单宏定义 带参数的宏定义 2、简单宏定义 定义符号常量,例如:#define PI 3.1415 #define 3.1.2 宏定义命令(续) #define与const定义符号常量的区别 const产生一个具有类型 的符号 #define仅产生文本替换, 而不管内容是否正确 const double PI=3.1415;#define PI 3.1415 使用const可以定义一个 局部常量,可局部在一 个函数体内 用#define定义的常量的作 用域是从定义时开始,直 到使用#undef取消定义时 为止,如果不取消定义, 直到整个文件结束 使用const定义常量是一 个说明语句,用分号(;) 结束 使用#define定义常量是 一个预处理命令,不能 用分号(;)结束 3.1.2 宏定义命令(续) 说明 k书写#define命令时,与之间 用空格分隔,不能使用等号连接; k使用#define定义的标识符不是变量,它只用 作宏替换,不占用内存; k#define是一条预处理命令,不用分号结束, 它所定义的标识符等价于其后的字符串; k标识符被宏定义后,在取消这次宏定义之前 ,不允许重新对它进行宏定义; k宏定义可以嵌套,已定义的标识符可以用来 定义新的字符串; 3.1.2 宏定义命令(续) 说明 k应写在一行上,如果需要写在多行时 ,需使用续行符()结束,并在其后按下回车键; k与左括号之间不能出现空格,否则空 格右边都将作为宏体; k定义带参数的宏体时,宏体中与参数名相同 的字符序列适当地加上括号,可以避免宏替换后 出现的优先级问题; kC+中,带参数的宏定义常由内联函数取代; 3、带参数的宏定义 #define () 3.1.2 宏定义命令(续) 例3.1:分析下列程序的输出结果。 #include void main() int b(5); #define b 2 #define f(x) b*(x) int y(3); cout 3.1.3 条件编译命令 一、功能 用来定义某些编译内容要在满足一定条件下才 参与编译,否则不参与编译;可使同一源程序在不 同的编译条件下产生不同的目标代码。 二、格式 格式一: #ifdef #else #end if 或 #ifdef #end if 3.1.3 条件编译命令(续) 格式二 #ifndef #else #end if 或 #ifndef #end if 格式三 #if #elif #elif . #else #end if 3.1.3 条件编译命令(续) 例3.2:分析下列程序的输出结果。 #include #define A 10 void main() #if A0 cout0“0 3.1.3 条件编译命令(续) 例3.3:避免重复引用某个头文件。 /main.cpp #include “myfile1.h“ #include “myfile2.h“ /myfile1.h #include “myhead.h“ /myfile2.h #include “myhead.h“ 改进: /myfile1.h #ifndef MYHEAD_H #define MYHEAD_H #include “myhead.h“ #endif /myfile2.h #ifndef MYHEAD_H #define MYHEAD_H #include “myhead.h“ #endif 3.1.3 条件编译命令(续) 例3.4:用于调试。 调试时: #define DEBUG 1 . #if DEBUG=1 cout 二、功能 当编译器遇到该指令时,显示“字符序列”,即 错误信息,然后停止对该程序的编译,从而可以在 编译阶段发现程序中的错误; 三、示例 假设country值为:US、ENGLAND、CHINA 程序中有如下语句: 3.1.4 停止编译命令(续) / #else #error You define country incorrectly #endif 当country的值不是上述三者之一时,编译器将 显示: 然后停止编译。 You define country incorrectly 3.2 语句 1、表达式语句和空语句 表达式语句:任何一个表达式加上分号(;); 空语句:只有一个分号(;)的语句; 2、复合语句和分程序 复合语句:由两条或两条以上的程序构成,并 由一对花括号括起; 分程序:又称块结构,含有一条或多条说明语 句的复合语句; 3.3.1 条件语句 if () else if () else if () . else if () else 说明: if语句可以嵌套,在此情况下,else与最近的 一个没有与else配对的if配对。 3.3.2 开关语句 switch () case : case : . case : default 注意: 在执行语句序列中如果遇到break语句,则退 出switch语句,执行后面的语句;如果其后的语 句序列中没有break语句,则一直执行至switch语 句结束。 3.3.2 开关语句(续) 例3.5:分析下列程序的输出结果。 #include void main() int i(1),j(0),m(1),n(2); switch(i+) case 1:m+; n+; case 2:switch(+j) case 1:m+; case 2:n+; case 3:m+; n+; break; case 4:m+;n+; cout) ; 2、do-while循环语句 do while (); do-while循环与while循环的区别: do-while循环至少执行一次循环体,while循 环可能一次也不执行循环体; 3、for循环语句 for (d1;d2;d3) ; 4、多重循环 3.5 转向语句 1、goto语句 格式: goto ; goto语句只能在一个函数内进行转向; 2、break语句 格式: break; 适用情况: k用于开关语句的语句序列中,其功能是退出 开关语句,执行其后的语句; k用于循环体中,其功能是用来退出该重循环; 3、continue语句 格式: continue; 功能:在循环体中用来结束本次循环; 第4章 函数和作用域 4.1 函数的基本概念 4.2 函数的定义和说明 4.3 函数的调用 4.4 函数的参数 4.5 内联函数 4.6 函数重载 4.7 异常处理基础 4.8 作用域 返回类型为 void类型的 函数抽象 为过程抽象 4.1 函数的基本概念 函数结构:由花括号括起来的一个语句序列; 函数抽象:使用标识符对语句序列进行的抽象; 函数调用:函数级上的控制抽象,一种控制转移; 参数化:在函数抽象中对其所操作的值进行抽象 的过程; 形参与实参 函数抽象与过程抽象 k函数抽象的目的是进行求值 k过程抽象的目的是更新对象 C+中只有函数抽象 4.2.1 函数的定义格式 () 说明: 为函数返回值类型,若为void,则为过 程调用; 中的参数为形参,在函数被调用时进 行初始化,从而从被调用处获得数据; 函数体 4.2.2 函数的说明方法(函数的声明) 一、函数的说明原则 如果一个函数定义在先,调用在后,调用前可 以不必说明; 如果一个函数定义在后,调用在先,调用前 必须说明; 二、函数的说明方法(原型说明) (); 三、示例 参数表中的参数 名称可以省略 4.2.2 函数的说明方法(续) #include void fun1(),fun2(),fun3(); void main() cout(); 实参对形参的初始化按其位置进行; 4.3.1 函数的值和类型(续) 关于return语句的说明: 有返回值的return语句可以返回一个表达式的值 ,从而实现函数之间的信息传递; 无返回值的函数必须用void说明其返回类型; 二、返回语句格式 格式一: return ; 格式二: return; 4.3.2 函数的传值调用 一、传值调用的分类 二、传值调用的实现机制和特点 传值调用:传递变量本身的值(数据值); 传址调用:传递变量的地址值; 用法:调用函数的实参用常量、变量(数据)值 或表达式值,被调用函数的形参用变量; 实现机制:系统将实参拷贝一个副本给形参(数 据值) ; 特点:形参值的改变不影响实参值; 4.3.2 函数的传值调用(续) #include void swap1(int x,int y) int temp; temp=x; x=y; y=temp; cout void swap2(int *x,int *y) int temp; temp=*x; *x=*y; *y=temp; cout void swap3(int temp=x; x=y; y=temp; cout int add(int x,int y) return x+y; void main() int x(4),y(6); int z=add(+x,x+y); cout void fun(int a=1,int b=3,int c=5) cout #define f(x) x*x void main() int x(2); cout inline int f(int x) return x*x; void main() int x(2); cout int add(int,int); double add(double,double); void main() cout int min(int a,int b); int min(int a,int b,int c); int min(int a,int b,int c,int d); void main() cout; 当一个异常被一个函数引发后,执行流程返回到 该函数的调用者中; 表达式类型 称为异常类型 4.7 异常处理基础(续) double Div(double a,double b) if (b=0.0) throw 1.0E-38; return a/b; 引发double类型的异常 四、捕获异常(try) try try块的语句在执行过程中可能会引发多种类型的 异常,由catch块进行处理; 捕获异常后,执行流程立即转到catch块,进行异 常处理; 4.7 异常处理基础(续) 五、异常处理(catch) catch () catch () 每个catch块声明了所要捕获的一种类型; catch块中的语句表示在该异常被捕获时应执行的 动作; 4.7 异常处理基础(续) 参数声明形式: k通过标识符except,catch可以获得更多的异 常信息; double except 或 double return a/b; void main() double x,y,result(1234); try 例4.9:分析下列程序的输出结果。 引发异常 try块捕获异常 4.7 异常处理基础(续) cinxy; result=Div(x,y); coutM这样的表达式中,其中ptr为指向X类型 的一个对象的指针; 在X:M这样的表达式中; 4.8.4 文件作用域 作用域范围:文件作用域中声明的标识符的作用 域开始于声明点,结束于文件尾; 头文件中声明的标识符的作用域可扩展到包含它 的文件作用域中; 面向对象程序设计中,文件作用域中只进行类声 明,其他声明在类模块内部进行; 4.8.5 重新定义标识符的作用域规定 在某个作用范围内定义的标识符在该范围内 的子范围内可以重新定义该标识符。这时,原定 义的标识符在子范围内是不可见的,但是它还是 存在的,只是在子范围内由于出现了同名的标识 符而暂时被地被隐藏起来。过了子范围后,它又 是可见的。 4.8.5 重新定义标识符的作用域规定(续) #include void main() int a(5),b(7),c(10); cout public: private: ; 访问权限 类定义 关键字 说明部分 实现部分 语句 结束符 5.1.2 类的定义格式(续) 访问权限修饰符:公有的(public)、私有的 (private)和保护的(protected); 访问权限修饰符出现的先后次序无关,并且允 许多次出现; 3、类定义的说明 缺省访问权限为私有的; 公有部分:一些操作(即成员函数),是提供 给用户的接口功能; 私有部分:一些数据成员,通常用来描述该类 中的对象的属性; 5.1.2 类的定义格式(续) 4、示例(tdate.h) class TDate public: void SetDate(int y,int m,int d); int IsLeapYear(); void Print(); private: int year,month,day; ; void TDate:SetDate(int y,int m,int d) year=y; month=m; 成员函数定义 作用域运算符 5.1.2 类的定义格式(续) day=d; int TDate:IsLeapYear() return (year%4=0 ; 错误 类中的数据成员的类型可以是任意的; k包含整型、浮点型、字符型、数组、指针和引 用等; k另一个类的对象,可以作该类的成员; k自身类的对象不可以作该类的成员; 5.1.3 定义类时的注意事项(续) class N; class M public: . private: N *n; ; class N public: void f(M m); ; 提前说明类N k自身类的指针或引用 ,可以作该类的成员; k当另一个类的对象作 为该类的成员时,如果另 一个类的定义在后,需要 提前说明; k一般在类体内先说明用 户感兴趣的公有成员,再 说明私有成员; k习惯将类定义的说明 部分或者整个定义部分( 包含实现部分)放到一个 头文件中; n是N类的对象 m是M类的对象 5.2.1 对象的定义格式 例如: TDate date1,date2,*Pdate,date31; ; 对象的定义格式。 5.2.2 对象成员的表示方法 1、一般对象 数据成员: . 成员函数: .() .运算符:表示对象的成员 例如: date1.year, date1.month, date1.day; date1.SetDate(1998,4,9); 2、指针对象 数据成员: - 成员函数: -() -运算符:表示对象的成员 例如: Pdate-year, Pdate-SetDate(1998,4,9); 5.2.2 对象成员的表示方法(续) -运算符与.运算符的区别 -表示指向对象的指针的成员; .表示一般对象的成员; 两种等价表示 - (*). 3、引用对象 与一般对象相同; 5.2.2 对象成员的表示方法(续) #include #include “tdate.h“ void main() TDate date1,date2; date1.SetDate(1996,5,4); date2.SetDate(1998,4,9); int leap=date1.IsLeapYear(); cout #include “tdate1.h“ void main() TDate1 today(1998,4,9), tomorrow(1998,4,10); cout:() 1、缺省构造函数 类定义中没有任何构造函数时,由编译器自动 生成一个不带参数的缺省构造函数; 缺省构造函数即参数表为空的构造函数; :() 2、缺省析构函数(定义时机同缺省构造函数) 类名 5.3.3 拷贝初始化构造函数 1、功能 用一个已知的对象来初始化一个被创建的同类 对象; 2、特点 函数名同类名,无返回类型; 只有一个参数,是对某个对象的引用; 每个类都必须有一个拷贝初始化构造函数; :(const Y=y; TPoint(TPoint TPoint() cout #include “tpoint1.h“ TPoint f(TPoint Q); void main() TPoint M(20,35),P(0,0); TPoint N(M);M为已知对象,N是正在创建的对象 5.3.3 拷贝初始化构造函数(续) P=f(N); cout 等价于 B.operator =(A); 每个类都有一个赋值操作; 5.3.4 赋值(续) #include class Location public: Location(int xx=0,int yy=0) X=xx;Y=yy; Location(Location Y=p.y; Location int GetX() return X; int GetY() return Y; private: int X,Y; ; 例5.4:分析下列程序的输出结果。 赋值函数 5.3.4 赋值(续) Location Y=p.Y; cout class A public: A(int x,int y) X=x;Y=y; int a() return X; int b() return Y; int c(); int d(); private: int X,Y; ; 内联 函数 5.4.1 内联函数和外联函数(续) inline A:c() return a()+b(); inline int A:d() return c(); void main() A m(3,5); int i=m.d(): cout class M public: M(int x,int y) X=x;Y=y; M(int x) X=x;Y=x*x; int Add(int x,int y); int Add(int x); int Add(); int Xout() return X; int Yout() return Y; private: int X,Y; ; 构造函数重载 一般成员函数重载 5.4.2 重载性(续) int M:Add(int x,int y) X=x; Y=y; return X+Y; int M:Add(int x) X=Y=x; return X+Y; int M:Add() return X+Y; 5.4.2 重载性(续) void main() M a(10,20),b(4); cout class N public: N(int a=3,int b=5,int c=7); int Aout() return A; int Bout() return B; int Cout() return C; private: int A,B,C; ; int N:N(int a,int b,int c) 构造函数设置缺省参数值 5.4.3 设置参数的缺省值(续) A=a; B=b; C=c; void main() N X,Y(9,11),Z(13,15,17); cout :=; k初始化时不加该成员的访问权限控制符(静态 数据成员初始化位置与访问权限无关); k初始化时使用作用域运算符表明它所属的类; k引用格式 : : 5.5.1 静态数据成员(续) 例5.8:分析下列程序的输出结果。 #include class Myclass public: Myclass(int a,int b,int c); void GetNumber(); void GetSum(); private: int A,B,C; static int Sum; ; int Myclass:Sum=0; 私有静态数据成员Sum 静态数据成员Sum初始化 5.5.1 静态数据成员(续) Myclass:Myclass(int a,int b,int c) A=a; B=b; C=c; Sum+=A+B+C; void Myclass:GetNumber() cout:() 5.5.2 静态成员函数(续) 例5.9:分析下列程序的输出结果。 #include class M public: M(int a) A=a;B+=a; static void f1(M m); private: int A; static int B; ; void M:f1(M m) 私有静态数据成员B 公有静态成员函数 静态成员函数体 5.5.2 静态成员函数(续) cout:() 通过对象引用非静态成员 直接引用静态成员 私有静态数据成员初始化 输 出 A=5 B=15 A=10 B=15 5.5.2 静态成员函数(续) 例5.10: 某商店经销一种货物,货物成箱购进,成 箱卖出,购进和卖出时以重量为单位,各箱的 重量不一样,因此,商店需要记录下目前库存 的货物的总重量,现在要求用C+语言来模拟商 店货物购进和卖出的情况。 5.5.2 静态成员函数(续) #include class Goods public: Goods(int w); Goods(); int Weight(); static int TotalWeight(); private: int weight; static int totalWeight; ; Goods:Goods(int w) 现有库存 货物购进 货物卖出 5.5.2 静态成员函数(续) weight=w; totalWeight+=w; Goods:Goods() totalWeight-=weight; int Goods:Weight() return weight; int Goods:TotalWeight() return totalWeight; 5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国银行2025滨州市秋招笔试英语题专练及答案
- 交通银行2025山南市秋招笔试专业知识题专练及答案
- 工商银行2025西安市秋招笔试EPI能力测试题专练及答案
- 建设银行2025驻马店市秋招半结构化面试题库及参考答案
- 2025行业数字化转型成功案例研究
- 工商银行2025吉林市结构化面试15问及话术
- 邮储银行2025海西蒙古族藏族自治州秋招结构化面试经典题及参考答案
- 有色金属中间产品供需服务合同2篇
- 建设银行2025神农架林区秋招笔试综合模拟题库及答案
- 邮储银行2025毕节市金融科技岗笔试题及答案
- 血友病课件完整版
- 神经系统的分级调节课件 【知识精讲+备课精研+高效课堂】 高二上学期生物人教版选择性必修1
- 三年级上册数学试卷-第一单元 混合运算 北师大版 (含答案)
- 临床职业素养
- 种子学-种子的化学成分课件
- 教学课件-英语学术论文写作(第二版)
- 手术室无菌技术 课件
- ISO 31000-2018 风险管理标准-中文版
- 六年级数学上册教案6:分数乘法:分数乘小数-人教版
- 小学综合实践六年级上册第1单元《考察探究》教材分析及全部教案
- 教育评价学全套ppt课件完整版教学教程
评论
0/150
提交评论