(精品)C++面向对象程序设计教学PPT2.ppt
《(精品)C++面向对象程序设计教学PPT2.ppt》由会员分享,可在线阅读,更多相关《(精品)C++面向对象程序设计教学PPT2.ppt(107页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第2章章C+基基础础本章主要介绍本章主要介绍C+对对C语言的某些改变和扩展,语言的某些改变和扩展,是面向对象方面的特征,包括:是面向对象方面的特征,包括:C+的数据类型的数据类型 类型转换类型转换 const常量、引用、指针及函数参数常量、引用、指针及函数参数 函数原型、默认参数、函数重载函数原型、默认参数、函数重载 内联函数内联函数 名字空间及其应用名字空间及其应用 变量作用域和生存期变量作用域和生存期 数据输入数据输入/输出输出2.1C+对对C语言数据类型的扩展语言数据类型的扩展1、C数据类型在数据类型在C+中继续可用中继续可用2、C+对对C的结构、枚举、联合进行了扩展的结构、枚举、联合
2、进行了扩展C:结构名不是类型结构名不是类型structsome_struct;structsome_structstruct_var;typedefstructsome_structstruct_type;C:结构名、联合名为类型结构名、联合名为类型structstruct_name;struct_tstruct_var;unionenum2.2局部变量说明局部变量说明C局部变量的定义局部变量的定义在语句块内可执行语句之前在语句块内可执行语句之前C局部变量的定义局部变量的定义可在语句块内任何语句可以出现的地方可在语句块内任何语句可以出现的地方但不能被但不能被goto及类似语句跳过及类似语句跳过
3、好处好处方便:使用时才定义方便:使用时才定义易读:类型信息就近获取易读:类型信息就近获取2.3const常量常量1、常量定义、常量定义C#define 常量名称常量名称 常量常量Cconst 类型类型 常量名称常量名称=常量常量;常量在定义常量在定义时就必须初时就必须初始化始化2.3const常量常量1、常量定义、常量定义C#define 常量名称常量名称 常量常量Cconst 类型类型 常量名称常量名称=常量常量;2.3const常量常量2、常量说明、常量说明常量一经定义就不能修改,例如:常量一经定义就不能修改,例如:constinti=5;/定义常量定义常量ii=10;/错误,修改常量错误
4、,修改常量i+;/错误,修改常量错误,修改常量const常量必须在定义时初始化,例如:常量必须在定义时初始化,例如:constintn;/错误,常量错误,常量n未被初始化未被初始化在在C+中,表达式可以出现在常量定义语句中。如中,表达式可以出现在常量定义语句中。如果定义的常量是整型,则类型关键字果定义的常量是整型,则类型关键字int可以省略。可以省略。intj,k=9;/L1consti1=10+k+6;/L2constinti1=10+k+6;/L31、C+内存分配内存分配静态分配(静态变量)静态分配(静态变量)编译器在处理源代码时为变量分配内存,其效率较高,但编译器在处理源代码时为变量分配
5、内存,其效率较高,但缺少灵活性(要求程序执行之前就知道变量所需的内存类缺少灵活性(要求程序执行之前就知道变量所需的内存类型和数量)型和数量)动态分配(动态变量)动态分配(动态变量)程序执行时调用运行时刻库函数来分配变量的内存。程序执行时调用运行时刻库函数来分配变量的内存。两者的区别两者的区别静态变量是有名字的变量,可以通过名字对它所代表的内静态变量是有名字的变量,可以通过名字对它所代表的内存进行操作;动态变量是没有名字的内存变量,只能通过存进行操作;动态变量是没有名字的内存变量,只能通过指针进行操作。指针进行操作。静态变量的分配和释放由编译器自动处理,动态变量的分静态变量的分配和释放由编译器自
6、动处理,动态变量的分配与释放必须由程序员控制。配与释放必须由程序员控制。2.4指针指针本节主要介绍本节主要介绍C+的指针及的指针及C+动态内存分配运算符和动态内存分配运算符和回收运算符回收运算符new、delete指针与常量指针与常量之间的关系,及之间的关系,及0指针指针和和void指针指针2.4指针指针1、C+内存分配内存分配静态分配(静态变量)静态分配(静态变量)编译器在处理源代码时为变量分配内存,其效率较高,但编译器在处理源代码时为变量分配内存,其效率较高,但缺少灵活性(要求程序执行之前就知道变量所需的内存类缺少灵活性(要求程序执行之前就知道变量所需的内存类型和数量)型和数量)动态分配(
7、动态变量)动态分配(动态变量)程序执行时调用运行时刻库函数来分配变量的内存。程序执行时调用运行时刻库函数来分配变量的内存。两者的区别两者的区别静态变量是有名字的变量,可以通过名字对它所代表的内静态变量是有名字的变量,可以通过名字对它所代表的内存进行操作;动态变量是没有名字的内存变量,只能通过存进行操作;动态变量是没有名字的内存变量,只能通过指针进行操作。指针进行操作。静态变量的分配和释放由编译器自动处理,动态变量的分静态变量的分配和释放由编译器自动处理,动态变量的分配与释放必须由程序员控制。配与释放必须由程序员控制。2.4.1指针指针概念的回顾概念的回顾2、动态内存分配、动态内存分配-指针指针
8、对类型对类型T,T*是是“到到T的指针的指针”,即一个类,即一个类型为型为T*的变量,能存一个类型的变量,能存一个类型T的对象的地的对象的地址址charc;c=a;charp*p=&c;2.4.1指针指针概念的回顾概念的回顾pc?a?&c*P内存指针是一个复杂的概念,它能够指向(保存)指针是一个复杂的概念,它能够指向(保存)不同类型变量的内存地址。例如:不同类型变量的内存地址。例如:int*pi;/pi是指向是指向int的指针的指针int*pc;/pc是指向是指向int指针的指针指针的指针int*pA10;/pA是指向是指向int的指针数组的指针数组int(*f)(int,char);/f是指
9、向具有两个参数的函数的指针是指向具有两个参数的函数的指针int*f(int)/f是一个函数,返回一个指向是一个函数,返回一个指向int的指针的指针2.4.1指针指针概念的回顾概念的回顾0指针指针0是一个整数,在是一个整数,在C语言和语言和C+中可以把它转换成为中可以把它转换成为任意数据类型,如整型、浮点型、指针等。可以把任意数据类型,如整型、浮点型、指针等。可以把0赋值给不同类型的变量。赋值给不同类型的变量。没有任何变量会被分配到地址没有任何变量会被分配到地址0,所以,所以0就可以作为就可以作为一个指针常量,表明指针当时没有指向任何变量。一个指针常量,表明指针当时没有指向任何变量。比如,对于前
10、面的指针定义,以下赋值是正确的:比如,对于前面的指针定义,以下赋值是正确的:pc=0;pA=0;f=0;0与与NULL2.4.2指针指针与与02.4.3指针与指针与const1、指针与、指针与const的限定关系的限定关系pp?a?&cInt const*p=&cP为常量,即此内存的值不能修改const char*p=&c*P为常量,即此内存的值不能修改2、限制变量、参数的访问,避免非本意的数据修改避免非本意的数据修改举例#includemain()inti,j;constintic=100;constint*ip=⁣int*consticp=&i;/icp=&j;/err*icp=20
11、0;couti=iendl;coutj=jendl;cout*ip=*ipendl;cout*icp=*icpendl;icpicp是一个常是一个常量地址量地址,此处此处企图修改它企图修改它2.4.3指针与指针与const3、指向常量的指针、指向常量的指针在指针定义前加在指针定义前加const,表示指向的对象是常量。表示指向的对象是常量。constinta=78;constintb=28;intc=18;constint*pi=&a;/定义指向常量的指针定义指向常量的指针*pi=58;/error,不能修改指针指向的常量不能修改指针指向的常量pi=&b;/ok,指针值可以修改指针值可以修改*p
12、i=68;/errorpi=&c;/ok*pi=88;/errorC=98;/ok*p p是常量,但通过是常量,但通过修改的值而使修改的值而使*p p发生了变化,这种发生了变化,这种用法就有问题了,用法就有问题了,2.4.3指针指针与与const例题例题:限制函数修改参数限制函数修改参数/eg.cpp#includevoidmystrcpy(char*Dest,constchar*Src)while(*Dest+=*Src+);voidmain()chara20=Howareyou!;charb20;mystrcpy(b,a);coutbendl;2.4.3指针指针与与const4、指针常量、
13、指针常量在指针定义语句的指针名前加在指针定义语句的指针名前加const,表示指针本身是表示指针本身是常量。例如:常量。例如:char*constpc=“aaaa”;/定义指针常量定义指针常量,在定义时必须初始化,在定义时必须初始化pc=“bbbb”;/error,指针常量不能改变其指针值指针常量不能改变其指针值*pc=“a/err,所指的内容可改所指的内容可改*pc=a;/ok*(pc+1)=b;/ok,pc+=y;/errorconstintb=28;int*constpi=&b;/error,pi不能变不能变,但它所指的内存单却但它所指的内存单却可以改变可以改变,此处却将它指向了一个不可变
14、的内存单元此处却将它指向了一个不可变的内存单元,即即:/不能将不能将constin*转换成转换成int*2.4.3指针指针与与const5、指向常量的常指针、指向常量的常指针可以定义一个指向常量的常指针变量,它必须在定义时进行初始化。例如:constintci=7;intai=8;constint*constcpc=&ci;/指向常量的指针常量指向常量的指针常量constint*constcpi=&ai;/okcpi=&ai;/error,指针不能修改指针不能修改*cpi=39;/error,不能修改所指对象不能修改所指对象ai=39;/ok,2.4.3指针指针与与const6、const、指
15、针与变量赋值、指针与变量赋值一般编译器不能跟踪指针在程序中任意一般编译器不能跟踪指针在程序中任意一点所指向的对象一点所指向的对象,任何一个任何一个“企图将企图将一个非一个非const对象的指针指向一个常量对象的指针指向一个常量对象对象”的动作都将引起编译错误。的动作都将引起编译错误。constdoubleminWage=9.60;double*ptr=&minWage;2.4.3指针指针与与constconst对象的地址只能赋值给指向对象的地址只能赋值给指向const对象的对象的指针,但是指向指针,但是指向const对象的指针却可以被赋对象的指针却可以被赋于一个非于一个非const对象的地址。
16、对象的地址。constdoubleminWage=9.60;constdouble*ptr=&minWage;doubledval=3.14;ptr=&dval;*ptr=23;dval=23;2.4.3指针指针与与const2.4.3指针指针与与const练习练习1、下面的声明中,哪些是错误的?、下面的声明中,哪些是错误的?inti;constintic;constint*pic;int*constcpi;constint*constcpic;未初始未初始化化2.4.3指针指针与与const练习练习2、指出下面的错误、指出下面的错误1.inti=-1;2.constintic=i;3.con
17、stint*pic=⁣4.int*constcpi=⁣5.constint*constcpic=⁣6.i=ic;7.pic=⁣8.cpi=pic;9.pic=cpic;10.cpic=⁣11.ic=*cpic;错误错误2.4.4void指针指针1、指针与地址、指针与地址每个每个指针指针都都是是一个一个内存地址内存地址,但都,但都有有一个相关的一个相关的类型类型指示编译器指示编译器怎样解释它所指定内存区域的内容,以及该内存区域应该怎样解释它所指定内存区域的内容,以及该内存区域应该跨越多少个内存单元。跨越多少个内存单元。相同类型相同类型的指针进行的指针进行比较比较或或
18、相互赋相互赋值值才有意义。才有意义。2、void*指针指针void*指针只表示与它相关的值是个地址,但该地址的数据指针只表示与它相关的值是个地址,但该地址的数据类型是未知的。它是能够接受任何数据类型的特殊指针。类型是未知的。它是能够接受任何数据类型的特殊指针。void*最重要的用途是作为函数的参数,向函数传递一个类最重要的用途是作为函数的参数,向函数传递一个类型可变的对象。另一种用途就是从函数返回一个无类型的型可变的对象。另一种用途就是从函数返回一个无类型的对象,在使用时再将它显式转换成适当的类型。对象,在使用时再将它显式转换成适当的类型。1、动态存储管理的概念、动态存储管理的概念系统为每个程
19、序提供了一个在程序执行时可用系统为每个程序提供了一个在程序执行时可用的内存空间,这个内存空间被称为的内存空间,这个内存空间被称为空闲存储区空闲存储区或或堆堆(heap),运行时刻的内存分配就称为),运行时刻的内存分配就称为动动态内存分配态内存分配。2、在、在C语言中,动态内存分配用语言中,动态内存分配用mallc和和free函数函数完成完成int*ip=(int*)malloc(sizeof(int)*100);free(ip);2.4.5new和和delete3、C动态内存分可由动态内存分可由new,delete运算符完成运算符完成New用于从内存中分配指定大小的内存用于从内存中分配指定大小
20、的内存用法用法1:p=newtype;用法用法2:p=newtype(x);用法用法3:p=newtypen;delete用于释放用于释放new分配的堆内存分配的堆内存用法用法1:deletep;用法用法2:deletep;2.4.5new和和delete2.4.5new和和delete4、【例例2-4】用用new和和delete分配与释放堆内存。分配与释放堆内存。/Eg2-4.cpp#includevoidmain()int*p1,*p2,*p3;p1=newint;/分配一个能够存放分配一个能够存放int类型数据的内存区域类型数据的内存区域p2=newint(10);/分配一个分配一个in
21、t类型大小的内存区域,并将类型大小的内存区域,并将10存入其中存入其中p3=newint10;/分配能够存放分配能够存放10个整数的数组区域个整数的数组区域*p1=5;*p3=1;p31=2;/访问指向数组的数组元素访问指向数组的数组元素p32=3;coutp1address:p1value:*p1endl;coutp2address:p2value:*p2endl;coutp30address:p3value:*p3endl;coutp31address:&p31value:p31endl;deletep1;/释放释放p1指向的内存指向的内存deletep2;deletep3;/错误,只释放
22、了错误,只释放了p3指向数组的第指向数组的第1个元素个元素deletep3;/释放释放p3指向的数组指向的数组2.4.5new和和delete5、new、delete和和malloc、free的区别的区别new能够自动计算要分配的内存类型的大小,能够自动计算要分配的内存类型的大小,不必用不必用sizeof计算所要分配的内存字节数计算所要分配的内存字节数new不需要进行类型转换,它能够自动返回不需要进行类型转换,它能够自动返回正确的指针类型。正确的指针类型。new可以对分配的内存进行初始化。可以对分配的内存进行初始化。new和和delete可以被重载,程序员可以借此扩可以被重载,程序员可以借此扩
23、展展new和和delete的功能,建立自定义的存储分的功能,建立自定义的存储分配系统。配系统。sizeof()被改为被改为sizeof2.5引用(引用(Reference)1、概念、概念“引用引用”即即“别名别名”,即是某对象的另一个名字,即是某对象的另一个名字,引用的主要用途是为了描述函数的参数和返回值。引用的主要用途是为了描述函数的参数和返回值。特别是用于运算符的重载。特别是用于运算符的重载。定义引用:定义引用:类型类型&引用名引用名=变量名变量名;例如:例如:inti=9;/L1int&ir=i;/L2ir与与i是同一实体的不同名称是同一实体的不同名称与指针区别与指针区别int*ip=&
24、i;int&ir=i;2.5引用(引用(Reference)2、【例例2-5】引用的简单例子。引用的简单例子。/Eg2-5.cpp#includevoidmain()inti=9;int&ir=i;couti=iir=irendl;ir=20;couti=iir=irendl;i=12;couti=iir=irendl;couti的地址是:的地址是:&iendl;coutir的地址是:的地址是:&irendl;3、使用引用应该注意的事情、使用引用应该注意的事情引用不是值,不占用存储空间引用不是值,不占用存储空间引用在声明时必须初始化,否则会产生编译错误引用在声明时必须初始化,否则会产生编译错误
25、引用的初始值可以是一个变量或另一个引用引用的初始值可以是一个变量或另一个引用引用可以视为引用可以视为“隐式指针隐式指针”,但不分配存储空间,但不分配存储空间引用由引用由类型标准符和一个取地址操作符来定义类型标准符和一个取地址操作符来定义,必须被初始,必须被初始化,且不可重新赋值化,且不可重新赋值inti,k;int&r=i;r=&k/errorr=k;/ok引用的地址就是其所引用的变量的地址引用的地址就是其所引用的变量的地址intnum=50;int&rnum=num;int*p=#/p是指向是指向num的指针,非引用;的指针,非引用;int*rp=rnum;/err,当为,当为int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 C+ 面向 对象 程序设计 教学 PPT2
限制150内