您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 第三章C++语言导论
第三章C++语言导论§1面向对象的程序设计由于对于面向对象的分析与设计方法与软件工程早期推出的分析与设计方法存在本质的差别,因此,从二十世纪八十年代中期便陆续出现了支持面向对象的分析与设计方法的高级语言及其开发工具系统。著名的有C++、JAVA、SmallTalk、Delphi等。本章则将围绕最重要C++语言展开论述。C++语言源于C语言的摇篮—著名的贝尔(BELL)实验室。二十世纪八十年代初美国AT&T贝尔(BELL)实验室的Bjarne.Stroustrup博士开发出了第一个C++语言编译器。最初的研究成果主要是用于小型计算机系统。直至一九八八年才出现了第一个用于PC的ZORTECHC++2.0编译系统,次年出现了TURBOC++2.0编译器。紧跟着BorLand公司从1991年起陆续推出了BorlandC++2.0/3.0/4.0系统。相比之下Microsoft的动作迟缓了一些,直到1992年才推出了基于DOS平台的MS—C/C++7.0系统。但由于其把握着PC操作系统的命脉,所以发展势头强劲,很快于93年推出了面向Windows的VisualC++1.0系统,94年推出了VisualC++1.5和可用于Windows’95和WindowsNT系统平台的VisualC++2.0直至98年推出VisualC++6.0。C++语言是在基于C语言的语法基础上容入了Simula67、Algol68和Ada等语言中许多独特的语法特点之后而形成的全新的语言体系。但由于C++语言的语法结构与C语言的语法结构几乎一致且多数编译器供应商所提供的编译器即可编译C语言,同时也可编译C++语言而且还允许这两种语言混编,因而在很大程度上使许多读者误以为C++语言是C语言的改进型语言。另外在事实上,C++语言也的确可以沿用C语言所支持传统的面向过程的分析和设计方法编制出过程化的程序,从而使更多的人对其产生了上面的误解。正是由于这些问题的存在,那些打算自学C++语言的读者便面临着更大的误入歧途的可能性。至于将C++语言和C语言容入一个编译器来进行编译处理主要还是由于存在商业上需求的缘故。正是由于C++语言的语法是基于C语言并考虑到大多数学习C++语言的读者应当系统的修过传统的软件工程所述的面向过程的分析与设计方法和C语言程序设计等课程,所以本书是以此为起点来讲述C++语言的。其更多的篇幅是用在同C语言进行比较的基础上来论述C++语言的语法的。此点务请读者留意。§2C++语言新增的约定、符号名称和算符§2.1C++语言的文件扩展名为了使编译器能够区别是C语言还是C++语言,C++语言体系规定用“CPP”(意即CPlus-Plus)做为C++语言源文件的扩展名以区别于C语言用的“.C”文件扩展名。虽然仅差两个字母,但编译时的处理却相差甚远。后面将不再重复C语言已有的内容,所以凡是讲到的多属于C++语言特有的语法描述的内容则只能书写在以“CPP”为扩展名的文件中(即按C++语法处理)。反过来按C语言语法书写的程序却大多可以使用“CPP”的文件扩展名并用C++编译器处理。但是也有个别易发生一些不符合预期要求的问题(如将在后面讲的重载)。所以为了避免混乱,建议还是按各自语法规则书写。“CPP”的文件扩展名与操作系统无关。与C++语言源文件相关的头文件扩展名一般仍用“H”,但有些操作系统也有规定使用“HPP”充当头文件扩展名的。§2.2C++语言最常用的简化输入/输出手段在C语言中,输入/输出本是依靠函数来实现的(如标准入/出用的scanf、printf等)。通常只要在程序的最前端放置对应的头文件声明“#includestdio.h”就可以引用这类函数。由于此种函数的引用语句书写起来比较冗长,为了简化起见C++语言又另外定义了一套保留字与算符来替代C语言中对标准入、出函数的引用。C++语言的保留字为:cout“输出内容”…;/*为标准输出算符(默认为显示器)*/cin“输入内容”…;/*为标准输入算符(默认为键盘)*/支持此二算符的内部函数体在一个名为“iostream.h”(即标准I/O流)的头文件中予以声明,所以应用时一定要将其放置对应的头文件声明部位。例1:#includeiostream.hvoidmain(){charname[10];intage;cout”pleaseinputyourname:”;cinname;cout”Howoldareyou:”;cinage;cout”nameis”name”\n”;cout”ageis“age”\n”;}将例1的标准入/出语法与C语言的printf和scanf函数的书写语法对比后可以很明显的看出此种标准的输入、输出语法的书写大大简化了函数格式的描述,而由C++语言编译器按被操作数的类型和具体内容代为选定默认格式。实际上此种方法也有其一整套控制格式的手段。这将是第五章要涉及的内容。§2.3数据类型声明的变化一.数据类型声明的变化C++语言除了新增的类数据(即class,应用参见第五章)类型以外,继承了C语言所支持的所有数据类型。但在数据类型的声明上作了两种较大的改变,一是允许数据类型的声明语句可以出现在程序的任何位置;二是允许直接使用结构体名定义实体。例2:voidmain(){structDt{unsignedintmm,dd,yy;};Dtdt[3];for(inti=0;i3;i++){dt[i].mm=8;dt[i].yy=1994;dt[i].dd=i+15;}}二.行注释符//的使用在C语言中用“/*…*/”符号做程序注释。这种注释叫做段注释。当只做单行注释时便可用连续的两个“//”符号表示从此符号起至行尾均为行注释内容。这种注释原在C语言中就有效,但一直未公开发表。三.用#define预定义代名符在C++语言编程设计中常利用#define语句定义一类空的字符串代换技术被称为代名符定义。代名符在程序中不起任何实际作用,但只能放在行首用来说明程序的设计者、类的归属、设计时间、程序的分类或所处的总体位置等有助于读程序的信息。例3:#defineTESTTESTvoidmain(){…}§2.4动态内存分配算符与上面现象相似的另一类新算符是可以用来进行动态内存分配的。这种算符有两个:new和delete。这是一对真正的算符,无须任何函数支持(即由C++语言编译器直接处理)。C++语言之所以要以new和delete算符来代替C语言内繁多的内存动态分配函数,是由于在面向对象的程序运行中,对象的产生和撤消极其频繁,以至于用C语言内动态内存分配函数来完成这种内存的占用和释放不仅过于烦琐,甚至是不可能的。一.算符new的功能与格式new算符的功能等效于C语言中mal1oc一类的函数功能,被用来动态地为对象或数据分配内存。即在尚未占用的内存空间中为对应类型的数据的实际需要来安排空间,并带回分配的首址。其语法格式为:指向对应类型的指针=new类型描述符;类型描述符可有下面几种书写形式:①仅占一个单元空间:例4:int*p;p=newint;/*意即占一个机器字长*/②仅占一个单元空间且赋初值:例5:int*p;p=newint(20);/*意即占一个机器字长且赋予初值20*/③占用多个单元可按数组或指针使用:例6:int*p;p=newint[20];/*意即占20个机器字长单元*/二.算符delete的功能与格式delete算符的功能等效于C语言中的free一类的函数功能。其语法格式为:delete指针名;如果指针是数组还可在指针名前加上“[]”表示。即:delete[n]指针名;若n值小于定义时的指针单元数,则释放自n单元起的内存空间,但经试验发现实际释放的内存空间仍是全部数组所占用的内存。例7:#includeiostream.h#includestdio.hvoidmain(){unsignedint*a,*b;structdt{unsignedintmm,dd,yy;};a=newunsignedint(20);/*使a指向一个机器字长的地址单元并赋初值20,*//*即等效于a=newunsignedint;*a=20;*/b=newunsignedint[20];/*使b指向20个机器字长的数组单元的第一个*/for(inti=0;i20;i++)b[i]=i;/*为这20数组单元赋初值0~19*/cout*a’‘b[0]’‘b[19]”\n”;dt*c=newdt;/*使c指向一个structdt数据结构对象的首地址并赋初值1994.8.15*/c-yy=1994;c-mm=8;c-dd=15;coutc-yy’.’c-mm’.’c-dd”\n”;printf(“%Np,%Np,%Np\n”,a,b,c);/*显示a、b、c的地址值*/deletea;delete[]b;a=newunsignedint[300];dt*d=newdt;*d=*c;/*将c的内容复制到d内*/coutd-yy’.’d-mm’.’d-dd”\n”;printf(“%Np,%Np,%Np,%Np\n”,a,b,c,d);/*显示a、b、c、d的地址值*/}显示结果:200191994.8.15780D30,780CB0,780C701994.8.157709A4,780CB0,780C70,780C30对例6做如下说明:①例中的地址为字长32位的机器运行的随机结果。执行new算符的操作通常按堆栈的存取方式由后向前安排。由于本例运行与保护模式,所分配的内存单元后面还有系统插入的控制编码,且常与系统交叉动态占用内存,因而输出显示的地址植之间是看不出联系的。②释放a和b之后,当重新分配a时,由于前一个a指向的是一个字长的空间,不足以容纳第二次要求长达300个单元的分配,只得另辟空间。此种分配便会造成至少一个字长的内存空洞浪费。这种内存空洞被称为内存碎片的一种形态,是C++语言程序在运行时容易造成的一种不良现象。§2.5引用(References)类型这是C++语言的一个特殊的数据类型描述,用于在程序的不同部分使用两个以上的变量名指向同一地址,使得对其中任一个变量的操作实际上都是对同一地址单元进行的。在这种两个以上变量名的关系上,被声明为引用类型的变量名则是实变量名的别名。其语法格式是:类型名&引用型函数名或变量名=前已声明的(常)变量名;在一行上声明多个引用型变量(函数)名时,要在每个变量(函数)名前都冠以“&”符号。例8:inti;int&j=i;j=1;例8中的j和i指向同一个地址单元,改变j的值也就是改变了i的值。例9:inti=0;int&j=i,k=2;j++;k++;cout&i”-”i;cout&j”-”j;cout&k”-”k例9显示结果是:34D0-234D0-234D4-3例9中地址值以十六进制数显示i的地址。分析时要注意两种不同的“&”符号的意义。例中j是i别名,而k则是独立的变量。出现在类型声明语句中“&”代表符号右端的别名。而在可执行句中“&”则是取变量的地址。此区别千万不能混淆。对于指针使用引用类型时则要注意书写格式。例10:inti=0,*j=&i,*&k=j;cout*k;切不可写成下面的样子:inti,*p;int&r1=p;/*非法语句*/int&r2=&i;/*非法语句*/由于引用类型所声明的变量不是独立内存实体,所以不能用以对常数声明。如:“int&r=3;”的形式就是错误的。以上为了讲原理,引用类型都被放在同一程序块中。引用类型通常被用于主子函数间需互传大量数据的设计之中,从而减少大量数据经过堆栈的复制。而在C语言中,主、子函数若要对非全局变量实施写操作时,只能通过传递实(形)参的指针(地址)来实现。直接使用指针很容易造成地址溢出的错误。而用C++语言编制
本文标题:第三章C++语言导论
链接地址:https://www.777doc.com/doc-2212109 .html