第2章C面向过程的程序设计.ppt

上传人:本田雅阁 文档编号:3423483 上传时间:2019-08-24 格式:PPT 页数:30 大小:209.04KB
返回 下载 相关 举报
第2章C面向过程的程序设计.ppt_第1页
第1页 / 共30页
第2章C面向过程的程序设计.ppt_第2页
第2页 / 共30页
第2章C面向过程的程序设计.ppt_第3页
第3页 / 共30页
第2章C面向过程的程序设计.ppt_第4页
第4页 / 共30页
第2章C面向过程的程序设计.ppt_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《第2章C面向过程的程序设计.ppt》由会员分享,可在线阅读,更多相关《第2章C面向过程的程序设计.ppt(30页珍藏版)》请在三一文库上搜索。

1、1,第2章 C+面向过程的程序设计,2.1 数据类型 2.2 常量和变量 2.3 基本控制结构 2.4 数组和指针 2.5 函数,2,2.1 数据类型,数据类型的作用有两个: 一是指明为数据分配多大的存储空间和规定了数据的存储结构,进而规定了数据的取值范围; 二是规定了数据所能进行的操作。,3,2.1 数据类型,4,2.1 数据类型,2.1.1 基本数据类型的取值范围,5,2.1 数据类型,2.1.2 C+的扩展 1. 布尔类型(bool) 布尔类型(bool)是ANSI C+新增的数据类型,其取值只能是true(1)和false(0)。主要用来建立复杂的条件判断和控制循环操作的标志。 2.

2、结构、联合和枚举名可直接作为类型名 在C语言中定义结构体、联合或枚举类型的变量时,必须加上struct、union或enum关键字。 在C+中,自定义的结构名、联合名和枚举名可以直接作为类型名使用,在定义变量时,在结构名、联合名或枚举名前可省略struct、union或enum关键字。 3. 无名联合 在C+中定义联合时,可以在union关键字后省略联合名,这样定义的联合称为无名联合。,6,2.1 数据类型,union double d; int i; ; 在此无名联合中,d和i共享相同的存储空间。无名联合中定义的数据项可以直接作为变量使用,例如: d=8.3; i=5;,7,2.1 数据类型

3、,4. 数据类型转换 表达式中的类型转换分为自动类型转换和强制类型转换。 C+的强制类型转换有两种格式。 格式1:(数据类型)表达式 在使用这种格式时,如果表达式为包含多个操作数的表达式,则表达式应加括号。 格式2:数据类型(表达式) 这是C+扩充的一种强制类型转换方式。将数据类型名作为函数名,表达式作为参数,采用函数调用的形式。,8,2.2 常量和变量,2.2.1 常量 1. 整型常量 2.实型常量 3.字符常量 4.字符串常量 5.布尔常量 布尔常量只有两个:false和true。 6. 符号常量 除了直接用值表示常量外,还可以用标识符来表示常量,称为符号常量。 C+中可以使用const修

4、饰符和#define宏定义命令定义符号常量。使用const声明常量的格式为: const 数据类型 常量名=常量值;,9,2.2 常量和变量,在使用const定义符号常量时必须要进行初始化,在程序运行过程中不能改变其值。 定义符号常量,可以像C语言中用#define宏定义命令定义。对于宏定义命令#define,编译器只做简单文本替换,只是对源程序编写上的一种简化,它不进行类型检查,在某些情况下易出错。使用const定义的符号常量具有类型,在使用时系统需要进行类型检查。 【例2.1】符号常量的定义和使用示例 在C+中,用const定义的符号常量可以用来定义数组。 const还可以修饰指针和函数的

5、参数和返回值。 在C+中一般使用const定义符号常量,不推荐使用#define定义符号常量。,10,2.2 常量和变量,2.2.2 变量 1.变量的定义 2.存储类型 3.变量定义语句的位置 在C语言中,全局变量的定义必须在所有函数定义之前,局部变量的定义必须在复合语句的可执行语句之前。C+中变量定义语句的位置非常灵活,可以与可执行语句在程序中交替出现。 在C+中甚至可以在for循环语句中定义变量,例如: for (int i=0;i10;i+),11,2.2 常量和变量,4. 作用域运算符“:” C/C+中,在相同的作用域内,多个变量不能同名,但在不同的作用域内允许定义同名的变量。如果一个

6、内层作用域中定义了与外层作用域中同名的变量,那么在该作用域模块中对这个变量的访问只是对该内层作用域局部变量的访问。 【例2.2】不同作用域同名变量的访问 C+语言中可以使用作用域运算符“:”在局部变量的作用域内访问同名的全局变量。 【例2.3】作用域运算符的使用示例 注意,作用域运算符“:”只能用来访问全局变量,而不能用来访问同名的非全局变量。 【例2.4】作用域运算符的错误用法,12,2.3 基本控制结构,C+的流程控制语句与C语言完全相同。 2.3.1 顺序结构 2.3.2 选择结构 1.if语句 2.switch语句 2.3.3 循环结构 1.while语句 2.do-while语句 3

7、.for语句 2.3.4 流程的转移控制 1.goto语句 2.break语句 3.continue语句,13,2.4 数组和指针,2.4.1 数组 1.数组的定义 C语言中,定义数组时,下标必须是常量,不允许使用表达式。C+中允许使用常量表达式来定义数组。 2.数组的初始化 3.数组元素的引用 2.4.2 指针 1.指针的定义 需要特别注意的是,指针定义后其指向是不确定的,在让其指向具体的变量前就向指针所指向的内存空间写数据,可能造成不可预料的后果。因此,在使用一个指针变量前,必须要初始化指针变量,让其指向具体的变量。,14,2.4 数组和指针,2.指针的运算 2.4.3 指针与数组 2.4

8、.4 动态内存分配 C语言中使用库函数malloc()和free()来实现动态内存的分配和释放(头文件为stdlib.h和malloc.h),C+仍然支持这种方式。另外,C+提供了运算符new和delete来进行动态内存的分配和释放。 使用new和delete来代替库函数malloc()和free()有以下优势:new和delete是运算符,使用时不需要包含头文件;在对指针赋值时不需要进行类型转换,系统自动返回正确的类型;使用new给对象分配内存空间会自动调用该对象的构造函数,使用delete释放对象会自动调用该对象的析构函数。,15,2.4 数组和指针,1.new运算符 new运算符用于向系

9、统申请内存空间,并返回该内存空间的首地址。其使用格式如下: 指针= new 数据类型; 指针的类型必须与new后的数据类型相同,否则应进行强制类型转换。 在分配内存空间时,可以对分配的内存空间进行初始化,格式如下: 指针= new 数据类型(表达式); 例ch02_14.cpp new运算符可以为数组申请内存空间,建立动态数组。为一维数组申请存储空间的格式为: 指针= new 数据类型整型表达式; 为二维数组申请内存空间的格式为:,16,2.4 数组和指针,指针= new 数据类型表达式常量表达式; 其中,第一维的大小可以是任意合法的表达式,第二维的大小必须是常量表达式。 例如: int n=

10、5; int (*p)4=new intn4; 使用new可以建立任意维数的动态数组,格式如下: 指针 = new 数据类型表达式常量表达式1常量表达式2; 使用new动态分配内存时,如果系统没有足够存储空间满足申请要求或由于其它原因造成分配内存失败,new将返回空指针(NULL)。因此通常应对内存的动态分配是否成功进行检查。 2. delete运算符,17,2.4 数组和指针,使用new动态分配的存储空间使用结束后一定要释放,否则会造成内存泄漏。运算符delete用于释放使用new动态分配的存储空间。它的使用格式一般为: delete 指针; 其中,指针必须是new分配的存储空间的首地址。

11、释放动态分配的数组存储空间时,应使用如下格式: delete 指针; 其中,指针必须是动态数组的首地址。 例ch02_15.cpp 直接使用delete运算符(不加)来释放动态数组是错误的,但编译器并不能发现这种错误。 再次强调,必须确保每次使用new运算符后,都有相应的delete运算符。 【例2.13】从键盘输入若干个整数存入数组并求这些整数的和。,18,2.5 函数,2.5.1 函数的定义和调用 2.5.2 函数原型 C+提供了函数原型,允许函数调用在前,定义在后,但必须在函数调用前对该函数进行原型说明。 函数原型的重要作用是可以使编译器检查一个函数调用中可能存在的问题,维护程序的正确性

12、。 函数原型的语法形式一般为: 函数类型 函数名(形式参数类型表); 函数原型是一条语句,它必须以分号结束。 函数原型与函数定义时的函数返回类型、函数名、参数类型、参数个数和次序必须完全一致。 【例2.15】函数原型示例,19,2.5 函数,2.5.3 内联函数 内联函数是C+对C语言的扩展。 为了提高调用频繁、函数代码少的函数的执行效率,C+引入了内联函数。当程序中出现对内联函数的调用时,C+编译程序将函数的代码直接插入到函数调用处,即用函数代码替换函数调用。因此可以节省函数调用的时间,但会使程序的长度增加。使用内联函数实际上是用空间换时间,其目的是提高程序的执行效率。 定义内联函数的方法是

13、在定义函数时用关键字inline修饰该函数。 【例2.16】编程求110这10个数的三次方,并输出。,20,2.5 函数,使用内联函数时应注意: (1)内联函数体内不能含有循环语句和switch语句,也不能是递归函数。如果函数体内含有这些语句,系统会将此函数作为普通函数处理。 (2)内联函数的定义必须出现在对该函数的调用之前,否则编译器将无法知道插入什么代码。 (3)内联函数不应过大,一般宜在15行之间。 (4)内联函数内不能包含static变量。 C+中的内联函数具备宏定义#define的功能,但由于它是一个函数,编译时需要进行类型和语法检查,消除了宏定义的不安全因素。,21,2.5 函数,

14、2.5.4 函数参数的默认值 C+允许在函数原型或函数定义中为一个或多个形参指定默认值,这一点与C语言不同。在调用含有默认值的函数时,如果为形参指定了相应的实参,则形参使用实参的值,如果未指定相应的实参,则C+自动以默认值作为参数的值。这为函数的使用提供了便利。 为形参指定的默认值可以是任何初始化表达式,这个表达式可以含有函数调用或其它的全局变量。 例:函数缺省参数示例(ch02_24.cpp) 在使用和设置参数默认值时应注意: (1)如果需要为多个形参指定默认值,则在函数原型中或函数定义时,必须将所有指定默认值的参数放在参数表的右部,即在带默认值的参数的右边不能有未指定默认值的参数。,22,

15、2.5 函数,(2)为参数指定默认值必须在函数调用之前进行。因此,如果存在函数原型,则参数的默认值应在函数原型中指定,否则在函数定义中指定。另外,如果在函数原型中已经指定了参数的默认值,则在函数定义中不允许重复指定,即使指定的默认值完全相同也不行。 (3)在函数调用时,如果省略某个实参(使用默认值),则该参数右边的所有参数都必须省略。 (4)如果几个函数原型语句出现在不同的作用域内,则可以为相应的参数提供不同的缺省值,但在同一作用域内必须保证各说明的一致性。 例:函数缺省参数示例(ch02_24.cpp),23,2.5 函数,2.5.5 函数重载 在C语言中,要求函数名必须唯一,即使是功能相同

16、的函数也必须具有不同的函数名。例如求一个数的绝对值,由于该数可以是int、double或long,虽然都是求绝对值,也必须定义三个不同函数名的函数。在C语言函数库中这三个函数的函数原型为: int abs(int); long labs(long); double fabs(double); 在使用时必须根据参数类型决定调用哪一个函数,不能混淆。这样造成记忆和使用的不方便。 C+中允许在同一程序中定义函数名相同的多个函数,使函数的使用更加灵活、方便。,24,2.5 函数,函数重载是C+实现多态性的一种方法。 函数重载是指一组参数类型不同或参数个数不同的函数共用同一个函数名。被重载的函数称为重载

17、函数。例如,求绝对值函数,对于不同类型的参数可以使用同一个函数名abs。 【例2.17】求绝对值函数的重载 对于重载函数的调用,C+编译器根据函数调用时实参的类型或个数来确定调用的是哪一个函数。 【例2.18】参数个数不同的函数重载示例。 在对函数进行重载时,应注意: (1)重载函数的参数必须有所不同:参数类型不同或参数个数不同或者两者都不同。如果两个或多个函数的参数相同,仅仅函数返回值类型不同时,不是函数重载,而会出现编译错误。,25,2.5 函数,(2)不能根据用typedef定义的类型名来区分重载函数。因为用typedef定义的类型名仅仅是已有类型的别名。 (3)重载函数与带默认值的函数

18、一起使用时,有可能引起二义性。例如: int add(int x,int y,int z=0); int add(int x,int y); (4)重载的函数应该保持功能一致。,26,2.5 函数,2.5.6 引用 引用是C+中的新概念。引用是某个变量的别名。它主要用作函数的参数或函数的返回类型。 1.引用的声明 声明一个引用的格式一般为: 数据类型 引用不占用单独的存储空间,它与所引用的变量占用相同的存储空间,因此,对引用的所有操作就是对所引用的变量的操作。,27,2.5 函数,【例2.19】引用的声明和使用示例。 在声明和使用引用时,应注意: (1)除了作为函数的参数或函数的返回类型外,在

19、声明引用时必须立即进行初始化,不能声明完成后再赋值。 可以使用已定义的变量对引用进行初始化,也可以使用已声明的引用进行初始化。 (2)声明引用的类型与初始化引用时所使用的变量的类型应一致。 (3)在同一作用域内,一个引用声明后,不可再作为其它变量的别名。 (4)不能声明引用的引用,不能声明指向引用的指针,不能声明引用数组。例如:,28,2.5 函数,int n; int /错误,不能声明引用数组 2. 引用作为函数参数 C+提供引用的主要用途是将引用作为函数的参数和函数的返回值。 C语言中进行函数调用时,实参向形参传递数据有两种方式,分别是传值的方式和传地址的方式,相应的函数调用分别称为传值调

20、用和传址调用。,29,2.5 函数,C+引入引用后,实参向形参传递数据增加了引用传递方式,相应的函数调用称为引用调用。引用调用的使用方式与传值调用相同,但所起的作用与传址调用相同。引用调用比传址调用更简洁直观,也更好理解,同时又能完成传址调用的功能,因此,C+建议用引用传递方式代替传地址方式。 【例2.20】使用传址调用实现两个变量交换数据。 【例2.21】使用引用调用实现两个变量交换数据。 使用引用作函数参数时,调用函数的实参必须是变量。 3. 引用作为函数的返回值 函数可以返回一个引用,将函数说明为返回一个引用的主要目的是为了将该函数用在赋值运算符的左边。,30,2.5 函数,【例2.22】函数返回引用示例。 由于自动变量的生存期仅限于函数内部,当函数返回时,自动变量就消失了。在定义返回引用的函数时,注意不要返回对该函数内的自动变量的引用。 例:函数返回引用的示例(ch02_20.cpp) 例:从键盘上输入一些数字和字符,编程统计其中数字字符的个数和非数字字符的个数。(ch02_21.cpp),

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1