数据结构课件:C++ 编程 简介

上传人:ni****g 文档编号:569241228 上传时间:2024-07-28 格式:PPT 页数:105 大小:406.50KB
返回 下载 相关 举报
数据结构课件:C++ 编程 简介_第1页
第1页 / 共105页
数据结构课件:C++ 编程 简介_第2页
第2页 / 共105页
数据结构课件:C++ 编程 简介_第3页
第3页 / 共105页
数据结构课件:C++ 编程 简介_第4页
第4页 / 共105页
数据结构课件:C++ 编程 简介_第5页
第5页 / 共105页
点击查看更多>>
资源描述

《数据结构课件:C++ 编程 简介》由会员分享,可在线阅读,更多相关《数据结构课件:C++ 编程 简介(105页珍藏版)》请在金锄头文库上搜索。

1、1 1nC+语言的概要语言的概要n类、对象、构造函数与析构函数类、对象、构造函数与析构函数n输入输入/输出输出n函数、参数传递与函数返回值函数、参数传递与函数返回值n函数名重载与操作符重载函数名重载与操作符重载n动态存储分配动态存储分配n友元函数与内联函数友元函数与内联函数n结构、联合与类结构、联合与类C+ 编程编程 简介简介2 2C+语言概要语言概要nC+源于源于C语言。语言。n1970年,两位程序员年,两位程序员Brian Kernighan和和Dennis Ritchie首创了一种新的程序设计语言,取名为首创了一种新的程序设计语言,取名为C语言。语言。n设计设计C语言的最初目的是编写操作

2、系统。由于其语言的最初目的是编写操作系统。由于其简单、灵活的特点,简单、灵活的特点,C语言很快就被用于编写各语言很快就被用于编写各种不同类型的程序,从而成为世界上最流行的语种不同类型的程序,从而成为世界上最流行的语言之一。言之一。3 3nC 语言是一个面向过程的语言语言是一个面向过程的语言。随着软件开发。随着软件开发技术的进步技术的进步, 程序员们最终发现程序员们最终发现, 把数据和施加把数据和施加在其上的操作结合起来在其上的操作结合起来,会得到更易于理解的,会得到更易于理解的程序,由此产生了面向对象的程序设计思想。程序,由此产生了面向对象的程序设计思想。n1980年代初,美国年代初,美国 A

3、T & T 贝尔实验室的贝尔实验室的Bjarne Stroustrup设计并实现了设计并实现了C语言的扩充、改进版语言的扩充、改进版本,本,C+语言诞生了!语言诞生了!nC+改进了改进了C的不足之处的不足之处,增加了对面向对象的增加了对面向对象的程序设计的支持程序设计的支持,在改进的同时,保持了,在改进的同时,保持了C的简的简洁性和高效性。洁性和高效性。4 4/一个简单的一个简单的C+程序程序/* 一个简单的一个简单的C+程序,该程序在标准输出设备程序,该程序在标准输出设备上输出一句问候语上输出一句问候语“hello” */#include int main() cout hello!;ret

4、urn 0;/ /正常返回正常返回正常返回正常返回n这是一个只包含一个函数的程序,程序的基本这是一个只包含一个函数的程序,程序的基本元素是数据说明、函数和注释。元素是数据说明、函数和注释。5 5注释注释nC+的第一次注释格式源于的第一次注释格式源于C语言。注释开始于语言。注释开始于“/*”,结束于,结束于“*/”,在两者之间的任何内容,在两者之间的任何内容,包括换行符都被编译器忽略。包括换行符都被编译器忽略。n注意注释符对不可以嵌套。注意注释符对不可以嵌套。n第一种注释符以第一种注释符以“/”开头,它是单行注释符,开头,它是单行注释符,在它同一行右侧的任何信息都将被认为是注释而在它同一行右侧的

5、任何信息都将被认为是注释而由编译器略去。由编译器略去。n注意:上面两种注释符的两个标志符注意:上面两种注释符的两个标志符/和和*,/和和/之之间不可以分开。间不可以分开。6 6#include 语句语句nC+将一些标准函数和变量说明放在头文件中。将一些标准函数和变量说明放在头文件中。头文件中保存所有与标准函数或变量相关的信息,头文件中保存所有与标准函数或变量相关的信息,为了使用头文件中定义的变量和函数,必须将相为了使用头文件中定义的变量和函数,必须将相应的头文件应的头文件include进主程序,作为程序的一部分进主程序,作为程序的一部分进行编译。进行编译。n用户也可以定义自己的头文件,把一些相

6、关的函用户也可以定义自己的头文件,把一些相关的函数和变量组织在一个文件中,当另外的程序要用数和变量组织在一个文件中,当另外的程序要用到这些函数和变量时,可以将该文件作为头文件到这些函数和变量时,可以将该文件作为头文件include进来。进来。7 7n#include指令有两种格式:指令有两种格式: #include #include “头文件名头文件名”n第一种文件名在第一种文件名在 中指定中指定, 表示该文件表示该文件存放存放于系统设定的子目录中于系统设定的子目录中, 这类文件一般是由系这类文件一般是由系统给出的统给出的, 并已经过编译。并已经过编译。n第二种文件名在第二种文件名在 “” 中

7、给出,表示该文件中给出,表示该文件存存放在当前目录中放在当前目录中, 这些头文件通常由用户自己这些头文件通常由用户自己给出。给出。n头文件中可包含其它头文件头文件中可包含其它头文件, 即即 #include 可以直可以直接嵌套。接嵌套。8 8nC+源程序中还可包括各种编译命令源程序中还可包括各种编译命令, 这些命令被这些命令被称为预处理指令称为预处理指令, 常用的除常用的除 #include外外, 还有条件还有条件预处理指令预处理指令 #if、#ifndef 和和#endif 等和宏替换指等和宏替换指令令 #define。n预处理命令对编译器起作用预处理命令对编译器起作用, 它指示编译器在正它

8、指示编译器在正式编译前做一些预先处理。式编译前做一些预先处理。#include 命令将指示命令将指示编译器将其后所跟的文件内容插入到当前文件中;编译器将其后所跟的文件内容插入到当前文件中;#define 定义一个常量或替换宏,它指示编译器在定义一个常量或替换宏,它指示编译器在使用该常量或宏的地方替换为其实际内容;使用该常量或宏的地方替换为其实际内容;#if、#ifndef和和 #endif 指示编译器做条件编译。指示编译器做条件编译。9 9n#define 用来定义一个常量或替换宏用来定义一个常量或替换宏, 如:如: #define size 20 /定义一个常量定义一个常量size,其值永远

9、为,其值永远为20 #define MAX(x, y) (x y) ? y : x) /求求x, y中的最大值中的最大值n经过预编译后经过预编译后, 程序中所有出现程序中所有出现 size 和和 MAX(x, y) 之处都会被之处都会被 20 和和 (x y) ? y : x) 代替,如:代替,如: int arraysize;int i = MAX(4, 55);n经预编译后会变为经预编译后会变为 int array20; int i = (4 55) ? 55 : 4);1010函数原型函数原型n下面的程序给出了典型的下面的程序给出了典型的 C 程序结构,它是程序结构,它是“Hello,

10、world”程序的变型。程序的变型。n这个程序由三个文件组成:这个程序由三个文件组成: /* File: hello.h */ char *hello( );/* File: hello.c */# include /*包括包括sprintf ( )的原型的原型*/# include /*包括包括malloc( )的原型的原型*/# include /*包括包括strlen( )的原型的原型*/ # include hello.h /*包括包括hello( )的原型的原型*/1111char *hello(name)char *name; char *value;/*返回串 Hello, na

11、me. */ value = (char *)(malloc(9+strlen(name); sprintf (value, Hello, %s., name); return value;/* File: main.c */# include /*包括包括printf ( )的原型的原型*/# include hello.h /*包括包括hello( )的原型的原型*/1212main(argc, argv)int argc;char *argv ; printf (%s, hello(world);n头文件名字的后缀用头文件名字的后缀用“.h”表示,程序文件名字表示,程序文件名字的后缀用的

12、后缀用“.c”表示。表示。nhello.h:包含:包含 hello函数的原型。函数的原型。main函数可通过函数可通过“# include”定向到该原型的定义文件,取得对原定向到该原型的定义文件,取得对原型的访问性。型的访问性。1313nhello.c:这是:这是hello函数的定义文件。它通过一个函数的定义文件。它通过一个string类型的形式参数类型的形式参数接受需要打印的接受需要打印的 串串, 返回返回一个一个string类型的值类型的值作为打印串。返回类型必须作为打印串。返回类型必须与在与在#include定向的定向的“.h”文件中所给出的原型文件中所给出的原型的类型匹配。的类型匹配。

13、nmain.c:这是打印:这是打印“Hello, world”的主程序,它构的主程序,它构造和返回一个欢迎词字符串,其结果通过函数造和返回一个欢迎词字符串,其结果通过函数printf打印出来。打印出来。nC 把函数和数据定义放在后缀为把函数和数据定义放在后缀为“.c”的代码文的代码文件中。在各代码文件中使用后缀为件中。在各代码文件中使用后缀为“.h”的的include文件文件, 定义定义对其它各模块的调用接口对其它各模块的调用接口。1414C+的函数特征的函数特征n特征是函数参数表的描述特征是函数参数表的描述。n利用特征信息可进行严格的类型检查。它允许编利用特征信息可进行严格的类型检查。它允许

14、编译器检验实际参数的数目是否正确,对应的形参译器检验实际参数的数目是否正确,对应的形参和实参是否相容,函数返回的类型与函数调用的和实参是否相容,函数返回的类型与函数调用的环境是否相容。环境是否相容。n它克服了在许多它克服了在许多 C 程序的开发中,由于程序的开发中,由于在在C 原原型中没有定义参数的类型和数量型中没有定义参数的类型和数量,而造成的,而造成的实参实参和形参之间不匹配和形参之间不匹配,函数返回类型与使用之间不函数返回类型与使用之间不匹配匹配等许多缺陷。等许多缺陷。1515n现用现用 C+ 语句改写前面的语句改写前面的 C 程序。程序。nC+ 程序在程序在“.h”文件中对文件中对 h

15、ello( ) 使用了函数使用了函数特征。对于特征。对于 hello( ) 的原型的原型: u不要求形式参数的名字出现在特征中不要求形式参数的名字出现在特征中u参数的数目和类型,以及返回类型,都完整地参数的数目和类型,以及返回类型,都完整地在函数说明中定义在函数说明中定义nC+允许在函数说明时允许在函数说明时, 在括号内直接声明形式在括号内直接声明形式参数的类型。参数的类型。1616/* File: hello.h */char *hello(char *); /* File: hello.cpp */# include /包含函数sprintf( )的原型 # include /包含函数st

16、rlen( )的原型# include “hello.h” /包含函数hello( )的原型char *hello(char *name) char *value = new char 9 + strlen(name); sprintf (value, Hello, %s., name);return value;1717/* File: main.cpp */# include /说明输出流对象cout# include hello.h /包含函数hello( )的原型main(int argc, char *argv ) cout hello(world); 1818C+的数据声明的数据声

17、明nC+的数据声明的数据声明将数据名与数据类型联系起来将数据名与数据类型联系起来。其主要形式有:其主要形式有:u常数值常数值:如:如25, 13.4, “value is”, 它们的内容它们的内容保持不变。保持不变。u常量常量:数据声明时在变量名前冠以保留字:数据声明时在变量名前冠以保留字const,如,如 const int MAX = 500, 可定义可定义 一个常一个常量。其内容在声明时给定,在声明它的程序运量。其内容在声明时给定,在声明它的程序运行时内容再赋值无效。行时内容再赋值无效。u变量变量:数据类型的实例:数据类型的实例, 在程序执行时可以改在程序执行时可以改变其内容。变其内容。

18、 1919nC+提供两大类数据类型:提供两大类数据类型:基本数据类型基本数据类型和和复复合数据类型合数据类型。n基本数据类型基本数据类型有有 5 种:种:整型整型(int)、浮点型浮点型(float)、字符型字符型(char)、双精度浮点型双精度浮点型(double)和和无值无值(void)。n复合数据类型复合数据类型包括包括结构结构(struct)、联合联合(union)、位域位域、枚举枚举(enum)、类类(class)和和用户自定义类型用户自定义类型。n还有由基本数据类型和复合数据类型引申而来还有由基本数据类型和复合数据类型引申而来的数据类型,包括的数据类型,包括数组数组、指针指针、引用

19、引用等。等。2020u枚举枚举:是声明一个整型常数序列的方式。例如:是声明一个整型常数序列的方式。例如, 在程序开头做如下声明在程序开头做如下声明 enum Boolean FALSE, TRUE 则建立一个则建立一个Boolean类型。类型。FALSE, TRUE 都是都是Boolean类型整型常数类型整型常数, 默认值默认值 0 和和 1。u指针指针:存放对象的存储地址,例如:存放对象的存储地址,例如 int i = 5; int *np; /np为一个指向整型量的指针为一个指向整型量的指针 np = &i; /把整型变量把整型变量 i 的地址赋给它的地址赋给它 /np 成为指向整型变量成

20、为指向整型变量 i 的指针的指针 int k = *np; /k中存入中存入np所指地址所指地址 i 的内容的内容2121u引引用用:它它用用来来给给一一个个对对象象提提供供一一个个替替代代的的名名字字。例如例如 int i = 5; int& j = i; i = 7; printf ( “i = %d, j = %d”, i, j ); 此此时时, j 是是一一个个引引用用类类型型, 它它代代表表 i 的的一一个个替替代代名名。当当 i 的的值值改改变变时时, j 的的值值也也跟跟着着改改变变。当当 printf 语句执行后语句执行后, 打印出的打印出的 i 和和 j 的值都是的值都是7。

21、2222C+的作用域的作用域n在在C+中中, 每个变量都有一个作用域。区分一个每个变量都有一个作用域。区分一个变量时要同时考虑变量名及其作用域。变量时要同时考虑变量名及其作用域。n在函数定义中声明的变量在函数定义中声明的变量, 仅能在该函数内部有仅能在该函数内部有效使用效使用n在类定义中声明的变量在类定义中声明的变量, 仅能在该类内部有效使仅能在该类内部有效使用用n在一个段中声明的名字在一个段中声明的名字, 也仅能在该段及其子段也仅能在该段及其子段中有效使用。中有效使用。2323n在在整整个个程程序序各各处处都都能能访访问问的的变变量量叫叫做做全全局局变变量量。如如果果一一个个全全局局变变量量

22、在在文文件件1中中声声明明,在在文文件件2中中使使用用,那那么么在在文文件件2中中必必须须使使用用保保留留字字extern对对该该变变量进行声明。量进行声明。n如如果果在在构构成成一一个个程程序序的的两两个个文文件件中中分分别别声声明明了了两两个个同同名名的的全全局局变变量量,这这两两个个变变量量分分别别代代表表两两个个不不同同实实体体,此此时时需需在在两两个个文文件件中中分分别别使使用用保保留留字字static对变量进行声明。对变量进行声明。n如如果果一一个个段段中中的的局局部部变变量量与与一一个个全全局局变变量量同同名名,且且还还要要在在此此段段中中使使用用该该全全局局变变量量,此此时时需

23、需利利用用域域操作符操作符:访问该全局变量。访问该全局变量。2424表达式与操作符表达式与操作符n表达式是用来说明简单计算的。表达式是用来说明简单计算的。C+中的表达式中的表达式由由操作数操作数和和操作符操作符组成,它将操作符施加于操作组成,它将操作符施加于操作数,最终得到一个结果。结果的数据类型由参加数,最终得到一个结果。结果的数据类型由参加运算的数据类型决定。运算的数据类型决定。 a a + b * c + 200 2 * * R (x + y ) / (a b ) n其中操作符执行的先后顺序由它们的优先级和结其中操作符执行的先后顺序由它们的优先级和结合性决定。合性决定。2525nC+提供

24、了很多预定义的操作符,程序员也可以提供了很多预定义的操作符,程序员也可以重新定义这些操作符。重新定义这些操作符。n算术操作符:算术操作符:+、- -、*、/、%。其中。其中*、/、%优优先于先于+、- -。括号用来改变计算顺序。计算时,。括号用来改变计算顺序。计算时,先先计算括号内表达式的值计算括号内表达式的值,再将计算结果与括号外再将计算结果与括号外的数一起计算的数一起计算,如,如: 4 *(1 + 2)= 4 * 3 = 12n取模操作符(取模操作符(%)用于计算两整数相除后得到的)用于计算两整数相除后得到的余数,如:余数,如:22 % 7 = 1。n注意,注意,%只能用于整数相除,不能对

25、浮点数操作。只能用于整数相除,不能对浮点数操作。2626n赋值操作符赋值操作符 “=” 将其右侧的表达式求出结果将其右侧的表达式求出结果, 赋给其左侧的变量。例如:赋给其左侧的变量。例如: int value; value = (2 + 3) * 4;n赋值表达式运算的结果是右运算元的值赋值表达式运算的结果是右运算元的值, 而结果类而结果类型是左运算元的数据类型型是左运算元的数据类型, 例如:例如: value = 2.8 * 4 /结果为结果为11, 而不是而不是11.2n可以连续赋值可以连续赋值, 但必须保证各运算元的类型相同。但必须保证各运算元的类型相同。它的处理结果是每个运算元的对象值

26、都为最右侧它的处理结果是每个运算元的对象值都为最右侧的运算元值,例如:的运算元值,例如: int i, j; i = j = 0; / i, j都赋为都赋为02727n复合操作符:复合操作符:u加加a += b 等价于等价于a = a + bu减减 a - -= b 等价于等价于a = a - - bu乘乘a *= b 等价于等价于a = a * bu除除 a /= b 等价于等价于a = a / bu取模取模 a %= b 等价于等价于a = a % bu左移一位左移一位 a = b 等价于等价于a = a = b 等价于等价于a = a bu按位与按位与 a &= b 等价于等价于a =

27、a & bu按位异或按位异或 a = b 等价于等价于a = a bu按位或按位或 a |= b 等价于等价于a = a | b2828自增,自减操作符自增,自减操作符n自增自增(+), 自减自减(-) : a+ 等价于等价于 a = a + 1 a-等价于等价于 a = a - - 1n自增、自减符号既可位于变量的前面,也可位于自增、自减符号既可位于变量的前面,也可位于变量的后面。前缀变量的后面。前缀+表示先将其后的变量值增表示先将其后的变量值增1,然后将增然后将增1后的变量参与表达式运算;而后缀后的变量参与表达式运算;而后缀+表表示将其前面的变量先参与表达式运算,然后变量示将其前面的变量先

28、参与表达式运算,然后变量本身增本身增1。 n在单独作为一个表达式时,在单独作为一个表达式时,+a和和a+(或(或-a和和a- - - )效果一样,都是将变量)效果一样,都是将变量a自增自增1。2929n若自增若自增 (+), 自减自减 (-) 符作为一个复杂表达式的符作为一个复杂表达式的一部分时,如:一部分时,如:(a+) + b 和和 (+a) + b效果就不一效果就不一样:在样:在a、b 初值均为初值均为 1 的条件下结果不同。的条件下结果不同。3030条件操作符条件操作符n条件操作符条件操作符是是C+中唯一的具有三个运算元的操中唯一的具有三个运算元的操作符,其形式为:作符,其形式为: 表

29、达式表达式1 ? 表达式表达式2 : 表达式表达式3n它的运算方式为它的运算方式为: 先计算表达式先计算表达式1的值的值, 如果其值如果其值为非零为非零 (true),则,则 表达式表达式2 的值就是整个表达式的值就是整个表达式的最终结果的最终结果, 否则否则 表达式表达式3 的值就是整个表达式的值就是整个表达式的值。常见的一个例子为:的值。常见的一个例子为: #define MIN (x, y) (x y) ? x : y) n上例定义了一个求两个数上例定义了一个求两个数 x 和和 y 中的最小值的宏中的最小值的宏, 其中决定哪一个是最小值用了条件操作符。其中决定哪一个是最小值用了条件操作符

30、。3131语句语句n语句是语句是C+程序中最小的可执行单元。一条语句程序中最小的可执行单元。一条语句由一个分号结束。由一个分号结束。n语句可以是简单语句,也可以是复杂语句。语句可以是简单语句,也可以是复杂语句。 int radius; 是声明语句;是声明语句; circum = 2 * PI * radius; 是表达式语句是表达式语句; 它由一个表达式后接一个分号形成。它由一个表达式后接一个分号形成。 cout Value;n等都是简单语句。这些语句告知计算机该如何定等都是简单语句。这些语句告知计算机该如何定义变量以及如何执行程序。义变量以及如何执行程序。3232n除简单语句外,除简单语句外

31、,C+还定义了一些可以控制程序还定义了一些可以控制程序执行流程的语句执行流程的语句, 这些语句提供对控制流的分支这些语句提供对控制流的分支和循环功能。和循环功能。nC+中默认中默认, 语句都是顺序执行语句都是顺序执行, 如果碰到如果碰到分支分支或或循环语句循环语句, 顺序执行的规则就要改变。此外,顺序执行的规则就要改变。此外,C+中还有一些中还有一些跳转语句跳转语句。n有时还有一些语句需要合在一起作为语法结构中有时还有一些语句需要合在一起作为语法结构中的一条语句,这时需要将这些语句用大括号括起的一条语句,这时需要将这些语句用大括号括起来,形成一个来,形成一个复合语句复合语句,复合语句不需要以分

32、号,复合语句不需要以分号终结。终结。3333if 语句语句 (二分支选择型)nif 语句的一般格式为:语句的一般格式为: if ( 条件表达式 ) 语句;n如果如果条件表达式的结果为的结果为true (非零值非零值),则执行,则执行语句语句语句,否则跳过这段,否则跳过这段语句。n语句可以有多条可以有多条, 这时需用大括号这时需用大括号 将这些语将这些语句括起来句括起来, 形成一条形成一条复合语句复合语句。 if (条件表达式) 语句1; 语句2; 3434n如果希望在条件满足和不满足时分别执行不同语如果希望在条件满足和不满足时分别执行不同语句,则用句,则用 else 引入条件不满足时的语句引入

33、条件不满足时的语句: if (条件表达式) 语句1; else 语句2;n语句1,语句2也可以是复合语句,不过这时的语也可以是复合语句,不过这时的语句不需以分号结尾。句不需以分号结尾。n语句1、语句2中又可以出现中又可以出现 if 语句语句,所以,所以 if 语句语句可以嵌套,不过这时容易带来语义的歧义性。可以嵌套,不过这时容易带来语义的歧义性。3535例例例例 if ( ch = 0 ) if ( ch = 9 ) cout “这是一个数字!”; else cout = 0 ) if ( ch = 9 ) cout “这是一个数字!”; else cout x2) int temp = x1

34、; x1 = x2; x2 = temp; 3737Switch 语句语句 (多分支选择型) nswitch 语句用于有多重选择的场合语句用于有多重选择的场合, 形式为形式为 switch (表达式) case 值1: 语句组; break; /break可没有可没有 case 值2: 语句组; break; /break可没有可没有 case 值n: 语句组; break; /break可没有可没有 default: 语句组; ;n注意注意 case 后的数值必须是一个整型的常量表达式,后的数值必须是一个整型的常量表达式,且任意两个选择项不能相等。且任意两个选择项不能相等。3838n当当 s

35、witch 语句执行时语句执行时, 先计算其后的表达式值先计算其后的表达式值, 将表达式的值与后面各将表达式的值与后面各 case 关键字后所跟选择常关键字后所跟选择常量依次比较。量依次比较。n如果与某一选择常量相等,则执行其冒号后跟的如果与某一选择常量相等,则执行其冒号后跟的语句。如果和任何选择常量都不等语句。如果和任何选择常量都不等, 则执行则执行 default 子句后的语句子句后的语句 (如果如果 default 子句存在子句存在) 或或什么也不做什么也不做 (如果如果 default 子句不存在子句不存在)。n每个每个case子句都以子句都以 break 语句结束。语句结束。brea

36、k 子句子句的作用是终止当前的作用是终止当前 switch 语句的执行。语句的执行。3939n例例: 统计文章中各字母出现的次数。程序每读入统计文章中各字母出现的次数。程序每读入一个字符一个字符 ch, 根据它的值根据它的值, 将相应的计数值增将相应的计数值增 1, 假定英文大小写不区分。假定英文大小写不区分。 int aCnt = 0 , bCnt = 0 , , zCnt = 0; switch (ch) case a:case A: aCnt+; break; case b:case B: bCnt+; break; / case z: case Z: zCnt+; break; 404

37、0循环语句循环语句n循环语句提供重复处理的能力循环语句提供重复处理的能力, 当某一特定条件当某一特定条件为为 true 时时, 循环语句就重复执行循环语句就重复执行, 并且每循环一并且每循环一次次, 就会测试一下循环条件就会测试一下循环条件, 如果为如果为 false, 则循环则循环结束结束, 否则继续循环。否则继续循环。nC+支持三种格式的循环语句:支持三种格式的循环语句:while、 do和和 for 语句。三者可以完成类似的功能,不同的是它们语句。三者可以完成类似的功能,不同的是它们控制循环的方式。控制循环的方式。4141while 语句语句 (先判断循环先判断循环)nwhile 语句的

38、一般形式为:语句的一般形式为: while (条件表达式) 循环体语句 nwhile 循环先计算循环先计算条件表达式, 当当条件表达式的运的运算结果为算结果为 true 时时, 就执行就执行循环体语句。执行一次。执行一次循环体语句后后, 就会重新计算就会重新计算条件表达式, 当表当表达式的值为达式的值为 false 时,循环结束。时,循环结束。nwhile 循环可能一次也不执行。循环可能一次也不执行。4242n下列程序计算输入文件的字符数,并在标准输出下列程序计算输入文件的字符数,并在标准输出上输出文件内容:上输出文件内容: #include #include main() char ch;

39、int count = 0; /字符数计数器字符数计数器 ifstream infile (data.in, ios:in); while ( infile & infile.get (ch) ) cout ch; count+; cout count : count; return (0); 4343do 语句语句 (后判断循环后判断循环)ndo 语句的一般形式为:语句的一般形式为: do 循环体语句循环体语句 while (条件表达式);ndo 语句先执行语句先执行 循环体语句, 然后计算条件表达然后计算条件表达式是否为式是否为 true, 如果是如果是, 则继续执行循环则继续执行循环,

40、否则否则结束循环。结束循环。n与与 while 语句不同的是,语句不同的是,do 循环中的循环中的循环体语句至少执行一次至少执行一次, 而而 while 语句当条件第一次不满语句当条件第一次不满足时足时循环体语句一次也不执行。一次也不执行。4444n对字符计数的程序也可以用对字符计数的程序也可以用do语句实现。语句实现。 # include # include int main() char ch; int count = 0; /字符个数计数器字符个数计数器 ifstream infile (data.in, ios:in); if ( infile & infile.get (ch) )

41、do cout ch; count+; while ( infile & infile.get (ch) ); cout count : count; return (0); 4545for 语句语句nfor 语句用于预先知道循环次数的情况语句用于预先知道循环次数的情况, 其一般形其一般形式为:式为: for ( 初始化语句; 表达式1; 表达式2 ) 循环体语句;n其中其中初始化语句可以是一条可以是一条声明声明或或表达式表达式,用于,用于对循环控制变量进行初始化或赋值。对循环控制变量进行初始化或赋值。n表达式 1 用于控制循环结束用于控制循环结束, 当它的值为当它的值为 true 时时, 继

42、续循环继续循环, 为为false 时终止循环。时终止循环。n表达式 2 在每次循环执行后改变循环控制变量的在每次循环执行后改变循环控制变量的值。值。4646n具体来说,具体来说,for 循环的执行过程为:循环的执行过程为: 执行执行 初始化语句; 计算计算 表达式 1 的值;的值; 如果如果 表达式 1 的值为的值为true: 先执行先执行循环体语句; 再执行再执行表达式2; 然后转向步骤然后转向步骤 ; 如果如果表达式表达式1的值为的值为false, 则结束循环。则结束循环。4747n例例: 数组初始化数组初始化 for ( int i = 0; i size; i+ ) arrayi =

43、0; arrayi = 0i+i sizei = 0TrueFalse4848跳转语句跳转语句n跳转语句将中断程序的执行,跳转到其他地方继跳转语句将中断程序的执行,跳转到其他地方继续执行。包括续执行。包括break、continue和和goto语句。语句。break语句语句nbreak语句将使程序从当前的循环语句语句将使程序从当前的循环语句 ( do, while, for ) 内跳转出来内跳转出来, 接着执行循环语句后面的语句。接着执行循环语句后面的语句。switch 语句中也用到了语句中也用到了 break 语句,这时它表示语句,这时它表示终止当前终止当前 switch 语句的执行,接着运

44、行语句的执行,接着运行switch 后后的语句。的语句。4949continue语句语句ncontinue语句也用于循环语句语句也用于循环语句, 它不是结束循环它不是结束循环, 而是而是结束循环语句的当前一次循环结束循环语句的当前一次循环,接着执行下,接着执行下一次循环。在一次循环。在 while 和和 do 循环中循环中, 执行控制权转执行控制权转至对至对条件表达式条件表达式的判断,在的判断,在 for 循环循环中中, 转去执转去执行行表达式表达式2。 goto语句语句ngoto 语句语句无条件转移无条件转移程序的执行控制,它总是与程序的执行控制,它总是与一标号(一标号(label)相匹配,

45、其形式为)相匹配,其形式为: goto 标号标号; 5050n标号是一个用户自定义的标识符标号是一个用户自定义的标识符, 它可以处于它可以处于goto语句的前面,也可以处于其后面,但是标号语句的前面,也可以处于其后面,但是标号必须与必须与goto语句处于同一个函数中。语句处于同一个函数中。n标号定义时,由一个标识符后面跟一冒号组成,标号定义时,由一个标识符后面跟一冒号组成,如:如: goto next; next: 语句语句 /标号标号5151n下面程序要从键盘读入用户输入的数下面程序要从键盘读入用户输入的数, 对其求和对其求和, 当用户输入数当用户输入数0时时, 表示输入结束。表示输入结束。

46、 #include int main() int sum = 0; int iVal; while (1) /永远循环永远循环 cout iVal; if ( iVal = 0 ) break; /循环出口条件循环出口条件 sum += iVal; cout ”The sum : ” sum n; return 0; 5252n下面程序对用户输入的所有正数求和下面程序对用户输入的所有正数求和, 如果输入如果输入的是负数的是负数, 则忽略该数。则忽略该数。 int sum = 0; int iVal = 1; while ( iVal != 0) cout iVal; if ( iVal 0 )

47、 continue; sum += iVal; cout “The sum: ” sum ( Point ); /点比较 int operator ( istream&, Point& ); /输入友元函数 friend ostream& operator ( ostream&, Point& ); /输出友元函数;#endif 5757n为了存取一个点的为了存取一个点的 x, y 分量分量, 类提供了两个函数类提供了两个函数get_x, get_y。这样可用。这样可用 private 域来保护数据的表域来保护数据的表示示, 防止类的用户直接使用数据的内部表示来编防止类的用户直接使用数据的内部

48、表示来编写代码,通过使用存取函数来操作数据来维持类写代码,通过使用存取函数来操作数据来维持类的抽象性。的抽象性。nprivate 是声明默认的存取级别。是声明默认的存取级别。n系统开发时系统开发时, 把类的声明放在头文件中把类的声明放在头文件中, 成员函数成员函数的实现放在源程序文件中。在源程序文件中函数的实现放在源程序文件中。在源程序文件中函数的实现通过作用域设定命令的实现通过作用域设定命令 “:” 而被归属到某而被归属到某一个类。一个类。5858例,对于例,对于 Point 类的输出类的输出友元友元函数的实现可以在源函数的实现可以在源程序文件中给出,形为:程序文件中给出,形为: ostre

49、am & operator (ostream& strm, Point p) return strm ( p.get_x ( ) , p.get_y () ); 这个函数把点这个函数把点 p 的值以的值以 “x, y” 的格式送到的格式送到 strm 指指明的输出流中去。明的输出流中去。5959C+中的对象中的对象n建立类的对象(亦称为建立类的对象(亦称为实例化实例化)时采用的方式类)时采用的方式类似于定义似于定义 C 变量的方式,可以变量的方式,可以自动地自动地,或,或静态地静态地, 或通过或通过动态分配动态分配来建立。来建立。n建立一个建立一个 Point 类实例的语句是:类实例的语句是:

50、 Point p (6, 3); 自动地自动地 Point q; 自动地自动地 static Point s (3, 4); 静态地静态地 Point *t = new Point(1, 1); 通过动态分配通过动态分配n对象对象 p、q 和和 s 都是都是Point类的对象。类的对象。6060构造函数构造函数n当遇到以上的每一个语句时,将隐式地调用一个当遇到以上的每一个语句时,将隐式地调用一个构造构造 (constructor) 函数,这个构造函数属于一个函数,这个构造函数属于一个与它同名的类。与它同名的类。n在在Point类的定义中声明了两个构造函数,构造函类的定义中声明了两个构造函数,构

51、造函数的参数用于初始化表达式的值。数的参数用于初始化表达式的值。n例如,当使用声明例如,当使用声明 Point p(6, 3) 建立建立 Point 类的对类的对象象 p 时,调用了构造函数时,调用了构造函数 Point (int, int);通过以;通过以下函数定义下函数定义, 将其将其 x, y 分量设定为分量设定为 6, 3 : Point : Point (int a,int b) x = a; y = b; Point : Point (int a,int b) : x(a), y(b) 6161n构造函数可以定义默认值。例如构造函数可以定义默认值。例如 Point : Point

52、( int a = 0, int b = 0 ) : x(a), y(b) n当定义实例时给定初始值当定义实例时给定初始值, 则该实例以给定初则该实例以给定初始值来初始化其数据成员始值来初始化其数据成员 Point p(6, 3); 则有则有 x = a = 6, y = b = 3n当定义实例时未给出初始值。则该实例以默认当定义实例时未给出初始值。则该实例以默认值来初始化其数据成员值来初始化其数据成员 Point q; 则有则有 x = a = 0, y = b = 06262析构函数析构函数n当要放弃对象时,需隐式地调用另一个函数,叫做当要放弃对象时,需隐式地调用另一个函数,叫做析构析构

53、(destructor) 函数函数,它属于名字相同的类,它属于名字相同的类, 但但在名字前面加上了一个在名字前面加上了一个“”。例如。例如Point。n为一个类可定义几个构造函数,但只能定义为一个类可定义几个构造函数,但只能定义 一个一个析构函数。当控制要退出自动变量的作用域时析构函数。当控制要退出自动变量的作用域时, 或或当通过当通过 delete 命令释放一个动态分配的变量时命令释放一个动态分配的变量时, 就就要调用析构函数。当要调用析构函数。当main函数执行结束时,将释函数执行结束时,将释放静态声明的变量。放静态声明的变量。n一个析构函数用于一个析构函数用于在删除一个类的对象在删除一个

54、类的对象时做清除工时做清除工作。作。6363C+的输入的输入/输出输出n在在C+中执行输入中执行输入/输出操作,需用输出操作,需用 #include 预处预处理指令包括一个理指令包括一个 头文件。用它可支头文件。用它可支持持C+的流的流(stream)操作。操作。n“流流”是个简单的字符序列。在是个简单的字符序列。在C+中有两个预中有两个预定义的类定义的类 istream 和和 ostream,它们定义了输入,它们定义了输入流和输出流。流和输出流。n基本输入基本输入/输出方式:输出方式: 键盘屏幕输入键盘屏幕输入/输出输出 文件输入文件输入/输出输出6464键盘屏幕输入键盘屏幕输入/ /输出输

55、出n在在C中有用于定向到键盘输入设备、屏幕输出设中有用于定向到键盘输入设备、屏幕输出设备和错误文件的命令备和错误文件的命令 stdin、stdout 和和 stderr。n在在C+中用中用 cin,cout 和和 cerr 来定义键盘输入类、来定义键盘输入类、屏幕输出类和错误信息输出类。屏幕输出类和错误信息输出类。n操作符操作符 用于写出类用于写出类 ostream 的一个对象,对的一个对象,对于一系列输出对象,可用于一系列输出对象,可用 用于读入类用于读入类 istream 的一个对象。的一个对象。6565n在下面程序中使用了流在下面程序中使用了流 cin ,相继从标准输入,相继从标准输入设

56、备上输入两个整型变量设备上输入两个整型变量 a 和和 b, 并将它们打印到并将它们打印到标准输出设备上。标准输出设备上。 #include void main ( ) int a, b; cin a b; cout ”a : n f : f endl; n在输出语句中最后输出的在输出语句中最后输出的 endl 是是C+的的IO操作操作符符, 它的用途是输出一个换行符并清空流。它的用途是输出一个换行符并清空流。6666nC+中的输入中的输入/输出可以是自由格式,程序员不输出可以是自由格式,程序员不需要使用格式化符号来指定输入输出项的类型需要使用格式化符号来指定输入输出项的类型和顺序。和顺序。n与

57、其它与其它 C+ 操作符一样,输入输出操作符能操作符一样,输入输出操作符能够被重载。够被重载。6767文件输入文件输入输出输出nC+中的文件输入输出方式如下所示。中的文件输入输出方式如下所示。n在程序开头必须用预处理指令在程序开头必须用预处理指令 #include 包含头文包含头文件件,它定义了类,它定义了类 ifstream、ofstream和和 fstream。n要创建一个要创建一个输入流输入流,必须声明它为,必须声明它为 ifstream 类的类的实例;要创建一个实例;要创建一个输出流输出流,必须声明它为,必须声明它为ofstream 类的实例。类的实例。n执行输入和输出操作的流执行输入

58、和输出操作的流必须声明它为必须声明它为 fstream类的实例类的实例6868#include #include #include void main ( ) ifstream inFile; /inFile为输入流对象 ofstream outFile; /outFile为输出流对象 outFile.open ( my.dat, ios : out ); /建立输出文件my.dat char univ = Tsinghua, name10; int course = 2401, number; outFile univ endl; /输出到my.dat outFile course endl

59、;6969 inFile.open(my.dat, ios:in | ios:nocreate); /打开输入文件my.dat if ( !inFile ) cerr “不能打开 my.dat” name c number; outFile name: name endl; outFile number: number b) return a; else return b;n在在C+中中所所有有函函数数都都有有一一个个返返回回值值,或或者者返返回回计计算结果,或者返回执行状态算结果,或者返回执行状态。7474n如果函数不需要返回值如果函数不需要返回值, 可使用可使用 void 来表示它的来表示

60、它的返回类型。函数的返回值通过函数体中的返回类型。函数的返回值通过函数体中的 return 语句返回。语句返回。nreturn 的作用是返回一个的作用是返回一个与返回类型相同类型与返回类型相同类型的的值,并中止函数的执行。值,并中止函数的执行。n函数返回时可以通过引用方式,参看下面程序函数返回时可以通过引用方式,参看下面程序, 此时在函数类型后面加上一此时在函数类型后面加上一 个个“&”。 #include char& replace (int m);char s80 = “Hello There”;7575main ( ) replace(5) = x; cout s; /用用x代替代替He

61、llo后面的空格后面的空格char& replace ( int m ) return sm; n函数函数replace( )的返回类型说明为返回一个字符的引的返回类型说明为返回一个字符的引用类型用类型, 在函数执行时返回在函数执行时返回参数参数 m 指定的指定的 s数组元数组元素素的值。的值。main ( )执行时把字符执行时把字符 “x” 送给送给s5。7676C+中的参数传递中的参数传递n函数调用时传送给形参表的实参必须与形参在类函数调用时传送给形参表的实参必须与形参在类型、个数、顺序上保持一致。型、个数、顺序上保持一致。n参数传递有两种方式。一种是参数传递有两种方式。一种是传值传值,这

62、是缺省的,这是缺省的参数传递方式参数传递方式; 一种是一种是引用类型引用类型。n使用使用传值传值方式时,方式时,把实参的值传送给函数局部工把实参的值传送给函数局部工作区相应的副本中作区相应的副本中,函数使用这个副本执行必要,函数使用这个副本执行必要的功能。这样,函数修改的是副本的值,的功能。这样,函数修改的是副本的值,实参的实参的值不变值不变。7777n使使用用引引用用类类型型方方式式传传递递时时, 需需将将形形参参声声明明为为引引用用类类型型,即即在在参参数数名名前前加加一一个个“&”。参参看看下下面面的的程序示例。程序示例。n当当一一个个实实参参与与一一个个引引用用型型形形参参结结合合时时

63、,被被传传递递的的不不是是实实参参的的值值,而而是是实实参参的的地地址址,函函数数通通过过地地址址存存取取被被引引用用的的实实参参。函函数数执执行行后后实实参参的的值值将将发发生生改变。改变。n当当一一个个函函数数的的返返回回值值多多于于一一个个时时, 其其中中一一个个可可由由return语语句句返返回回, 其其它它返返回回值值可可使使用用引引用用型型参参数数返回。返回。#include void swap (int& i, int& j);7878main ( ) int a = 1, b =2; cout a and b: a b n; swap ( a, b ); /调用时实际参数不需要

64、加调用时实际参数不需要加& cout a and b: a b n;void swap ( int& i, int& j ) /对换对换 i 与与 j 的内容的内容 int t = j; j = i; i = t; /不需要加不需要加 *7979n一一种种特特殊殊的的引引用用调调用用方方式式叫叫做做常常值值引引用用,其其格格式式为为 const Type& a,其其中中Type为为参参数数的的数数据据类类型型。在函数体中不能修改常值参数。在函数体中不能修改常值参数。n一一种种特特殊殊情情况况是是数数组组参参数数的的传传递递。数数组组作作为为形形参参可可按按传传值值方方式式声声明明,但但实实际际

65、采采用用引引用用方方式式传传递递,传传递递的的是是数数组组第第一一个个元元素素的的地地址址。在在函函数数体体内内对对形形参参的的数数组组所所做做的的任任何何改改变变都都将将反反映映到到作作为为实实参参的数组中。的数组中。n此此外外,在在参参数数表表中中一一般般按按形形如如 int R 的的形形式式声声明,因此需要显式地声明数组的大小。明,因此需要显式地声明数组的大小。8080n若传送的若传送的值参是一个对象值参是一个对象 (作为类的实例作为类的实例) 时时, 在函在函数中就创建了该对象的一个副本。在创建这个副数中就创建了该对象的一个副本。在创建这个副本时不调用该对象的构造函数,但在函数结束前本

66、时不调用该对象的构造函数,但在函数结束前要调用该副本的析构函数撤消这个副本。要调用该副本的析构函数撤消这个副本。n若若采用引用方式传递对象采用引用方式传递对象,在函数中不创建该对,在函数中不创建该对象的副本,也不存在最后撤消副本的问题。但是,象的副本,也不存在最后撤消副本的问题。但是,通过引用传递的是对象时,函数对对象的改变将通过引用传递的是对象时,函数对对象的改变将影响调用的对象影响调用的对象。8181 成员函数的返回值成员函数的返回值n当成员函数的返回值为当成员函数的返回值为传值方式传值方式时时, 允许改变该允许改变该对象的私有数据成员。对象的私有数据成员。n当成员函数的返回值为当成员函数

67、的返回值为常值传值方式常值传值方式时时, 需加需加 const 标识标识, 该对象的私有成员不能改变。该对象的私有成员不能改变。n当成员函数的返回值为当成员函数的返回值为引用方式引用方式时时, 该成员函数的该成员函数的返回值应返回值应是一个已存在变量是一个已存在变量(或对象或对象)的别名的别名。当。当该成员函数被重新赋值时该成员函数被重新赋值时, 其对应变量其对应变量(或对象或对象)的的值将改变。值将改变。n当成员函数的返回值为当成员函数的返回值为常值引用方式常值引用方式时时, 其其返回值返回值与引用方式的成员函数返回值类同与引用方式的成员函数返回值类同。但该成员函。但该成员函数不能改变该对象

68、的私有成员。数不能改变该对象的私有成员。8282n当成员函数返回值为当成员函数返回值为常值传值方式常值传值方式或或常值引用方式常值引用方式时时, const 标识符一般放在最后。标识符一般放在最后。 #include class Temperature private: float highTemp, lowTemp; /数据成员数据成员 public: Temperature (int hi, int lo) /构造函数构造函数 highTemp = hi; lowTemp = lo; void UpdateTemp(float temp); /传值返回传值返回 float GetHighT

69、emp( ) const; /常值返回常值返回8383 float GetLowTemp( ) const; /常值传值返回;void Temperature : UpdateTemp(float temp) if (temp highTemp) highTemp = temp; if (temp LowTemp) LowTemp = temp;float Temperature : GetHighTemp( ) const return highTemp;float Temperature : GetHighTemp( ) const return highTemp;8484C+中的函数名重

70、载中的函数名重载n函数名重载允许函数名重载允许C+程序中多个函数取相同的函数程序中多个函数取相同的函数名名, 但其形参或返回类型可以不同。但其形参或返回类型可以不同。n例如,例如,C标准函数库中有标准函数库中有3个标准函数个标准函数abs( )、labs( )和和fabs( ), 分别计算整型数、长整型数和双精度型分别计算整型数、长整型数和双精度型数的绝对值。在数的绝对值。在C中因处理的数据类型不同,中因处理的数据类型不同, 必必须取不同的函数名。在须取不同的函数名。在C+ 中,可以把这中,可以把这 3 个函个函数都命名为数都命名为 abs ( ): int abs ( int ); long

71、 abs ( long ); double abs ( double );8585C+的操作符重载的操作符重载 nC+提供了一种能力提供了一种能力, 可可用同一个名字定义多个函用同一个名字定义多个函数数, 这种能力叫做这种能力叫做操作符重载操作符重载。n例如例如, 可以命名一个函数可以命名一个函数: clear(* int), 它将一个它将一个整数清零。还可以再命名另一个函数整数清零。还可以再命名另一个函数 clear(int ),它把一个整数数组清零。,它把一个整数数组清零。n编译器能够比较具有同名的函数的特征,通过识编译器能够比较具有同名的函数的特征,通过识别别实参的数目实参的数目和每个和

72、每个实参的类型实参的类型,来标识使用于,来标识使用于一个特定调用的是哪一个版本的一个特定调用的是哪一个版本的abs( )。8686n在在C中,必须使用名字中,必须使用名字 clearIntArray( ) 和和clearInt( ) 来区分这两个函数。在来区分这两个函数。在C+中,编译器能够比中,编译器能够比较同名函数的特征,通过识别实参的数目和每个较同名函数的特征,通过识别实参的数目和每个实参的类型,来标识一个特定调用中用的是哪一实参的类型,来标识一个特定调用中用的是哪一个版本的个版本的clear。n为了支持面向对象,为了支持面向对象,C+ 提供了提供了双目重载操作符双目重载操作符 (如如和

73、和)。这种操作可使得程序更可。这种操作可使得程序更可读、写得更自然。读、写得更自然。n例如例如, 可定义可定义“点点(Point)”的运算的运算, 像像 p1+p2: 把两个点把两个点 (x1, y1) 和和 (x2, y2) 相加成一相加成一个点个点 (x1+x2, y1+y2)。8787 p1 p2: 两个点两个点 p1 和和 p2 的的“小于小于”关系,表关系,表示示p1比比p2更靠近原点更靠近原点(0, 0)。 p1i: 一个点一个点p(x, y) 除以一个整数除以一个整数 i 的除法的除法 (x/i, y/i)。n可以按以下方式使用重载操作:可以按以下方式使用重载操作: Point

74、operator + ( Point p ); Point operator / ( int i ); int operator ( Point p );n使用这些新的操作的表达式如使用这些新的操作的表达式如: Point midPoint = ( point1 + point2 ) / 2;或或 if ( midPoint referencePoint ) .8888n注意注意: 每一个这样的操作符在调用时可看成是该每一个这样的操作符在调用时可看成是该操作符左边对象的成员函数。操作符左边对象的成员函数。n例如例如, (point1+point2) 实际上是一个消息。由类实际上是一个消息。由类

75、Point的的实例实例point1调用成员函数调用成员函数“+”, 该对象的该对象的属性确定第一个操作数的值。属性确定第一个操作数的值。n函数参数表中指定的函数参数表中指定的Point的的实例实例point2的属性确的属性确定第二操作数的值。定第二操作数的值。n这种重载能力允许像使用内建类型这种重载能力允许像使用内建类型 (如如int,float) 那样来使用用户自定义类型。与在不允许重载操那样来使用用户自定义类型。与在不允许重载操作的语言中相同的语句比作的语言中相同的语句比, 这样可以改善程序的这样可以改善程序的可读性。可读性。8989C+的动态存储分配的动态存储分配n在在C程序中程序中,

76、使用一个函数使用一个函数 malloc, 为程序分配它为程序分配它所需要的空间,一旦程序执行结束需要返回到它所需要的空间,一旦程序执行结束需要返回到它的调用者时,必须释放这个空间。的调用者时,必须释放这个空间。nC+为动态存储分配提供了两个新的命令:为动态存储分配提供了两个新的命令:new和和delete。它们可用于取代。它们可用于取代 C 中的库函数中的库函数malloc和和free。n在在C+中没有中没有无用单元收集无用单元收集,使用,使用new分配的存分配的存储必须显式地使用储必须显式地使用delete释放。释放。9090n操作操作new要求以要求以被建立对象的类型被建立对象的类型做为参

77、数,并做为参数,并返回一个返回一个指向新分配空间指向新分配空间的指针的指针。n作为对比作为对比, 在在C中中, 函数函数malloc要求它的调用者提要求它的调用者提供所需存储空间的数量。供所需存储空间的数量。n例如例如, 为动态分配一个整数或一个点为动态分配一个整数或一个点, 可编写如下可编写如下语句:语句: int *ip = new int;或或或或 Point *p = new Point;n它们组成了指针变量的声明它们组成了指针变量的声明 (如如 * name) 和动态存和动态存储分配储分配 ( new 类型类型 )。9191nDelete 命令必须能够知道命令必须能够知道 要释放动态

78、分配的是一要释放动态分配的是一个数组,还是一个简单变量。个数组,还是一个简单变量。n例如,如果已建立下列有例如,如果已建立下列有 100个点的数组:个点的数组: Point* p = new Point100;n则通过以下命令释放该存储则通过以下命令释放该存储: delete p;n若遗漏了若遗漏了“ ”,则将只释放则将只释放 p 所指示的第一个元所指示的第一个元素素,将,将“失去失去”其它其它99个点所占据空间,以致不个点所占据空间,以致不能再复用它们。若使用时元素下标超出能再复用它们。若使用时元素下标超出100, 程序程序将会出错且结果不可预测。将会出错且结果不可预测。9292友元友元(f

79、riend)函数函数n在类的声明中可使用保留字在类的声明中可使用保留字 friend 定义友元函数。定义友元函数。n友元函数实际上并不是这个类的成员函数,它可友元函数实际上并不是这个类的成员函数,它可以是一个常规函数,也可以是另一个类的成员函以是一个常规函数,也可以是另一个类的成员函数。如果想通过这种函数存取类的私有成员和保数。如果想通过这种函数存取类的私有成员和保护成员,则必须在类的声明中给出函数的原型,护成员,则必须在类的声明中给出函数的原型,并在该函数原型前面加上一个并在该函数原型前面加上一个friend。n参看参看Point类的声明类的声明, 有两个重载操作符有两个重载操作符,它们都被

80、声明为友元函数。它们都被声明为友元函数。9393内联内联(inline)函数函数n在函数定义前加上一个在函数定义前加上一个inline前缀就成为内联函数。前缀就成为内联函数。编译程序在编译时将会把这个函数语句直接插入编译程序在编译时将会把这个函数语句直接插入到普通代码中,因而减少了与函数调用和参数传到普通代码中,因而减少了与函数调用和参数传递有关的系统开销。递有关的系统开销。n直接插入代码所需要的空间比不直接插入的调用直接插入代码所需要的空间比不直接插入的调用方式所需要的空间要多,这取决于函数定义的大方式所需要的空间要多,这取决于函数定义的大小。小。n除了加上除了加上inline保留字外保留字

81、外, 内联函数的定义内联函数的定义 与其它与其它任何函数定义的方式一样。任何函数定义的方式一样。 inline Point operator + (Point p);9494结构结构(struct)与类与类nC+ 扩充了扩充了 C 中结构中结构 (struct) 型的功用,加进成型的功用,加进成员函数以说明一个类员函数以说明一个类 (class)。在。在 C+ 中中 struct 与与 class 的区别在于的区别在于:n在在 struct 中中, 默认的访问级别是默认的访问级别是 public。若在。若在 struct 内部自始至终缺省访问级别,内部自始至终缺省访问级别, 则所有的成则所有的

82、成员都是共有的。员都是共有的。n在在 class 中,缺省的访问级别是中,缺省的访问级别是 private。n除此之外,除此之外,struct 与与 class 是等价的。例如,下面是等价的。例如,下面给出定义矩形类的三种等价的类声明。给出定义矩形类的三种等价的类声明。9595class Rectangle int x1, y1, h, w;public: Rectangle ( ); Rectangle ( ); int GetX ( ); int GetY ( ); void SetX (int x); void SetY (int y); int GetHeight ( ); int G

83、etWidth ( ); 9696struct Rectangle Rectangle ( ); Rectangle ( ); int GetX ( ); int GetY ( ); void SetX (int x); void SetY (int y); int GetHeight ( ); int GetWidth ( ); private: int x1, y1, h, w;9797联合联合(Union)与类与类n与结构一样与结构一样, 用用 Union 也可以定义类。也可以定义类。n在在C+中中, Union 可包含可包含函数函数和和变量变量, 还可包含还可包含构构造函数造函数和和析

84、构函数析构函数。nC+的的Union 保留了所有保留了所有C的特性的特性, 主要是让所有主要是让所有的数据成员共享相同的存储区。的数据成员共享相同的存储区。n与与 class 和和 struct 相比相比, Union 可节省存储。与结可节省存储。与结构相似构相似, Union 中默认存取级别是中默认存取级别是public。9898模板模板 (template)n定义:适合定义:适合多种数据类型多种数据类型的的类定义类定义或或算法算法,在,在特定环境下通过简单地代换,变成特定环境下通过简单地代换,变成针对具体某针对具体某种数据类型种数据类型的的类定义类定义或或算法。算法。n用模板定义用于排序的

85、数据表类用模板定义用于排序的数据表类 #include template class dataList private: Type *Element; int ArraySize;9999 void Swap (int m1, int m2); int MaxKey (int low, int high); public: dataList (int size = 10) : ArraySize (size), Element (new Type Size) dataList ( ) delete Element; void Sort ( ); friend ostream& operator

86、 (ostream& outStream, datalist& outList); friend istream& operator (istream& inStream, datalist& inList); 100100n类中所有操作作为模板函数的实现类中所有操作作为模板函数的实现 #include “datalist.h” template void dataList : Swap (int m1, int m2) /交换由m1, m2为下标的数组元素的值 Type temp = Element m1; Element m1 = Element m2; Element m2 = temp

87、; 101101 template int dataList : MaxKey (int low, int high) /查找数组Elementlow到Elementhigh /中的最大值,函数返回其位置 int max = low; for ( int k = low+1, k = high, k+ ) if ( Elementmax Elementk ) max = k; return max; 102102 template ostream& operator (ostream& OutStream, dataList OutList) OutStream “数组内容 : n”; for

88、 (int i = 0; i OutList.ArraySize; i+) OutStream OutList.Elementi ; OutStream endl; OuStream “数组当前大小 : ” OutList.ArraySize endl; return OutStream; 103103 template istream& operator (istream& InStream, dataList InList) cout InList.ArraySize; cout “录入数组元素值 : n”; for (int i = 0; i InList.ArraySize; i+)

89、cout “元素” i InList.Elementi; return InStream; 104104 template void dataList:Sort ( ) /按非递减顺序对ArraySize个关键码 /Element0到ElementArraySize-1排序 for ( int i = ArraySize -1; i 0; i- ) int j = MaxKey (0, i); if ( j != i ) swap (j, i); 105105n使用模板的选择排序算法的主函数使用模板的选择排序算法的主函数 #include “selecttm.h” const int SIZE = 10; int main ( ) dataList TestList (SIZE); cin TestList; cout TestList endl; TestList.Sort ( ); cout TestList endl; return 0;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号