C++程序设计-培训课件-完整版-377p.ppt

上传人(卖家):晟晟文业 文档编号:4441610 上传时间:2022-12-10 格式:PPT 页数:377 大小:2.25MB
下载 相关 举报
C++程序设计-培训课件-完整版-377p.ppt_第1页
第1页 / 共377页
C++程序设计-培训课件-完整版-377p.ppt_第2页
第2页 / 共377页
C++程序设计-培训课件-完整版-377p.ppt_第3页
第3页 / 共377页
C++程序设计-培训课件-完整版-377p.ppt_第4页
第4页 / 共377页
C++程序设计-培训课件-完整版-377p.ppt_第5页
第5页 / 共377页
点击查看更多>>
资源描述

1、3:32:061C+程序设计吉林大学吉林大学 软件学院软件学院3:32:072n教师邮箱:教师邮箱:n参考书:参考书:C+程序设计教程程序设计教程 钱能钱能清华大学出版社清华大学出版社 第第2版版n课堂纪律:课堂纪律:n上机:上机:3:32:073第一章:概第一章:概 述述n1-1 培养目标n理解和掌握c+语言的基本语义和语法,初步理解面向对象的思想,初步掌握面向对象的程序设计方法。n提高编程能力和调试程序的能力,为后面的学习打好基础。3:32:0741-2 C语言与C+语言C语言回顾:1972年 bell实验室研制C语言特点:l高度灵活性、实现上的高效性 (比FORTRAN)l简捷和高效 (

2、比Pascal)3:32:075nC语言局限:程序达到一定规模时,模块之间的协调性存在问题,程序的重用性也存在问题,程序员难以控制程序的复杂性。3:32:076nC+产生:n1980年 贝尔实验室 Bjanre Stroustrup 对C改进与扩充n最初称为“带类的C”,(c with classes).n1983年正式命名为C+n3次修订后n1994 年制定了ANSI c+草案n1998年11月,ISO标准被批准。3:32:077nC+是C的改进与扩充nC+包括C的全部属性、特征、优点,是在C的基础上的改进与扩充n C+是C语言改进的基础上,添加了对面向对象程序设计部分的支持nC+包括过程性

3、语言和类部分nC+是C的超集,C是C+的子集nC+是混合型语言,即是过程型的,又是面向对象型的3:32:0781-3 面向过程的程序设计“面向过程”是一种以事件为中心的编程思想。就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。3:32:079 1-4 面向对象程序设计的基本特征1.对象一个对象是客观世界的一个实体数据与数据处理过程作为一个整体对象C+采用“类”来支持对象,同类对象抽象出其共性,形成类,类封装了数据与处理数据的过程(函数)3:32:07102.继承与重用举例C+采用继承支持重用。可通过继承现有类,并对其进行扩展,生成新类,即新

4、类是从现有类派生出来的,成为派生类。3.多态性:多态性指同一个操作在不同的类上有着不同行为。3:32:07111-5:举例比较面向对象和面向过程 程序设计n例如五子棋,例如五子棋,n面向过程的设计思路就是首先面向过程的设计思路就是首先分析问题的步骤:分析问题的步骤:1、开始游戏,、开始游戏,2、黑子先走,、黑子先走,3、绘制画面,、绘制画面,4、判断输赢,、判断输赢,5、轮到白子,、轮到白子,6、绘制画面,、绘制画面,7、判断输赢,、判断输赢,8、返回步骤、返回步骤2,9、输出最后结果。、输出最后结果。n把上面每个步骤用分别的函数把上面每个步骤用分别的函数来实现,问题就解决了来实现,问题就解决

5、了 而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,同时利用第三类对象(规则系统)来对棋局进行判定。3:32:0712面向过程和面向对象不是对立的面向过程和面向对象将长期并存从程序机构上,c+的单一程序体本质上是基于过程的,因为运行程序时,总是启动过程。3:32:0713/*this is a simple c+program*/#include using namespace std;/

6、#include int main()int a,b,result;cout ab;result=3*a-2*b+1;coutresult is result=0&ch=9)?1:0;编译器为内联函数创建一段源代码,每遇到一次该函数的调用都用相应的一段代码来代替。内联函数主要是解决运行效率的问题。使用内联函数可以省去函数调用所需的建立栈内存环境,进行参数传递,产生程序转移的时间开销内联函数应是使用频率高,代码却很短的函数。3:32:0719内联函数必须在调用之前声明或定义。#include using namespace std;inline int isnumber(char);/int i

7、snumber(char);(则正常函数调用)int main()char c;while(cinc&c!=n)if(isnumber(c)coutyou entered a digitn;else cout=0&ch=9)?1:0;此处inline可省略3:32:0720n内联函数的函数体限制:内联函数中,不能含有switch和while。递归函数不能用来做内联函数。内联函数中不能说明数组。否则,按普通函数调用那样产生调用代码。(内联函数是建议性,不是指令性)n内联函数只适合于1-5行的小函数n类结构中所有在类内部定义的函数,都是内联函数。3:32:0721 2-2 重载函数int abs(

8、int);long l_abs(long);double d_abs(double);重载函数:重载函数:int abs(int);long abs(long);double abs(double);C+用一种函数名技术可准确的判断出应使用那一个函数。用一种函数名技术可准确的判断出应使用那一个函数。abs(-10);/调用调用int abs(int);abs(-1000000);/调用调用long abs(long);abs(12.3);/调用调用double abs(double);简化编程,在编程逻辑上,亲近了人类的思维简化编程,在编程逻辑上,亲近了人类的思维3:32:0722 在同一作用

9、范围中为多个函数定义(其功能通常是相在同一作用范围中为多个函数定义(其功能通常是相近的)指定一个近的)指定一个共同的函数名共同的函数名,委托编译器根据每一个单,委托编译器根据每一个单独函数的独函数的形参个数、类型和位置的差异形参个数、类型和位置的差异,在幕后进行名称,在幕后进行名称细分并选择合适的函数调用匹配的现象称为函数重载。细分并选择合适的函数调用匹配的现象称为函数重载。void print(double);void print(long);void print(double,char*);void print(char*,double);void f()print(1L);/print(

10、long)print(1.0);/print(double)print(2.0,”hello”);/print(double,char*)print(”hello”,3.0);/print(char*,double)让重载函数执行不同让重载函数执行不同的功能,是不好的编的功能,是不好的编程风格。程风格。3:32:0723匹配重载函数的顺序:匹配重载函数的顺序:(1)严格匹配)严格匹配(2)内部转换(相容类型匹配)内部转换(相容类型匹配)(3)通过用户定义的转换寻找求一个匹配。)通过用户定义的转换寻找求一个匹配。void print(int);void print(double);void fu

11、nction()print(3);print(5.0);print(a);print(3.1415f);void print(long);void print(double);void function()int a;print(a);/有二义性print(long(a);或者print(double(a);3:32:0724重载的内部实现:重载的内部实现:C+用名字粉碎(用名字粉碎(name mangling)(名字细分、名名字细分、名字压轧)的方法来改变函数名。字压轧)的方法来改变函数名。用用v,c,i,f,l,d,r 分别表示分别表示void,char,int,float,long,do

12、uble,longdouble.int f(char a);/f_c int f(char a,int b,double c);/f_cid3:32:0725返回值类型不能够作为重载依据返回值类型不能够作为重载依据(区分、细分重载)区分、细分重载)void func(int);int func(int);fucn(10);/error这样规定保证对重载的解析与环境无关这样规定保证对重载的解析与环境无关 float sqrt(float);double sqrt(double);void f(double da,float fla)float fl=sqrt(da);/调用调用sqrt(doub

13、le)double d=sqrt(da);/调用调用sqrt(double)fl=sqrt(fla);/调用调用sqrt(float)d=sqrt(fla);/调用调用sqrt(float)3:32:07262-3 默认参数的函数默认参数也称为缺省参量。默认参数也称为缺省参量。例例:void delay(int loops);void delay(int loops)if(loops=0)return;for(int i=0;iloops;i+);允许函数默认参数值,是为了让编程简单,让编译器做更多的检查允许函数默认参数值,是为了让编程简单,让编译器做更多的检查错误工作。错误工作。默认参数函数

14、的声明默认参数函数的声明当又有声明又有定义时,定义中不允许默认参数。当又有声明又有定义时,定义中不允许默认参数。若只有定义,则默认参数才可出现在函数定义中若只有定义,则默认参数才可出现在函数定义中将将loops 定义成默认值为定义成默认值为1000 void delay(int=1000);调用时:调用时:delay();delay(2000);3:32:0727默认参数的顺序规定:默认参数的顺序规定:一个函数中可以有多个默认参数,默认参数应从右至一个函数中可以有多个默认参数,默认参数应从右至左逐渐定义,当调用函数时,从左向右匹配参数。左逐渐定义,当调用函数时,从左向右匹配参数。例:例:voi

15、d foo(int a,int b,bool c);void foo(int a,int b,bool c=false);/ok,c是最后一个参数是最后一个参数 void foo(int a,int b=0,bool c);/fail,b不是最后一参数不是最后一参数3:32:0728当调用有默认参数的函数时,从左向右匹配参数。当调用有默认参数的函数时,从左向右匹配参数。#include using namespace std;void fun(int a=1,int b=3,int c=5)couta=a,b=b,c=c,endl;int main()fun();fun(7);fun(7,9)

16、;fun(7,9,11);coutOK;return 0;3:32:0729默认值的规定:默认值的规定:默认值可以是全局变量、全局常量、函数。默认值可以是全局变量、全局常量、函数。不可不可以是局部变量以是局部变量。因为默认值是在编译时确定的,。因为默认值是在编译时确定的,必须是静态确定的。必须是静态确定的。3:32:0730函数重载与函数默认参数:(1)默认参数不能用于细分重载函数。例1:void func(int,int);void func(int=3,int=4);func(22,32);例2:void func(int);void func(int,int);是重载函数 而void f

17、unc(int);void func(int,int=4);在func(3)调用时有二义性3:32:0731(2)函数重载与函数默认参数:默认函数可将一系列简单的重载函数合成为一个。int month,int day,int year;void Tdate()month=4;day=15;year=1995;void Tdate(int m)month=m;day=15;year=1995;void Tdate(int m,int d)month=m;day=d;year=1995;void Tdate(int m,int d,int y)month=m;day=d;year=y;void T

18、date(int m=4,int d=15,int y=1995)month=m;day=d;year=y;int main()Tdate();Tdate(1);Tdate(1,2);Tdate(1,2,3);return 0;重载函数的功能相同,只是参数个数不同,用默认参数值的方法比较简便重载函数的功能相同,只是参数个数不同,用默认参数值的方法比较简便3:32:0732如果参数值用来确定不同的操作,则用函数重载比较好#include using namespace std;void print();void print(int*);int main()int arr10;int sum=0;

19、for(int i=0;iarri;sum=sum+arri;if(sum100)print(arr);elseprint();return 0;void print(int*pa)coutthe array can be usedendl;for(int i=0;i10;i+)coutpai ;coutendl;void print()coutthe array can not be usedendl;3:32:0733无名参数函数的定义和声明中,都可以省略形参名.void print(int,int);void print(int a,int)coutaendl;void func()pr

20、int(1,2);3:32:07342-4:程序运行时的内存布局(1)代码区(code area):存放程序的代码(各个函数的代码块)(2)全局变量区(data area):存放程序的全局数据和静态数据(3)堆区(heap area):存放程序的动态数据 可以用malloc()与free()以及new和delete 来申请与释放堆内存,也称动态内存、动态数据区。(4)栈区(stack area):存放程序的局部数据(各个函数中的数据)3:32:07353-1:指针1.指针变量的定义与赋值指针是一种数据类型,用于存放内存单元的地址。int*ip;定义同时赋值:int a;int*p=&a;定义之

21、后,单独使用赋值语句:int a,*p;p=&a;int a10,*p;p=a;p=&a0;第三章:第三章:指针和引用指针和引用 3:32:07363.与地址相关的运算 *和&“*”称为指针运算符(间接访问运算符),表示指针所指向的变量的值。一元运算符 int a;int*p=&a;*p=5;“&”称为取地址运算符,用来得到一个对象的地址。一元运算符。*和&是两个互逆的操作,当这两个操作符碰到一起时,其作用相互抵消,例如 *&k=3 与 k=3效果完全相同3:32:07374.用指针处理数组元素例:例:int*p,i,a6=0,1,2,3,4,5;p=a;for(i=0;i6;i+)print

22、f(“%d”,_);ai*(a+i)pi *(p+i)*p+*a+考虑:考虑:的作用的作用 和和*的比较;的比较;越界访问越界访问 数组名和指针数组名和指针(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;(2)数组名的外延在于其能够转换为指向其指代实体的指针,而且是个指针常量;数组名的外延在于其能够转换为指向其指代实体的指针,而且是个指针常量;(3)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是个指针;数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是个指针;#include us

23、ing namespace std;void arrayTest(char str)/char*str,char str10cout sizeof(str)endl;cout+strendl;int main()char str110=“Y and me”;arrayTest(str1);return 0;3:32:07385.void 指针与NULL指针值 (1)void 指针(void *p)空类型指针不指向任何类型,仅仅是一个地址。不能进行指针运算,也不能进行间接引用。*p其他类型指针可以赋值给空类型指针空类型指针经显示转换后方可赋给其他指针。int a=30;int*ip=&a;voi

24、d*vp=ip;/ok 从int*到void*的隐式转换*vp=10;/error vp+;/errorint a;void*p&a;char*q=(char*)p;3:32:0739(2)NULL是空指针值,不指向任何地方。任何类型的指针都可以赋该值。int*ptr=NULL;int*ptr=0;NULL与void*是不同的概念3:32:0740练习题练习题char a=abcdefghij;char*q=a;int*p=(int*)a;while(*q)*q+=*q+1;p+=2;printf(%s,p);/sizeof(char)=1/sizeof(int)=43:32:07416.指针

25、和常量指针和常量 const 说明符说明符const 为指定说明符(也称为常类型说明符),使用指定时,程序执行的为指定说明符(也称为常类型说明符),使用指定时,程序执行的过程中指定的内容不能被改变(冻结)。即一次初始化后,指定的内容始过程中指定的内容不能被改变(冻结)。即一次初始化后,指定的内容始终不变。终不变。(1)定义一般常量)定义一般常量 使用使用const 说明常量:说明常量:int const x=2;或或const int x=2;定义或说明一个常数组可采用如下格式:定义或说明一个常数组可采用如下格式:const 或者或者 const double const a2=1.0,2.0

26、 常量定义时,应被初始化。常量定义时,应被初始化。const int i5;i+;(错误)(错误);const int i;必须初始化;必须初始化;C 中常量定义用中常量定义用#define PI 3.14159 c+中使用中使用const double PI=3.1415;积极使用积极使用const,避免使用宏避免使用宏,可以用可以用const、enum定义常量。定义常量。3:32:0742(2)指针常量和常量指针(指向常量的指针)指针常量和常量指针(指向常量的指针)指针常量:在指针定义语句的指针名前加指针常量:在指针定义语句的指针名前加const,表示指表示指针本身是常量。针本身是常量。i

27、nt a;int*const p=&a;定义时必须初始化定义时必须初始化指针值指针值p不可以修改,指针指向的内容可以修改。不可以修改,指针指向的内容可以修改。即即p是常量,不可以作为左值进行运算,是常量,不可以作为左值进行运算,*p可以修改可以修改 左值:是对应内存数据的一个表达式,左值对应的内存空间左值:是对应内存数据的一个表达式,左值对应的内存空间的内容允许刷新。可以出现在赋值运算符的左侧。的内容允许刷新。可以出现在赋值运算符的左侧。右值:右值指的是引用了一个存储在某个内存地址里的数右值:右值指的是引用了一个存储在某个内存地址里的数据。出现在赋值运算符的右侧。据。出现在赋值运算符的右侧。要

28、求左值运算:要求左值运算:+,-,+=等等常量指针:常量指针:在指针的定义类型前加在指针的定义类型前加const,表示指向的对象是常量。,表示指向的对象是常量。如如const int*pi或或 int const*pi;均可。均可。以上定义表明以上定义表明,*pi是常量,不能将是常量,不能将*pi作为左值进行操作。作为左值进行操作。定义指向常量的指针时,定义时不必须先初始化。定义指向常量的指针时,定义时不必须先初始化。3:32:0743例例:指针常量指针常量 int a10;int*const p=a;int b6;p=b;/错误错误 *p=6;/正确正确 *(p+6)=6;/正确正确 *p+

29、7;/错误错误 const int c0;int*const q&c;/错误错误例:常量指针例:常量指针 const int a=78;const int b=28;int c=18;const int*pi=&a;pi=&b;/ok*pi=68;/errorpi=&c;/ok*pi=88;/errorc=98;/ok int*f=&a;/错误(错误(a本身不能被修改就不允许外界提供修改的漏洞本身不能被修改就不允许外界提供修改的漏洞)3:32:0744(3)指向常量的指针常量指向常量的指针常量(常量指针常量)常量指针常量)形式:形式:const int*const p&a;定义时必须初始化定义

30、时必须初始化 p与与*p都是常量。他们都不能作为左值进行操作都是常量。他们都不能作为左值进行操作 int b10;const static int a100;int*const p=a;错误错误 const int*const pa;正确正确 const int*const qb;正确正确 p+;错误错误 *p1;错误错误 *(a+2)=2;错误错误 *q=5;错误错误 q+;错误错误 b0=5;正确正确 (4)常量的特殊用法:常量的特殊用法:int f(int b)const;3:32:0745重载和const形参(1)void f(int*);void f(const int*);/有效重

31、载,是不是指向const对象(2)void f(int*);void f(int*const);/无效重载,重定义不能基于指针本身是否const 实现重载3:32:08467.堆内存的分配堆内存的分配1堆内存堆内存(heap):堆是一块内存区域,堆允许程序在运行:堆是一块内存区域,堆允许程序在运行时时(而不是编译时而不是编译时),申请某个大小的内存空间。堆内存又,申请某个大小的内存空间。堆内存又称为动态内存。称为动态内存。2获得堆内存获得堆内存c中用函数中用函数malloc()(在头文件在头文件malloc.h中中)来获得堆内存;来获得堆内存;c+中用操作符中用操作符new来获得堆内存。来获得

32、堆内存。3释放堆内存释放堆内存c中用函数中用函数free()(在头文件在头文件malloc.h中中)来释放堆内存;来释放堆内存;c+中用操作符中用操作符delete来释放堆内存。来释放堆内存。3:32:0847使用使用malloc申请空间申请空间void*malloc(unsigned long size);例:例:#include“stdio.h”#include“malloc.h”int main()int*p,i;p=(int*)malloc(10*sizeof(int);for(i=0;i10;i+)scanf(“%d”,p+);p-=10;for(i=0;i10;i+)printf(

33、“%d”,pi);free(p);/只能释放只能释放malloc申请的空间申请的空间 return 0;3:32:0848使用使用new和和delete进行动态内存分配和释放进行动态内存分配和释放 运算符运算符new和和delete是是C+新增的运算符,提供了存储的动态分配和释放功能。新增的运算符,提供了存储的动态分配和释放功能。它的作用相当于它的作用相当于C语言的函数语言的函数malloc()和()和free(),但是性能更为优越。(),但是性能更为优越。使用使用new和和delete:(1)new 类型类型(初始化值)(初始化值);int*p;p=new int(100););/动态分配一

34、个整数并初始化动态分配一个整数并初始化 delete p;(2)new 类型类型 数组大小数组大小int*p;p=new int10;/分配一个含有分配一个含有10个整数的整形数组个整数的整形数组delete p;/删除这个数组删除这个数组使用使用new较之使用较之使用malloc()有以下的几个优点:()有以下的几个优点:(1)new自动计算要分配类型的大小,不使用自动计算要分配类型的大小,不使用sizeof运算符,比较省事,可运算符,比较省事,可以避免错误。以避免错误。(2)自动地返回正确的指针类型,不用进行强制指针类型转换。)自动地返回正确的指针类型,不用进行强制指针类型转换。(3)可以

35、用)可以用new对分配的对象进行初始化。对分配的对象进行初始化。(4)不用使用头文件声明()不用使用头文件声明(malloc.h),更简洁。更简洁。3:32:0849include“stdio.h”int main()int*p,i;p=new int10;for(i=0;i10;i+)scanf(“%d”,p+);p-=10;for(i=0;i10;i+)printf(“%d”,pi);delete p;/只能释放new申请的空间 return 0;3:32:0850new操作符若申请成功,返回首单元地址;否则返回操作符若申请成功,返回首单元地址;否则返回NULL值。值。int*p=new

36、int10;if(p=NULL)/if(!p)或者 if(p=0)cout“cant allocate more memory!n”;exit(1);/exit是在调用处强行退出程序/exit(1)表示异常退出.exit(0)表示正常退出 3:32:0851动态空间:动态申请二维数组3:32:08528.函数指针和指针函数函数指针和指针函数(1)指针函数:返回指针值的函数。指针函数:返回指针值的函数。定义格式:类型修饰符定义格式:类型修饰符*函数名(形参表)函数名(形参表)函数体函数体 int*f(int a);(2)函数指针:指向函数地址(程序区)的指针。与函数名等价的)函数指针:指向函数地

37、址(程序区)的指针。与函数名等价的指针。函数名是指向函数的指针常量。指针。函数名是指向函数的指针常量。函数指针定义函数指针定义 若函数原型为:类型若函数原型为:类型 函数名函数名(形参表形参表);则相应函数指针定义为:则相应函数指针定义为:类型类型(*变量名变量名)(形参表形参表);/()的优先级大于()的优先级大于*char*p(int);char(*p)(int);例:例:int f1(int n);int(*pf1)(int n);pf1=f1;/pf1是与是与f1等价的函数指针等价的函数指针指针函数用来申请空间或者查找数据;指针函数用来申请空间或者查找数据;函数指针用来临时制定参与运算

38、的函数;函数指针用来临时制定参与运算的函数;3:32:0853(3)通过函数指针来调用函数通过函数指针来调用函数例:例:int add(int a,int b)return a+b;int main()int(*p)(int,int);p=add;/p是与是与add等价的函数指针等价的函数指针 coutadd(3,5);cout(*p)(3,5);/四种调用形式效果等价四种调用形式效果等价 coutp(3,5);cout(*add)(3,5);return 0;结果:结果:88883:32:08544函数指针作函数形参函数指针作函数形参 例:计算以例:计算以0.10为步长,特定范围内的三角函数

39、之和。为步长,特定范围内的三角函数之和。#include#include double sigma(double(*func)(double),double dl,double du)double dt=0.0;for(double d=dl;ddu;d+=0.1)dt+=func(d);return dt;int main()double dsum;dsum=sigma(sin,0.1,1.0);coutthe sum of sin from 0.1 to 1.0 isdsumendl;dsum=sigma(cos,0.5,3.0);coutthe sum of cos from 0.5 t

40、o 3.0 isdsumendl;return0;3:32:08555.用用typedef 来简化函数指针来简化函数指针(1)typedef int(*FUN)(int a,int b);int f(int,int);FUN funp=f;FUN 不是指针变量,是指针类型名。不是指针变量,是指针类型名。(2)typedef int FUNC(int,int);/先定义函数类型先定义函数类型FUNC*funp=f;6.函数的返回类型可以是函数指针函数的返回类型可以是函数指针 typedef int(*SIG)();typedef void(*SIGARG)();SIG signal(int,SI

41、GARG);3:32:08563-2 引 用1.引用(reference)的概念 为一个变量、函数等对象规定一个别名,该别名称为引用。此后,对别名的操作即是对别名所代表的对象的操作。对象:存储器中一片连续的对象:存储器中一片连续的区域;区域;*(a+10)=7左值:就是引用某个对象的左值:就是引用某个对象的表达式表达式3:32:08572声明引用:声明引用格式如下:格式:类型标识符格式:类型标识符&别名;别名;例例1:int i=0;int&ir=i;/定义引用定义引用ir作为对象作为对象i的别名的别名 ir=2;int*p=&ir;/等同于等同于int*p=&i;如果:如果:int j;in

42、t&i=j;则则i=j;&i=&j;声明引用,不为之分配内存空间。声明引用,不为之分配内存空间。例例2:int a10,*p=a;int&ra1=a6;/ra1代表数组元素代表数组元素a6 int*&rp1=p;/rp1代表指针变量代表指针变量p int&rp2=*p;/rp2代表代表p所指向的那个对象,所指向的那个对象,/即数组元素即数组元素a0 3:32:08583引用必须初始化。引用一旦被声明则不能再修改引用一旦被声明则不能再修改.Int j,k;int&sj;int&s=k;(错误错误)int&i;错误错误extern int&r3/ok,r3在别处初始化在别处初始化int*i;int

43、 k;int*&j=i;j=&k;k=5;int*&l=j;cout*j*i*l;注意:为提高可读性,引用与变量、指针定义尽量不在同一行。尽量避免这样的语句int a,&ra=a,*p=&a;3:32:0859void&a=3;/errorvoid 本质不是一个类型,只是在语法上相当于一个类型,没有该类型的对象。3:32:08604、引用的使用参数传递、引用的使用参数传递void swap(int&,int&);void swap1(int*,int*);void swap2(int,int);int main()int a=1,b=2;swap2(a,b);coutab;swap1(&a,&

44、b);coutab;swap(a,b);coutab;return 0;void swap(int&a1,int&b1)int c;c=a1;a1=b1;b1=c;void swap1(int*a1,int*b1)int c;c=*a1;*a1=*b1;*b1=c;void swap2(int a1,int b1)int c;c=a1;a1=b1;b1=c;形参和实参结合规则:形参和实参结合规则:形参为引用时,形参形参为引用时,形参(引用引用)接收实参接收实参(对象对象)的地址。的地址。或表述为:或表述为:形参为引用时,凡遇到形参形参为引用时,凡遇到形参(引用引用)的的地方,全部用实参地方,全

45、部用实参(对象对象)来代替。来代替。传递引用给函数与传递指针的效果相传递引用给函数与传递指针的效果相同。同。可读性比指针传递好(传值方式的调可读性比指针传递好(传值方式的调用与可读性,性能却强于传值方式)用与可读性,性能却强于传值方式)参数结合符合初始化标准参数结合符合初始化标准可使用引用传递从函数返回多个值可使用引用传递从函数返回多个值(指针和引用都可以)(指针和引用都可以)3:32:08615.引用和指针的关系引用和指针的关系 指针是个变量,可再赋值;指针是个变量,可再赋值;而引用建立时必须进行初始而引用建立时必须进行初始化并且决不会再关联其它不同的变量。化并且决不会再关联其它不同的变量。

46、指针操纵两个实体(指针值、指向的值);引用只能操纵指针操纵两个实体(指针值、指向的值);引用只能操纵一个实体。一个实体。引用在内部用指针实现引用在内部用指针实现,被看成是指针常量,不能操作自,被看成是指针常量,不能操作自身的地址值,只能访问所指向的实体。身的地址值,只能访问所指向的实体。在语言层面,引用的用法和对象一样;在二进制层面,引在语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转用一般都是通过指针来实现的,只不过编译器帮我们完成了转换换 实际上实际上“引用引用”可以做的任何事情可以做的任何事情“指针指针”也都能够做,为什也都能够做,为

47、什么还要么还要“引用引用”?答案是答案是“用适当的工具做恰如其分的工作用适当的工具做恰如其分的工作”。指针能够毫无约束地操作内存中的东西,尽管指针功能强指针能够毫无约束地操作内存中的东西,尽管指针功能强大,但是非常危险。大,但是非常危险。引用是指针出于安全考虑的替代品。引用是指针出于安全考虑的替代品。3:32:0862 在以下情况下你应该使用指针:一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空)二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。3:32:08636.

48、用const 限定引用用const 限定引用声明方式:Int i;const int&p=i;用这种方式声明的引用不能通过引用对目标变量的值进行修改,保证了引用的安全性。作为参数可以保证在函数执行时不被修改 int i;const int*p&i;const int&p=i;效率相同3:32:0864double&dr=1;/errorconst double&cdr=1;/ok解释是解释是:double temp=double(1);const double&cdr=temp;注意:注意:c+不分变量的不分变量的const引用,和引用,和const变量的引用,变量的引用,因为引用本身就不能重

49、新赋值,使它指向另一个变量。因为引用本身就不能重新赋值,使它指向另一个变量。即没有即没有const int const&a=1,只有只有const double&a=1 3:32:08657.引用的使用用引用返回值float t;float f1(float r)float k;k=3.14*r*r;coutf1:k is&kendl;return(k);float&f2(float r)t=3.14*r*r;coutf2:t is&tendl;return(t);float&f3(float r)float f;f=3.14*r*r;coutf3:f is&fendl;return(f);i

50、nt main()float a=f1(5);const float&b=f1(5);coutb:&bendl;couta=a,b=bendl;float c=f2(5);float&d=f2(5);coutd:&dendl;coutc=c,d=dendl;float e=f3(5);float&f=f3(5);coute=e,f=f60)return(a);if(k30)return(b);if(k=30)return(c);int main()int i,j;for(i=0;ij;count(j)+;coutabc;return 0;3:32:08689.返回堆中变量的引用返回堆中变量的引

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

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(C++程序设计-培训课件-完整版-377p.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|