资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,C+在非面向对象方面的一些特性,数,据,结,构,C+,在非面向对象方面的一些特性,C+,是从,C,发展而来,因此,C,程序中大部分的特点和功能,在,C+,中仍可以使用。但,C+,语言还增加了很多,C,语言不具备的新特性,这些特性中除了“面向对象”的概念外,同时也包括一些非面向对象的新特性。我们下面就来介绍这些非面向对象的新特性,它们使得,C+,程序比,C,程序更简洁,安全,强大。,1.1,注释,在,C,语言中,我们用,/*,及,*/,作为注释分界符号,例如,:,/*This is,just a,test for program */,C+,语言保留了这种注释方式,同时还增加了另一种注释方式,该注释以,/,开始,到行末结束。例如,:,Temp=a+b;/This is just a comment,/,注释方式适合于注释内容不超过一行的注释,使用很简洁方便。,1.2 I/O,流,C,语言中进行输入输出,是依靠系统提供的函数来完成,如标准输入和输出函数,scanf,和,printf,。相比,C,语言,,C+,使用了更安全和强大的方法来进行输入,/,输出操作,也就是“流”的概念。例如,:,int I;,double f=8.5;,cini;,cout”,称为“提取运算符”,表示将从标准输入流,(,即键盘,),读取的数值传送给右方指定的变量。也就是说,对于语句“,cini;”,,用户从键盘输入的数值会自动地转换为变量,i,的数据类型,并存入变量,i,内。类似于,C,语言中的,scanf(“%d”,。,运算符“,”,允许用户连续输入一连串数据,例如,:,cinabc;,它将按顺序从键盘上接收所要求的数据,并存入对应的变量中。两个数据间用空白符,(,空格、回车或,Tab,键,),分隔。,cout,是标准输出流,在程序中用于代表标准输出设备,通常指屏幕。运算符“,”,称为“插入运算符”,表示将右方变量的值显示在屏幕上。例如,执行下面的语句后,:,coutf;,变量,f,的值将显示在屏幕上。类似于,C,语言中的,printf(“%f”,f);,。,f,必须是基本数据类型,而不能是,void,类型。运算符“,”,允许用户连续输出一连串数据,也可以输出表达式的值,例如,:,couta+bc;,它将按照顺序将数据依次输出到屏幕上。,说明,:,(1),程序中如果需要使用,cin,或,cout,进行输入,/,输出操作时,则程序中必须嵌入头文件,iostream.h,,否则编译时要产生错误。下面是一个输入输出流的例子:,例,1-2,#include,void main(),char name20;,coutname;,coutnameendl;,(2),在,C+,程序中,我们仍然可以用,C,语言的传统方式进行输入输出操作,即沿用,stdio,函数库中的,I/O,函数,如,printf(),函数、,scanf(),函数或其它的,C,输入输出函数。,(3),在,C,中,常用,n,实现换行,,C+,中增加了换行控制符,endl,,其作用与,n,一样。它的使用很方便,只要插入在输出语句中需要换行的相应位置即可。例如以下两个语句的操作是等价的,:,coutx=xendl;,coutx=xn;,1.3,灵活的局部变量说明,在,C,语言中,所有的局部变量说明必须置于可执行代码段前面,而不允许局部变量的说明出现在可执行代码的中间或后面。如在,C,中,下面的程序段是不正确的,:,void func(),int m;,m=8;,int n;,n=4;,C,语言的编译器在编译时会指示有错,因为其中变量定义语句“,int n;”,插在“,m=8;”,这句可执行语句之后了。但在,C+,语言中,这是允许的,也就是说上面的程序编译时不会出错。,C+,允许在代码块中的任何地方对局部变量进行说明,该变量从说明点到该变量所在的最小分程序末的范围内有效。允许这种灵活的局部变量定义,对于程序员编写较大型复杂的函数时非常有效。,1.4 const,运算符,在,C,语言中,经常使用宏定义,也就是,#define,来定义常量,例如,:,#define time lO0;,而,C+,语言提供了一种更灵活、更安全的方式来定义常量,即用,const,修饰符来定义常量。,const,型的常量相比,#define,的宏定义要灵活的多,同时提供了更强大的安全性。,const,可以创建有类型的常量,例如,:,const int time=l00;,这样定义后的,time,的值将不能修改。,这里要注意的是,用,const,定义的常量必须在声明的时候初始化它的值,并且一旦初始化完成后,该值将不能再修改。,const,也可以与指针一起使用,根据,const,出现的位置不同,分为几种情况:,(1),指向常量的指针,例如,:,const char*name=stone,,,/,声明指向常量的指针,这个语句的含义为:声明一个名为,name,的指针变量,它指向一个字符型常量,初始化,name,指向字符串,stone,。使用,const,定义之后,不允许改变,name,指针所指的常量的值,因此以下语句是错误的,:,name3=a;,但是可以改变,name,指针本身的值。例如下列语句是允许的,:,name=John;,该语句赋给了指针另一个常量,即改变了,name,的值。,(2),常指针,常指针是指把指针本身,而不是它指向的对象声明为常量,例如,:,char*const name=stone;/,常指针,(,注意:,const,在语句中出现的位置与(,1,)中不同),这个语句的含义为:声明一个名为,name,的指针变量,该指针是指向字符型数据的常指针,用,stone,的地址初始化该常指针。,一个常指针一旦创建,则它指向的地址是固定的,也就是说指针本身将不能移动了。但是该地址的存储内容,也就是常指针所指的数据可以改变,例如,:,name3=,a;/,合法,name=John;/,出错,第一个语句改变了常指针所指的数据,这是允许的,;,但第二个语句要改变指针本身,这是不允许的。,(3),指向常量的常指针,这样的指针本身不能改变,它所指向的值也不能改变。要声明一个指向常量的常指针,二者都要声明为,const,,例如,:,const char*const name=stone;/,指向常量的常指针,这个语句的含义是,:,声明了一个名为,name,的指针变量,它是一个指向字符型常量的常指针,用,stone,的地址初始化该指针。根据这个指针的定义,可以判断出下面二个语句都是错误的,:,name3=a;/,出错,不能改变指针所指的值,name=John;/,出错,不能改变指针本身,说明,:,(1),如果用,const,定义一个整型常量,关键字,int,可以省略。所以下面的两行定义是等价的,:,const int time=l00;,const time=l00;,(2),与,#define,定义的常量有所不同,,const,定义的常量可以有自己的数据类型,这样,C+,的编译程序可以进行更加严格的类型检查,也使得程序的安全性得到提高。因此建议用,const,取代,#define,定义常量。,(3),函数参数也可以用,const,说明,用于保证实参在该函数内部不被改动。,1.5,内联函数,内联函数是,C+,新增加的机制,只要在函数说明前加上关键字,inline,,则该函数就被声明为内联函数。当程序中出现对内联函数的调用时,,C+,编译器将使用函数体中的代码替代函数调用表达式,这样可以加快代码的执行,减少调用开销。下面的程序定义了一个内联函数。,例,1-3,#include,inline int rect(int m)/,定义函数,rect,为内联函数,return m*m;,void main(),for(int i=1;i=3;i+),couti=i area=rect(i)endl;,程序运行结果如下,:,i=1 area=1,i=2 area=4,i=3 area=9,说明,:,(1),内联函数在被调用之前必须进行函数定义,否则编译器不知道应该插入什么代码。内联函数通常在,main,函数前面定义。,(2),通常只有较短的函数才定义为内联函数,对于较长的函数,最好作为一般函数处理。因为若内联函数较长且调用太频繁时,程序会加长很多。,(3),使用内联函数也可以替代宏定义,内联函数具有宏定义的所有优点而避免了宏定义的不安全性。,(4),内联函数的定义中不允许使用循环语句和,switch,语句。,注:,后面将学习到,在,C+,的类体内定义的成员函数都是内联函数。,1.6,作用域运算,:,C+,语言中,提供了一个作用域运算符“,”,,用来标识某个变量的作用域。通常情况下如果程序中存在两个同名变量,一个是全局的,另一个是局部的,那么局部变量在其作用域内具有较高的优先权。,例,1-4,#include,int temp=5;/,全局变量,temp,void main(),int temp;/,局部变量,temp,temp=50;,couttemp istempendl;/,输出的是局部变量,temp,的值,程序执行结果如下,:,temp is 50,在,main(),函数的输出语句中的变量,temp,是,main(),函数内定义的局部变量,因此打印的是局部变量,temp,的值,50,。,如果希望在局部变量的作用域内使用同名的全局变量,可以在该变量前加上作用域运算符“,”,,此时,temp,代表全局变量,temp,。,请看下面的例子。,例,1-5,#include,int exam;,void main(),int exam;,exam=40;/,局部变量,exam,:exam=10;/,全局变量,exam,coutlocal exam=examendl;,coutglobal exam=:exam0),return i;,else,return i;,float abs(float i),if(i0),return i;,else,return i;,double abs(double i),if(i0),return i;,else,return i;,void main(),int i=-8;,float f=-9.5;,double d=12.54;,coutiabs(i)endl;,coutfabs(f)endl;,coutdabs(d)endl;,程序运行结果如下,:,-8 8,-9.5 9.5,12.54 12.54,在,main(),中三次调用了,abs(),函数,实际上是调用了三个不同的重载版本。系统根据传送的不同实参的类型来决定调用哪个重载函数。例如当调用,abs(i),时,因为,i,为整型变量,所以系统将调用求整数绝对值的重载版本,int abs(int i),。可见,利用重载概念,用户在调用函数时,书写非常方便。,我们再通过一个求多边形周长的函数定义,来看一个参数个数不同的重载函数例子:,例,1-7,#include,int length(int x,int y,int z)/,求三角形的周长,return x+y+z;,int length(int x,int y,int z,int m)/,求四边形的周长,return x+y+z+m;,void main(),int a=3,b=5,c=7,d=8;,cout”The length of trigle is:”length(a,b,c)endl;,cout”The length of four is:”length(a,b,c,d)endl;,程序运行结果如下,:,The length of trigle is:1
展开阅读全文