《C++面向对象程序设计》谭浩强第1章

上传人:ni****g 文档编号:569371543 上传时间:2024-07-29 格式:PPT 页数:58 大小:945KB
返回 下载 相关 举报
《C++面向对象程序设计》谭浩强第1章_第1页
第1页 / 共58页
《C++面向对象程序设计》谭浩强第1章_第2页
第2页 / 共58页
《C++面向对象程序设计》谭浩强第1章_第3页
第3页 / 共58页
《C++面向对象程序设计》谭浩强第1章_第4页
第4页 / 共58页
《C++面向对象程序设计》谭浩强第1章_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《《C++面向对象程序设计》谭浩强第1章》由会员分享,可在线阅读,更多相关《《C++面向对象程序设计》谭浩强第1章(58页珍藏版)》请在金锄头文库上搜索。

1、C+语言设计第一章C+的初步知识青岛理工大学青岛理工大学 吕秀艳吕秀艳C+ 1- 1 参考教材l l选用教材选用教材选用教材选用教材 C+C+C+C+面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 谭浩强谭浩强谭浩强谭浩强l l参考教材参考教材参考教材参考教材 C+ PrimerC+ PrimerC+ PrimerC+ Primer中文版中文版中文版中文版 Stanley Stanley Stanley Stanley B.lippmanB.lippmanB.lippmanB.lippman 著著著著C+ 1- 2 【 C+C+程序设计课程安排程序设计课程安排】1.1. C+

2、C+语言特点。语言特点。2.C+2.C+语言语法、语言语法、C+C+程序设计示例。程序设计示例。3.3.上机实验(上机实验(16/4816/48学时)学时)C+ 1- 3 1.1 从从C到到C+C语言是结构化和模块化的语言,语言是结构化和模块化的语言,C程序的设计者必须细致程序的设计者必须细致地设计程序中的每个细节,准确地考虑程序运行时每一时刻发生地设计程序中的每个细节,准确地考虑程序运行时每一时刻发生的事情,当程序规模变大时,结构化程序设计就显得力不从心。的事情,当程序规模变大时,结构化程序设计就显得力不从心。为了解决软件设计危机,在为了解决软件设计危机,在20世纪世纪80年代提出了面向对象

3、的程序年代提出了面向对象的程序设计思想(设计思想(OOP)在实践中人们发现)在实践中人们发现C语言使用如此广泛,如果语言使用如此广泛,如果在它的基础上发展一种面向对象的语言,一定会让大众容易接收在它的基础上发展一种面向对象的语言,一定会让大众容易接收这种语言,所以产生了这种语言,所以产生了C+。C+ 1- 4 1.1 从从C到到C+lAT&T发布的第一个发布的第一个C+编译系统是一个预编译器,编译系统是一个预编译器,它把它把C+代码转换成代码转换成C代码,然后再用代码,然后再用C编译系统生编译系统生成目标代码。成目标代码。l1988 产生第一个产生第一个C+编译系统编译系统l1989 C+2.

4、0 类的多重继承类的多重继承l1991 C+3.0 类的模板类的模板l C+4.0 异常处理、命名空间异常处理、命名空间l1997 ANSI发布发布C+标准标准C+ 1- 5 1.1 从从C到到C+C+既可以用于面向过程的结构化程序设计,也可既可以用于面向过程的结构化程序设计,也可用于面向对象的程序设计。用于面向对象的程序设计。C+对对C的增强体现在两个方面:的增强体现在两个方面:1.对原来的面向过程机制做了扩充。对原来的面向过程机制做了扩充。2.增加了面向对象的机制。增加了面向对象的机制。学习学习C+之后,既可以进行面向对象的程序设计,之后,既可以进行面向对象的程序设计,也可以进行面向过程的

5、程序设计。也可以进行面向过程的程序设计。C+ 1- 6 C+语言语言C语言语言与与与与C C语言兼容语言兼容语言兼容语言兼容是是是是C C语言的一个超集语言的一个超集语言的一个超集语言的一个超集绝大多数绝大多数绝大多数绝大多数C C语言代码无须语言代码无须语言代码无须语言代码无须修改就可以直接在修改就可以直接在修改就可以直接在修改就可以直接在C+ C+ 程序程序程序程序中使用中使用中使用中使用 支持面向对象程序设计支持面向对象程序设计支持面向对象程序设计支持面向对象程序设计支持面向过程支持面向过程支持面向过程支持面向过程的程序设计的程序设计的程序设计的程序设计【 C+C+语言与语言与语言与语言

6、与C C语言的关系语言的关系语言的关系语言的关系】C+ 1- 7 7/29/20247【 Visual C+6.0Visual C+6.0编程开发环境简介编程开发环境简介编程开发环境简介编程开发环境简介】C+ 1- 8 1.2 最简单的最简单的C+程序程序 例例1.1输出一行字符输出一行字符“This is a C+ program.”。#include / 用cout输出时需要用 / 此头文件using namespace std; / 使用命名空间stdint main() coutThis is a C+ program.n; / 上面用C+的方法输出一行return 0;(1)标准标准

7、C+规定规定main函数必须声明为函数必须声明为int类型,如果程序正常运行,类型,如果程序正常运行,向操作系统返回一个零值,否则返回非零值,通常是向操作系统返回一个零值,否则返回非零值,通常是-1。(2)C+程序中可以用程序中可以用/*/做注释,可以用做注释,可以用/做注释。前者可以做多做注释。前者可以做多行注释,后者只做单行注释。行注释,后者只做单行注释。(3)C+程序中常用程序中常用cout、cin进行输出输入,进行输出输入,cout是是C+定义的输出定义的输出流对象,流对象,是插入运算符。是插入运算符。C+ 1- 9 l(4)使用使用cout、cin需要用头文件需要用头文件iostre

8、am,在程序,在程序开始要用开始要用#include声明包含的头文件。声明包含的头文件。l(5) using namespace std; 意思是使用命名空间。意思是使用命名空间。C+标准库中的类和函数是在命名空间标准库中的类和函数是在命名空间std中声明的,中声明的,因此程序中如用因此程序中如用C+标准库中的有关内容(此时需标准库中的有关内容(此时需要用要用#include命令行),就要用命令行),就要用using namespace std; 语句声明。语句声明。C+ 1- 10 例1.2 求a和b 两个数之和 / 求两数之和#include / 预处理命令预处理命令using names

9、pace std; / 使用命名空间使用命名空间stdint main() / 主函数首部主函数首部 / 函数体开始函数体开始int a,b,sum; / 定义变量定义变量cinab; / 输入语句输入语句sum=a+b; / 赋值语句赋值语句couta+b=sumendl; / 输出语句输出语句return 0; / 如程序正常结束,返回一个零值如程序正常结束,返回一个零值C+ 1- 11 例1.3 求两个数中的大数#include using namespace std;int main() int max(int x,int y) ; /对对max函数作声明函数作声明 int a,b,c

10、; cinab; c=max(a,b); /调用调用max函数函数 coutmax=cy) z=x; else z=y; return(z);C+ 1- 12 例例1.4包含类的包含类的C+程序程序#include using namespace std;class Student / 声明一个类,类名为声明一个类,类名为Student private: / 以下为类中的私有部分以下为类中的私有部分 int num; / 私有变量私有变量num int score; / 私有变量私有变量score public: / 以下为类中公用部分以下为类中公用部分 void setdata() / 定义

11、公用函数定义公用函数setdata cinnum; / 输入输入num的值的值 cinscore; / 输入输入score的值的值 void display() / 定义公用函数定义公用函数display coutnum=numendl; / 输出输出num的值的值 coutscore=scoreendl; ; / 输出输出score的值的值; / 类的声明结束类的声明结束C+ 1- 13 Student stud1,stud2; /定义定义stud1和和stud2为为Student类的变量,称为对象类的变量,称为对象int main() / 主函数首部主函数首部stud1.setdata()

12、; / 调用对象调用对象stud1的的setdata函数函数 stud2.setdata(); / 调用对象调用对象stud2的的setdata函数函数 stud1.display(); / 调用对象调用对象stud1的的display函数函数 stud2.display(); / 调用对象调用对象stud1的的display函数函数 return 0;C+ 1- 14 l具有类类型的变量称为对象。具有类类型的变量称为对象。 Student的对象的对象stud1,stud2具有同样的结构和特征。具有同样的结构和特征。l在类外调用成员函数时必须在函数名前冠以类的名称。在类外调用成员函数时必须在函

13、数名前冠以类的名称。l C+ 1- 15 l为了与为了与C兼容,兼容, C+保留了保留了C语言中的一些规定,例如头文语言中的一些规定,例如头文件的文件名,以件的文件名,以C语言里头文件的扩展名是语言里头文件的扩展名是 .h,许多,许多C+编编译系统保留了这种扩展名,近年推出的译系统保留了这种扩展名,近年推出的C+编译系统新版本,编译系统新版本,推出了一批不带扩展名的头文件如推出了一批不带扩展名的头文件如iostream,string ,cmath 等。为了兼容等。为了兼容C+仍允许使用带扩展名的头文件。由仍允许使用带扩展名的头文件。由于于C语言无命名空间,因此使用带扩展名的头文件时不用语言无命

14、名空间,因此使用带扩展名的头文件时不用using namespace std。C+ 1- 16 1.3 C+对对C的扩充的扩充 lC+既可用于面向过程的程序设计,也可用于面向对象程序既可用于面向过程的程序设计,也可用于面向对象程序设计。设计。C+继承了继承了C语言提供的绝大部分功能和语法规定,语言提供的绝大部分功能和语法规定,并在此基础上作了扩充。并在此基础上作了扩充。C+ 1- 17 l1.3.1 C+的输入和输出的输入和输出l1.3.2 用用const 定义常变量定义常变量l1.3.3 函数原型声明函数原型声明l1.3.4 函数的重载函数的重载l1.3.5 函数模板函数模板l1.3.6 有

15、默认参数的有默认参数的函数函数l1.3.7 变量的引用变量的引用l1.3.8 内置函数内置函数l1.3.9 作用域运算符作用域运算符l1.3.10 字符串变量字符串变量l1.3.11 动态分配动态分配/回收内存运算符回收内存运算符C+ 1- 18 1.3.1 C+的输入输出的输入输出 lC+为了方便使用,除了可以利用为了方便使用,除了可以利用printf和和scanf函函数进行输入和输出外,还增加了标准输入流输出流数进行输入和输出外,还增加了标准输入流输出流cin和和cout。它们是在头文件。它们是在头文件iostream中定义的,标中定义的,标准流是不需要打开文件和关闭文件就能直接操作的准流

16、是不需要打开文件和关闭文件就能直接操作的流式文件,在此标准输入流是指从键盘上输入的数流式文件,在此标准输入流是指从键盘上输入的数据,标准输出流是指向屏幕输出的数据流。据,标准输出流是指向屏幕输出的数据流。C+预预定义的标准流如表定义的标准流如表1.2所示。所示。C+ 1- 19 1.3.1 C+的输入输出的输入输出C+ 1- 20 1. 用用cout进行输出进行输出l格式:格式:lcout 表达式表达式1表达式表达式2l功能:由左向右逐个计算表达式的值,将其插入到输出流功能:由左向右逐个计算表达式的值,将其插入到输出流cout中。中。lcout 必须与输出运算符必须与输出运算符一起使用,每个一

17、起使用,每个后跟一个表达式,后跟一个表达式,运运算符的结合方向是从左向右,所以各个表达式的值按从左到右的顺算符的结合方向是从左向右,所以各个表达式的值按从左到右的顺序插入到输出流序插入到输出流中。中。for ( k = 1; k =3; k+) cout “k=“ kendl;endl是是C+输出流的常数,在头文件输出流的常数,在头文件iostream中定义,代表让光标换中定义,代表让光标换行。在行。在C+中也可以用中也可以用”n”控制光标换行。所以输出语句也可写成:控制光标换行。所以输出语句也可写成:cout “k=“ k变量变量1 变量变量2 l是是C+的提取运算符,表示从标准输入设备取得

18、数据,赋的提取运算符,表示从标准输入设备取得数据,赋予其后的变量。予其后的变量。l从键盘输入数值数据时,两个数据之间用空格分隔或用回车从键盘输入数值数据时,两个数据之间用空格分隔或用回车分分隔。隔。int a; float bcinab;从键盘输入从键盘输入20 32.45 C+ 1- 22 例例1.5 cin和和cout的使用的使用#include using namespace std;int main( )coutplease enter your name and age:name; cinage; coutyour name is nameendl; coutyour age is

19、ageendl;return 0;1.1.指出下列输出语句哪些是合指出下列输出语句哪些是合指出下列输出语句哪些是合指出下列输出语句哪些是合法的法的法的法的? ?coutcout /*; /*;coutcout */; */;coutcout /* */ */; /* */ */;2. 2. 下面这段代码合法吗?为什么?下面这段代码合法吗?为什么?下面这段代码合法吗?为什么?下面这段代码合法吗?为什么?#include #include using namespace std;using namespace std;intint main() main() intint v1=1,v2=3; v

20、1=1,v2=3;coutcoutthe sum of v1;the sum of v1;andv2;andv2;isv1+v2isv1+v2endlendl; ;return 0;return 0; 习题与思考习题与思考C+ 1- 24 lC语言中,用语言中,用#define 定义符号常量:定义符号常量:#define PI 3.14159#define R a+b 它只是在预编译时进行它只是在预编译时进行字符置换字符置换,将标识符置换成表达式或数字。预编译,将标识符置换成表达式或数字。预编译后,标识符后,标识符PI,R不再存在。不再存在。PI,R不是变量,没有类型,不占用存储单元,很不是变

21、量,没有类型,不占用存储单元,很容易出错:容易出错:int a=1;b=2;#define PI 3.14159#define R a+bcoutPI * R * R; 输出的不是输出的不是3.14159 * (a+b) * (a+b),而是,而是 3.14159 * a+b * a+b。程序因此出错。程序因此出错。1.3.2 用用const定义常变量定义常变量C+ 1- 25 lC+进行了改进,用进行了改进,用 const 定义常变量。如:定义常变量。如:const float PI = 3.14159; 它定义了常变量它定义了常变量PI,有数据类型,占用存储单元,有地,有数据类型,占用存储

22、单元,有地址,可以用指针指向它,只是在程序运行中,此变量的值址,可以用指针指向它,只是在程序运行中,此变量的值固定,不能改变。固定,不能改变。l常变量定一旦创建后其值就不能再改变,因此必须对其进常变量定一旦创建后其值就不能再改变,因此必须对其进行初始化。行初始化。 const int bufsize=512; int i=42; const int c=i; const int k; (错误)错误) bufsize=530; (错误)(错误)C+ 1- 26 1.3.3 函数原型声明函数原型声明lC+强制规定,强制规定,如果函数调用的位置在函数定义之如果函数调用的位置在函数定义之前,则在调用函

23、数之前必须实现作函数原型声明。前,则在调用函数之前必须实现作函数原型声明。这一点与这一点与C不同,不同,C只是建议,而没有强制只是建议,而没有强制l函数声明的一般形式为:函数声明的一般形式为: 函数类型函数类型 函数名(参数表)函数名(参数表); l最后的分号可不能忘了,否则出错!参数表中可以最后的分号可不能忘了,否则出错!参数表中可以只指定各个参数的类型,而不指定参数名!只指定各个参数的类型,而不指定参数名!C+ 1- 27 函数声明和定义的示例函数声明和定义的示例#include using namespace std;float area (float r) return r * r*

24、3.14159; /先定义先定义int main( ) float radius; coutradius; if (radius0) coutarea(radius )endl; /再使用再使用 return 0;C+ 1- 28 程序可以改为如下形式:程序可以改为如下形式:/求圆面积,将函数声明和定义分开,在调用函数前先声明它求圆面积,将函数声明和定义分开,在调用函数前先声明它#include using namespace std;float area( float ); /先声明先声明int main( ) float radius; coutradius; if (radius0) c

25、outarea(radius )endl; /再使用再使用 return 0;float area( float r) /最后定义最后定义 return r * r* 3.14159;C+ 1- 29 1.3.4 函数的重载函数的重载(overloading)l什么叫重载?什么叫重载?运算符运算符“”是左移运算符,在是左移运算符,在C+中,又作为输出算中,又作为输出算符;而符;而“* *”是乘法算符,也是指针符号。这种一个标识符有是乘法算符,也是指针符号。这种一个标识符有多种含义用途的现象,就叫多种含义用途的现象,就叫“重载重载”(overloading)。如果标。如果标识符为运算符,就叫识符

26、为运算符,就叫“运算符重载运算符重载”;如果标识符为函数名,;如果标识符为函数名,就叫就叫“函数重载函数重载”。l什么时候用到重载?什么时候用到重载?用于相类似而又不同的操作用于相类似而又不同的操作。例如,求多个数值的最大。例如,求多个数值的最大数,不同类型的参数,数,不同类型的参数,C语言要编写不同的函数:语言要编写不同的函数:int max1(int a, int b, int c); / 3个整形数值求最大值个整形数值求最大值float max2(float a, float b); / 2个实形数值求最大值个实形数值求最大值long max3(long a, long b, long

27、c); / 3个长整形数值求最大值个长整形数值求最大值C+ 1- 30 l而而C+的做法是重载:的做法是重载:将这三个函数名取相同的名字将这三个函数名取相同的名字,程序运行时,程序运行时,系统会根据实际参数的不同,调用相近参数的函数:系统会根据实际参数的不同,调用相近参数的函数:#include int maxmax(int a, int b, int c) if (ba) a=b; if (ca) a=c; return a; float maxmax(float a, float b) if (ba) a=b; return a;long maxmax(long a, long b, lo

28、ng c) if (ba) a=b; if (ca) a=c; return a; void main( ) int a, b, c, d; float x, y, z; long m, n, p, q; cinabc; cinxy; cinmnp; d = max (a, b, c); cout “int_d = “dendl; z = max (x,y); cout “float_z = “zendl; q = max (m, n, p); cout “long_q = “qendl;Main函数三次调用函数三次调用max函数,每次实参的个数或类型不同,系统会寻找与之匹配的函数调用。函数,

29、每次实参的个数或类型不同,系统会寻找与之匹配的函数调用。注意:注意:重载函数的参数个数或类型必须至少有其中之一不同,函数返回值类型可以相同也可以不重载函数的参数个数或类型必须至少有其中之一不同,函数返回值类型可以相同也可以不同。但不允许参数个数和类型都相同而只有返回值类型不同。同。但不允许参数个数和类型都相同而只有返回值类型不同。C+ 1- 31 思考思考 重载函数的不便之处在于,对于重载函数的不便之处在于,对于同名的函数要一个一个地编写,编码量很大,同名的函数要一个一个地编写,编码量很大,怎样改进?怎样改进?C+ 1- 32 1.3.5 函数模板函数模板l什么时候使用模板什么时候使用模板?对

30、于有些相同功能的函数,如果函数?对于有些相同功能的函数,如果函数形参个数相同,可以用另外的方法来解决,这就是模板形参个数相同,可以用另外的方法来解决,这就是模板(Template)。l函数模板的定义形式:函数模板的定义形式:Template 返回类型返回类型 函数模板名函数模板名(数据参数表数据参数表) 函数模板定义体函数模板定义体l示例:将上述重载示例改为函数模板。示例:将上述重载示例改为函数模板。C+ 1- 33 #include using namespace std; /默认使用默认使用std标准库名标准库名template T max (T a, T b, T c) / 建立函数模板

31、时,只需要建立函数模板时,只需要 if (ba) a=b; / 将函数类型、参数类型将函数类型、参数类型 int 换成换成 T 就行。就行。 if (ca) a=c; / 即用虚拟的类型名即用虚拟的类型名T代替实际的类型代替实际的类型 return a; int main( ) int i = 8, j = 3, k = 4, h; long m = 1, n = 2, p = 3, q; h = max ( i, j, k); q = max ( m, n, p); cout “int_h = “hendl; cout “long_q = “qendl; return 0;类型参数可以有多个

32、:类型参数可以有多个:template C+ 1- 34 l由此程序可以看到,函数模板比函数重载更方由此程序可以看到,函数模板比函数重载更方便,但模板只适用于便,但模板只适用于函数的参数个数相同而类函数的参数个数相同而类函数的参数个数相同而类函数的参数个数相同而类型不同,且函数体相同型不同,且函数体相同型不同,且函数体相同型不同,且函数体相同的情况。不满足这种情的情况。不满足这种情况时,就只能使用函数重载。况时,就只能使用函数重载。注意注意C+ 1- 35 1.3.6 有默认参数的函数有默认参数的函数l背景背景:一般情况下,函数调用时,形参从实参那里取得值。因此要求实:一般情况下,函数调用时,

33、形参从实参那里取得值。因此要求实参的个数和类型应该与形参相同。但是,有时候,多次调用同一函数时参的个数和类型应该与形参相同。但是,有时候,多次调用同一函数时用的是同一实参数,或者调用时还不好确定实参数。用的是同一实参数,或者调用时还不好确定实参数。C+提供一个简单提供一个简单的解决办法,即给参数一默认值的解决办法,即给参数一默认值。这样当不提供实参数时,形参就用默。这样当不提供实参数时,形参就用默认参数作为参数值。认参数作为参数值。l示例示例:有一函数声明为:有一函数声明为:float area ( float r=6.5 );调用调用area 函数时,如果不提供实际参数给函数时,如果不提供实

34、际参数给r,r 就以默认数值就以默认数值 6.5 作为参数顶用作为参数顶用area:area ( ); / 相当于相当于 area (6.5 );l注意注意:1) 当有多个参数时,如果只有部分参数有默认值,则指定了默认值的参当有多个参数时,如果只有部分参数有默认值,则指定了默认值的参数必须放在参数表的最右边,否则出错。因为实参与形参的结合是从左数必须放在参数表的最右边,否则出错。因为实参与形参的结合是从左至右顺序进行的,第一个实参必须给第一个形参,第二个实参必须给第至右顺序进行的,第一个实参必须给第一个形参,第二个实参必须给第二个形参二个形参。C+ 1- 36 1.3.6 有默认参数的函数有默

35、认参数的函数声明:声明: void area (float x1, int x2 = 1, char x3 = a);调用:调用:area ( 1.2, 3, b); / 形参值全部由实参得到形参值全部由实参得到 area (1.2, 3); / 最后一个参数取自默认值最后一个参数取自默认值 area (1.2 ); / 最后两个参数取自默认值最后两个参数取自默认值 area ( ); / 出错,第一个形参没有实参,也没有出错,第一个形参没有实参,也没有默认值默认值2) 一个函数不能既作为重载函数,又作为默认参数函数。因为一个函数不能既作为重载函数,又作为默认参数函数。因为当调用函数时如果少写

36、一实际个参数,系统无法判断是利用当调用函数时如果少写一实际个参数,系统无法判断是利用重载函数还是利用默认参数函数。重载函数还是利用默认参数函数。C+ 1- 37 1.3.7 变量的引用变量的引用(reference)l什么叫引用什么叫引用?变量的引用就是变量的别名。建立引用的作用,?变量的引用就是变量的别名。建立引用的作用,是为一个变量另取一个名字,以便在需要的时候间接地引用是为一个变量另取一个名字,以便在需要的时候间接地引用该别名。该别名。l如何使用引用如何使用引用?假如有一个变量?假如有一个变量a , 想给它另取一个别名想给它另取一个别名b ,可以这样写可以这样写:int a ;int &

37、b = a; / 声明声明b 是一个整形变量的引用变量,并且被初始化为是一个整形变量的引用变量,并且被初始化为au此处此处 & 不代表取地址,只是不代表取地址,只是“引用声明符引用声明符”。对一个变量声明一个引。对一个变量声明一个引用,并不另外开辟内存空间。用,并不另外开辟内存空间。b和和a 代表同一个变量单元。代表同一个变量单元。u引用不是独立的变量,编译系统不给它分配存储单元。因此建立引用引用不是独立的变量,编译系统不给它分配存储单元。因此建立引用只有声明,没有定义,只是声明和某一个变量的关系。只有声明,没有定义,只是声明和某一个变量的关系。C+ 1- 38 1.3.7 变量的引用变量的引

38、用(reference)u声明了一个变量的引用后,在本函数执行期间,该引用一声明了一个变量的引用后,在本函数执行期间,该引用一直与代表的变量相联系,不能再作为另一个变量的别名。直与代表的变量相联系,不能再作为另一个变量的别名。请看如下示例:请看如下示例:int a, b ;int &c = a;int &c = b; / 错误,错误,c 已经是已经是a 的引用,不能再作为另一的引用,不能再作为另一个变量个变量b的引的引u引用不是独立的数据类型,它必须与某一种类型的数据相引用不是独立的数据类型,它必须与某一种类型的数据相联系:联系:int &x; / 错误,错误, 没有指定没有指定 x 代表哪个

39、变量代表哪个变量C+ 1- 39 l示例:示例:#include using namespace std;int main( ) int a = 10; int &b = a; a = a * a; cout “b =“ b endl; return 0;运行结果:运行结果:b = 1001.3.7 变量的引用变量的引用(reference)C+ 1- 40 l将引用作为函数参数将引用作为函数参数:C+之所以增加之所以增加“引用引用”,主要是利用它作为函,主要是利用它作为函数参数,以弥补函数传递参数的不方便的遗憾。也降低了编程难度。数参数,以弥补函数传递参数的不方便的遗憾。也降低了编程难度。u

40、将变量名作为实参将变量名作为实参:这时传给形参的是变量的值,传递是单向的,函:这时传给形参的是变量的值,传递是单向的,函数运行时,形参发生变化,并不回传给实参。因为形参和实参不是同数运行时,形参发生变化,并不回传给实参。因为形参和实参不是同一个存储单元。请看下面示例:一个存储单元。请看下面示例:1.3.7 变量的引用变量的引用(reference)#include void swap ( int a, int b ) int temp; temp = a; a = b; b = temp;void main( ) int i=3, j=5; swap ( i, j ); couti“,”jen

41、dl;运行结果,运行结果,i, j 仍然是仍然是3,5。没有发生交换。没有发生交换。C+ 1- 41 u传递变量的指针传递变量的指针:这时传给形参的是变量的地址,形参得到一个变量:这时传给形参的是变量的地址,形参得到一个变量的地址,即形参指针变量指向实参变量单元。函数中形参发生改变,的地址,即形参指针变量指向实参变量单元。函数中形参发生改变,实际上是改变实参。实际上是改变实参。这种方法实际上仍然是值传递:想指针变量传递地址值。然后通过指针这种方法实际上仍然是值传递:想指针变量传递地址值。然后通过指针变量访问有关变量。变量访问有关变量。“间接地间接地”回传了改变的变量。请看下面示例:回传了改变的

42、变量。请看下面示例:1.3.7 变量的引用变量的引用(reference)#include void swap ( int *p1, int *p2 ) int temp; temp = *p1; *p1 = *p2; *p2 = temp;void main( ) int i=3, j=5; swap ( &i, &j ); couti“,”jendl;运行结果,运行结果,i, j 是是5,3。变量值发生交换。变量值发生交换。C+ 1- 42 u传递变量的别名传递变量的别名:将变量的引用作为函数形参,弥补了上面两种方法:将变量的引用作为函数形参,弥补了上面两种方法的不足。请看下面示例:的不足

43、。请看下面示例:注意:注意:swap函数形参函数形参&a,&b是指定整形变量的引用作为形参,但是指定整形变量的引用作为形参,但引用谁还没定。而引用谁还没定。而main函数中,用一,函数中,用一,i, j的名调用的名调用swap,就是将,就是将i, j的的名字传给引用,这样名字传给引用,这样a就成立就成立i的别名,的别名,b就成立就成立j 的别名。的别名。1.3.7 变量的引用变量的引用(reference)#include void swap ( int &a, int &b ) int temp; temp = a; a = b; b = temp;void main( ) int i=3,

44、 j=5; swap ( i, j ); couti“,”jendl;运行结果,运行结果,i, j 是是5,3。变量值发生交换。变量值发生交换。C+ 1- 43 l对引用的说明对引用的说明:u不能建立不能建立void类型的引用。因为任何实际存在的变量都属于非类型的引用。因为任何实际存在的变量都属于非void类类型。型。 void &a = 9; /错误错误u不能对数组名进行引用,因为数组名只代表数组首地址,本身不是变不能对数组名进行引用,因为数组名只代表数组首地址,本身不是变量不占有存储空间。量不占有存储空间。char c6 = “hello”;char &r =c; /错误错误u可以建立指针

45、变量的引用:可以建立指针变量的引用:int i=5;int *p= &i; / 定义指针变量定义指针变量p,指向,指向i int * &t = p; / t 是指向整形变量的指针变量的引用,初始化为是指向整形变量的指针变量的引用,初始化为p.1.3.7 变量的引用变量的引用(reference)C+ 1- 44 u可以将引用的地址赋给指针。此时,指针指向原来变量:可以将引用的地址赋给指针。此时,指针指向原来变量:int a = 3;int &b = a;int *p = &b; / 指针指针p指向变量指向变量a的引用的引用b,相当与指向,相当与指向au不能定义指向引用类型的指针变量:不能定义指

46、向引用类型的指针变量:int & *p = & a; / 错误错误u可以用常量或表达式对引用初始化,但必须用可以用常量或表达式对引用初始化,但必须用const限定:限定:const int &c = 3; /合法合法1.3.7 变量的引用变量的引用(reference)C+ 1- 45 l引入原因引入原因:目的是为了解决程序中函数调用的目的是为了解决程序中函数调用的效率效率问题。问题。函数调用时需要时间和空间的代价。函数调用时需要时间和空间的代价。1.3.8 内联函数内联函数(inline function)main()statement; fun1();statement;fun1()sta

47、tement; fun2();statement; return; fun2()statement;return; 保存返回地址及保存返回地址及当前现场当前现场恢复函数恢复函数main的现场,取得返的现场,取得返回地址回地址保存返回地址保存返回地址及当前现场及当前现场恢复函数恢复函数fun1的的现场,取得返回现场,取得返回地址地址函数调用的执行过程函数调用的执行过程 而有时一些函数代码很短(行),却有高使用频率,造成而有时一些函数代码很短(行),却有高使用频率,造成处理现场的开销巨增。处理现场的开销巨增。这时若将这时若将函数体嵌入函数函数体嵌入函数调用处,则可避免每次调用函数的调用处,则可避免

48、每次调用函数的开销,大大提高效率。开销,大大提高效率。C+ 1- 46 1.3.8 内联函数内联函数(inline function)l在声明一个函数时,加上限定词在声明一个函数时,加上限定词inline,该函数就成为内联函,该函数就成为内联函数。编译时,数。编译时,系统将调用此函数的地方用函数的原代码替换系统将调用此函数的地方用函数的原代码替换系统将调用此函数的地方用函数的原代码替换系统将调用此函数的地方用函数的原代码替换。即以空间代价换取时间。例如:即以空间代价换取时间。例如:#include inline int power(int x ) / 定义一个内联函数定义一个内联函数 retu

49、rn x*x; void main( ) cout power ( 2 ) endl; / 编译系统展开为编译系统展开为x=2;x*x; cout power ( 1+2 ) endl; / 编译系统展开为编译系统展开为x=1+2;x*x;运行结果:运行结果:49C+ 1- 47 l内联函数还有内联函数还有限制限制:u函数内不能含有循环结构或函数内不能含有循环结构或switch结构;结构;u不能含有任何静态数据及数组声明。不能含有任何静态数据及数组声明。u不能是递归函数。不能是递归函数。1.3.8 内联函数内联函数(inline function)C+ 1- 48 l标识符只能在说明它或定义它

50、的范围内是可见的,标识符只能在说明它或定义它的范围内是可见的,而在该范围之外是不可见的。而在该范围之外是不可见的。l大多数标识符的说明与定义是一致的,只有少数例大多数标识符的说明与定义是一致的,只有少数例外。如:函数等。外。如:函数等。l范围有大有小:程序范围有大有小:程序 文件文件 函数函数 块块l每一个变量都有自己的有效范围。我们只能在变量的作用域每一个变量都有自己的有效范围。我们只能在变量的作用域内使用该变量。内使用该变量。不能直接使用其它作用域中的变量不能直接使用其它作用域中的变量。如果要。如果要使用其它作用域中的同名变量,必须使用使用其它作用域中的同名变量,必须使用“作用域运算符作用

51、域运算符”,即,即“:”。1.3.9 作用域运算符作用域运算符C+ 1- 49 示例:示例:#include float a=1.5;void main( ) int a = 5; cout a endl; / 输出作用域为输出作用域为main 函数的局部变量函数的局部变量a 的的值值 cout :a endl; / 输出作用域为全局的输出作用域为全局的 全局变量全局变量a 的值的值运行结果:运行结果:5 1.5 注意:不能用作用域运算符注意:不能用作用域运算符“:”访问函数中的局部变量。访问函数中的局部变量。1.3.9 作用域运算符作用域运算符C+ 1- 50 局部变量和全局变量局部变量和全

52、局变量1、局部变量、局部变量是指作用域在函数级和块级的变量。2、全局变量、全局变量是指作用域在程序级和文件级的变量。C+ 1- 51 #includeint i(5); /外部全局变量外部全局变量extern void func( ) cout iendl; void main() int i=3; / 内部局部变量内部局部变量 func( ); cout iendl; 局部变量全局变量蓝色为文件作用域绿色为函数作用域C+ 1- 52 1.3.10 字符串变量字符串变量C+除了可以使用除了可以使用C语言提供的字符型变量和字符型数组外,还提供语言提供的字符型变量和字符型数组外,还提供了字符串类。

53、这种类可以定义字符串对象。但在文件开头必须包含了字符串类。这种类可以定义字符串对象。但在文件开头必须包含string库:库:#include l字符串定义字符串定义:string s1; / 定义字符串变量定义字符串变量s1string s2 = “China”; / 定义字符串变量定义字符串变量s2并初始化并初始化l字符串赋值字符串赋值:可以对定义了的字符串变量进行赋值:可以对定义了的字符串变量进行赋值:s1 = “Hello”;s2 = s1;s3 = s1+s2; / 字符串连接字符串连接l字符串变量的输入输出字符串变量的输入输出:string c1;cin c1;cout =,= 来进

54、行字符串的比较来进行字符串的比较C+ 1- 53 1.3.10 字符串变量字符串变量l字符串数组字符串数组:也可以直接定义字符串数组:也可以直接定义字符串数组:string name 4 = “张三张三”,”李四李四”,”王五王五”,”刘六刘六”;运行结果为:运行结果为:name 0 = “张三张三“;name 1 = “李四李四”;name 2 = “王五王五”;name 3 = “刘六刘六”;C+ 1- 54 1.3.10 字符串变量字符串变量l示例:从键盘输入示例:从键盘输入3个字符串,并按字典顺序输出:个字符串,并按字典顺序输出:#include #include using name

55、space std;void main( ) string s1,s2,s3,temp; cin s1s2s3; if ( s2s3) temp =s2; s2 = s3; s3 = temp; if ( s1s2) temp =s1; s1 = s2; s2 = temp; if ( s2s3) temp =s2; s2 = s3; s3 = temp; cout s1 s2s3endl;C+ 1- 55 1.3.11 动态分配内存动态分配内存new/回收内存回收内存deletelC语言中,用两个函数语言中,用两个函数malloc(size)/free来实现内存管理。来实现内存管理。C+提供

56、了更提供了更为强大的运算符为强大的运算符new/delete,来代替这两个函数。,来代替这两个函数。分配内存空间分配内存空间:new 类型;类型;回收内存空间回收内存空间:delete 指针变量;指针变量;int *a =new int ; int *b =new int( 100); char *ch = new char10; int * q = new int 54; float * p = new float(3.14159);l示例:开辟一个空间,存放有示例:开辟一个空间,存放有2个字段的结构体。个字段的结构体。#include #include using namespace std;struct Student string name; int age;void main( ) Student *p; p = new Student; p-name = “zhangsan; p-age = 20; cout name = name ; cout age = ageendl; delete p; C+ 1- 56 1.4 C+程序的编写和实现程序的编写和实现 l1. 用用C+语言编写程序语言编写程序l2. 对源程序进行编译对源程序进行编译l3. 将目标文件连接将目标文件连接l4. 运行程序运行程序 l5. 分析运行结果分析运行结果 C+ 1- 57

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

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

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