教育专题:C++高级编程-第一讲

上传人:痛*** 文档编号:244771420 上传时间:2024-10-06 格式:PPT 页数:36 大小:623KB
返回 下载 相关 举报
教育专题:C++高级编程-第一讲_第1页
第1页 / 共36页
教育专题:C++高级编程-第一讲_第2页
第2页 / 共36页
教育专题:C++高级编程-第一讲_第3页
第3页 / 共36页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,C+高级编程,第一讲:,c+,语言特性,主讲人:步磊峰 UIPower,第一节:基本内置类型,内置类型的种类,要学习,C+,,你首先得了解它里面包含了哪些内置类型,它的最小存储空间是多少?不然你就不能运用好,C+,。,C+,基本内置类型有,bool,、,char,、,wchar_t,、,short,、,int,、,long,、,float,、,double,、,long double,基本内置类型的存储空间依机器而定。,c+,标准规定了每个算术类型的最小存储空间,第一节:基本内置类型,内置类型的种类,运行下面这段代码就能知道当前系统下,内置类型的最小存储空间是多少,第一节:基本内置类型,内置类型的种类,运行结果如图:,第二节:变量,变量名,变量名,即变量的标识符,由字母、数字和下划线组成变量名必顺以字母或下划线开头,并且区分大小写字母:,C+,的,的标识符都是大小写敏感的。,第二节:变量,初始化,对于许多,C+,编程新手,使用,=,来初使化变量常常感到迷惑,他们很容易把初始化当成是赋值的一种形式。但是在,C+,中初始化和赋值是两种不同的操作。虽然在内置类型中,复制初始化和直接初始化没有什么差别。但是在一些复杂的类,中,区分复制和初始化就显得很重要了,在这里大家还得注意一点的就是,在关于初始化变量时,建议每个内置类型的对象都要初始化。虽然这样做并不总是必,需的,但是会更加容易和安全、除非你确定忽略初始化式不会带来风险。因为未初始化的变量会引起运行问题,第二节:变量,const,限定符,const,放在变量的前面称为,const,常量,如:,const int MaxSize=100;/,定义一个常量,MaxSize=59;/,试图修改,MaxSize,常量,这一句在编译的时候就要出错,const,对象在文件默认为局部变量,也就是说,如果你想在其它文件里使用这个,const,变量,你必需在定义的时候前面加,上,extern,关键字,如:,/file1.cpp,extern const int MAX_COUNT=20;/,定义和初始化并声明为,extern,/file2.cpp,extern const int MAX_COUNT;/,使用,MAX_COUNT,常量从,file1.cpp,文件中,注:非,const,变量默认是,extern,。因此不需要在变量前面添加,extern,符号,第二节:变量,引用,引用,(reference),就是对象的另一个名字。在实际程序中,引用主要用作函数的形式参数。,引用必需用与该引用同类型的对象初始化,如:,int ival=1024;/ok,int/ok,int /,错误,引用必需初始化。,Int /,错误,初始化必需是一个对象,前面说过,引用其实就是对象的别名,因此在对一个引用操作时,实质是在对引用的那个变量进行操作,如:,int ival=1024;,int,refval+=2;,cout refval=refval endl;,cout ival=ival endl;,这段代码对,refval,引用进行加,2,操作就是对,ival,变量加,2,操作,第二节:变量,typedef,名字,typedef,可以用来定义类型的同义词,如:,typedef double WAGES;,WAGES hourly;,typedef,定义以关键字,typedef,开始,后面是数据类型和标识符,,typedef,并没有引入新的类型,而只是现有数据类型的,同义词。,typedef,通常被用于以下三个目的:,1,)为了隐藏特定类型的实现,强调使用类型的目的。,2,)简化复杂的类型定义,使其更易理解。,3,)允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。,第二节:变量,枚举,默认情况下,枚举的第一个成员赋值为,0,,后面的每个枚举成员赋的值比前面的值大,1,。,如:,enum Week Sun,Mon=5,Tue,Wed;,在,Week,枚举中,,Sun,默认为,0,,,Mon=5,Tue=6,Wed=7,。,第三节:数组,数组的定义和初始化,数组是由类型名、标识符和维数组成的复合数据类型,类型名规定了存放在数组中的元素的类型,而维数则指定数组中,包含的元素个数。如,:,int a10;,char ch10;,double dArray3;,第三节:数组,数组的定义和初始化,任何数组,不论是静态声明的还是动态创建的,其所有元素在内存中都是连续字节存放的,也就是说保存在一大块连续,的内存区中。如,Array.cpp,:,第三节:数组,数组的定义和初始化,Array.cpp,运行结果如图:,第三节:数组,数组的定义和初始化,初始化数组,如下:,int a4=8,9,5,3;,int b=7,9,2;,上述初始化方式叫做显示初始化,在显示初始化时不用指定数组的维数。如上,b,数组,当然你也可以先定义数组,然后用一个循环来对其初始化,如:,int elem3;,for(int i=0;i3;i+),elemi=i+1;,数组不允许直接赋值变量,如,int b=a;/,这里是不允许的,第三节:数组,数组操作,CopyArray.cpp,代码如下:,第四节:指针,什么是指针,指针的概念很简单:指针用于指向对象,具体来说,指针保存的是另一个对象的地址。,指针的定义如下:,int a=10;,int*pInt=,vector*pev;,char*pCh;,第四节:指针,指针初始化,指针进行初始化或赋值只能使用以下四种类型的值:,1,),0,常量表达式,2,)类型匹配的对象的地址,3,)另一个对象之后的下一地址,4,)同类型的另一个有效指针,如:,int*p=0;/,把,p,指针初始化为,0,int ival=2;,p=/,把,p,初始化为类型匹配的对象的地址,int*p2=p;/,把,p2,初始化为同类型的另一个有效指针,注意:避免使用未初始化的指针,很多运行时错误都源于使用了未初始化的指针。,第四节:指针,void*,指针,C+,提供了一种特殊的指针类型,void*,,它可以保存任何类型对象的地址,如:,double obj=3.24;,double*pd=,void*pv=,pv=pd;,void*,指针只支持几种有限的操作:与另一个指针进行比较;向函数传递,void*,指针或从函数返回,void*,指针;给另一个,void*,指针赋值。不允许使用,void*,指针操纵它所指向的对象。,第四节:指针,指针和引用的比较,使用引用,(reference),和指针都可间接访问另一个值,但它们之间有两个重要区别。,1,)引用总是指向某个对象:定义引用时没有初始化是错误的。,2,)赋值行为的差异:给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联。引用一经初始,化,就始终指向同一个特定对象,第四节:指针,指针和引用的比较,编写代码修改指针的值;修改指针所指对象的值。如:,ModifyPointer.cpp,第四节:指针,指针和引用的比较,ModifyPointer.cpp,运行结果如图:,第四节:指针,指向指针的指针,指针本身也是可用指针指向的内存对象。指针占用内存空间存放其值,因此指针的存储地址可存放在指针中。,PointerToPointer.cpp,代码如下:,第四节:指针,指向指针的指针,PointerToPointer.cpp,程序运行结果如下:,第四节:指针,指针的算术操作,PointerOperate.cpp,程序代码如下:,第四节:指针,指针的算术操作,PointerOperate.cpp,程序运行结果如图:,第四节:指针,指针和,const,限定符,指向,const,对象的指针,ConstPointer.cpp,程序代码如下:,第四节:指针,指针和,const,限定符,const,指针,程序代码如下:,第四节:指针,指针和,const,限定符,有的人对于,const,指针的写法不好理解,在这里大家可以从右往左读,比如上面那句读成指向,double,对象的,const,指针。,如果我们希望指针不能修改本身并且也不修改指针所指向对象的值,那应该怎么表述呢?其实只需要综合上面讲的两种,指针就好了,如:,const int val =9;,const int*const pInt=,这样,pInt,既不能修改所指对象的值,也不允许修改该指针的指向。,第五节:创建动态数组,在有些情况,编译无法知道数组的大小;比如:读一个文件,这个时候我们开多大的,buf,来装数据呢?答案是不知道的。,因此我们需要在知道一个文件的大小后,在分配一个数组来装数据,创建动态数组就能解决这种情况。,我们可以像这样去定义,如:,int*pBuf=new int1024;,创建动态数组,不是没有代价的,你,new,了一个新的数组,却没有,delete,掉数组,那么你就有内存泄漏的风险,因此在,不需要的时候要调用,delete,删除数组,如:,if(pBuf),delete pBuf,pBuf=NULL;,第六节:多维数组,严格地说,,C+,中没有多维数组,通常所指的多维数组其实就是数组的数组。,这里我们只说说二维数组,先来看看二维数组的定义和初始化,我们来看一段代码,int a23;/,数组的定义,int b23=0,1,2,4,5,6;/,数组的初始化,int c23=0,1,2,3,4,5;/,数组的初始化,上面的代码演示了二维数组的定义和初始化,注意,我们在使用二维数组的时候要按照,“,先行后列,”,的方式来访问,如:,这个大家可以下来做下实验,这里我给出理由,我们假设一个内存页为,4096,字节,并且定义一个数组,b1281024,,其,列数为,1024,(即每一行的元素恰好占用一页),当你用,“,先行后列,”,方式时,外层循环走过每一行,正好走完一页,没,有发生页面调度。当循环进入下一行时操作系统从外存调入下一页,因此,我们可以知道,遍历完后次数最多为,128,次。,但是你用,“,先列后行,”,方式来遍历的话,可能在遍历完后页面调度交数变成了,1024*128,。这将大大降低效率,第七节:,new,和,delete,表达式,三条警告,提醒大家注意:,1,)对分配的数组进行,delete,删除,不能误用成,delete,删除,如果用的是,delete,,那么只会删除数组的第,1,个元素内存,,后,面的内存就丢失了,容易造成内存泄漏。,2,)读写已删除的对象。如果删除指针后,没有把指针置为,0,,那么就会造成野指针。,3,)对同一个内存空间使用两个,delete,表达式。当第一次删除时,对象的内存空间返还给自由存储区,当第二次删除时,,此时自由存储区可能会被破坏。,第八节:强制类型转换,在编写程序中,难免会遇到类型转换,在,C,语言中用,(),括号来转换,,C+,继承了这种用法,但是它有一个明显的一个缺陷,,就是不会进行类型检测,不能保证满足转换。在,C+,里还提供了四种类型转换:,static_cast,、,const_cast,、,dynamic_cast,以及,reinterpret_cast,。我们应该避免使用强制类型转换,但如果一定要用的话,推荐使用,C+,里的那四,种类型转换,因为它们会执行类型检测。,第八节:强制类型转换,static_cast,可以使用,static_cast,显式地执行,C+,语言直接支持的转换。当需要将一个较大的算术赋值给较小的类型时,如:,double d=7.8;,int n=static_cast(d);,第八节:强制类型转换,const_cast,const_cast,最为直接,是将转换掉表达式的,const,性质。似乎从理论上讲,一个变量是,const,,那么就应该一直是,const,。,然而实际上,有时候你会发现有这种情况,比如我们在使用第三方的库时候,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!