,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第2章 C+对C的扩充,2.1 C+的特点,2.2 C+语言的文件扩展名,2.3 注释符,2.4 名字空间,2.5 C+语言的输入输出,2.6 变量的定义,2.7 强制类型转换,2.8 动态内存的分配与释放,2.9 作用域运算符:,2.10 引用,2.11 const修饰符,2.12 字符串,2.13 C+语言中函数的新特性,第2章 C+对C的扩充2.1 C+的特点2.8 动态内存,1,2.1 C+的特点,C+语言既保留了C语言的有效性、灵活性、便于移植等全部精华和特点,又添加了,面向对象编程的支持,。,用C+编写的程序可读性好,生成的代码质量高,运行效率仅比汇编语言慢10%20%。,2.1 C+的特点,2,2.2 C+语言的文件扩展名,为了使编译器能够区别是C语言还是C+语言,C+语言体系规定用“,.cpp,”(意即,C Plus-Plus,)作为C+语言源文件的扩展名以区别于C语言用的“.C”文件扩展名。,与C+语言源文件相关的头文件扩展名一般仍用“,.h,”(有些操作系统也规定使用“.hpp”)。,2.2 C+语言的文件扩展名 为了使编译器能够区别,3,2.3 注释符,1.段注释:/*/,2.单行注释:/当只做单行注释时便可用“/”符号表示从此符号起至行尾均为行注释内容。,程序编译时将忽略所有的注释内容。,2.3 注释符 1.段注释:/*/,4,2.4 名字空间(名空间namespace),用花括号把文件的一部分括起来,并以关键字,namespace,开头给它起一个名字:,namespace ns1,float a,b,c;,fun1(),2.4 名字空间(名空间namespace)用花括号,5,花括号括起来的部分称声明块。声明块中可以包括:类、变量(带有初始化)、函数(带有定义)等。在域外使用域内的成员时,需加上名字空间名作为前缀,后面加上域操作符“:”。如,:ns1:a,,ns1:fun1()。,最外层的名字空间域称为全局名字空间域(global namespace scope),即文件域。,名字空间域可分层嵌套,同样有分层屏蔽作用。如:,namespace n1,namespace n2,/名字空间嵌套,class matrix/名字空间类成员matrix,访问matrix,可写:,n1:n2:matrix,花括号括起来的部分称声明块。声明块中可以包括:类、变量(,6,使用using声明可只写一次限定修饰名。using声明以关键字,using,开头,后面是被限定修饰的名字空间成员名,如:,using n1:n2:matrix;,/名字空间类成员matrix的using声明,以后在程序中使用matrix时,就可以直接使用matrix,而不必使用限定修饰名。,使用using指示符可以一次性地使名字空间中所有成员都可以直接被使用,比using声明方便。using指示符以关键字using开头,后面是关键字namespace,然后是名字空间名。如:,using namespace ns1;,使用using声明可只写一次限定修饰名。using声明以关键,7,标准C+库中的所有组件都是在一个被称为std的名字空间中声明和定义的。在采用标准C+的平台上使用标准C+库中的组件,只要写一个using指示符:,using namespace std;,就可以直接使用,标准C+库,中的所有成员。,注意:,如果使用了名空间std,则在使用#include编译预处理命令包含头文件时,必须去掉头文件的扩展名.h,否则会出错。,#include using namespace std;,和,#include,是一样的,标准C+库中的所有组件都是在一个被称为std的名字空间,8,2.5 C+语言的输入输出,C+语言另外定义了一套保留字与运算符来替代C语言中对标准输入、输出函数的引用。,#include,cout“输出内容”“输入内容”;,/标准输入流对象(默认从键盘输入),2.5 C+语言的输入输出 C+语言另外定义了一套保留,9,【例2.1】C+的输入输出举例。,#include/使用名空间std,则必须去掉.h扩展名,using namespace std;,void main(),char name10;,int age;,coutname;,coutage;,coutname is nameendl;,coutage is agen;,student wang;,wang.no=n;,cinwang.math;,coutwang.no wang.mathendl;,【例2.2】C+的变量定义举例。,12,2.7 强制类型转换,格式:,(数据类型)(表达式),或:,数据类型(表达式),int b;,float f;,f=float(b);/此时变量b仍然为int类型,float(i)*f/*强制类型转换符优先级较高,先将变量i强制类型转换为float类型,然后与变量f运算*/,2.7 强制类型转换格式:,13,2.8 动态内存的分配与释放,1.,new,运算符做分配,指针变量=new 数据类型;,2.,delete,运算符做释放,delete 指针变量;/*其中的指针变量保存着new动态分配的内存的首地址*/,注意:,(1)用new获取的内存空间,必须用delete进行释放;,(2)对一个指针只能调用一次delete;,(3)用delete运算符作用的对象必须是用new分配的内存空间的首地址。,2.8 动态内存的分配与释放1.new运算符做分配,14,#include,using namespace std;,void main(),int*p;,p=new int;,/分配内存空间,*p=5;,cout*p;,delete p;,/释放内存空间,【例2.3】new与delete应用举例。,在用new分配内存的同时进行初始化。使用形式为:,指针变量=new 数据类型(初始值);,例如上例中的:,p=new int;,*p=5;,也可写成:,p=new int(5);,#include【例2.3】new与d,15,指针变量=new 数据类型数组大小;,此时指针变量指向第一个数组元素的地址。使用new分配数组时,不能提供初始值。使用new建立的数组变量也由delete释放。其形式为:,delete 指针变量;,或,delete 指针变量;,同样,也可以用new来为多维数组分配空间,但是除第一维可以为变量外,其它维数都必须是常量。,用new建立数组类型的变量,注意在使用delete时,不用考虑数组的维数。,有时,并不能保证一定可以从堆内存中获得所需空间,当不能成功地分配到所需要的内存时,new返回0,即空指针。因此我们可以通过判断new的返回值是否为0,来得知系统中是否有足够的空闲内存来供程序使用。例如:,int*p=new int100;,if(p=0),cout cant allocate more memory,terminating.endl;,exit(1);,其中exit函数的作用是终止程序运行。,指针变量=new 数据类型数组大小;用new建立数组,16,#include,void main(),int n;/定义数组元素的个数,int*p;,coutn;,if(p=new intn)=0)/分配内存空间,cout,cant allocate more memory,terminating.,endl;,exit(1);,for(int i=0;in;i+)pi=i*2;,coutNow output the array:endl;,for(i=0;in;i+)coutpi ;,coutendl;,delete p;/释放内存空间,【例2.4】从堆内存中获取一个整型数组,赋值后并打印出来。,#include【例2.4】从堆内,17,补充:复制初始化和直接初始化。,int n(50);/,直接初始化,int m=20;/,复制初始化,注意:,初始化不是赋值,补充:复制初始化和直接初始化。int n(50);/直接初,18,2.9 作用域运算符:,通常情况下,如果全局变量与局部变量同名,那么局部变量在其作用域内具有较高的优先权。C+中提供的作用域运算符:,它能指定所需要的作用域。,注意:,不能用:访问函数中的局部变量。在C+语言中作用域运算符:还用来限定类的成员。,#include,using namespace std;,float a=2.4;/全局变量,void main(),int a=8;/局部变量,coutaendl;,cout:aendl;/:a表示全局变量a,2.9 作用域运算符:通常情况下,如果全局变量与,19,2.10 引用,引用,用于在程序的不同部分,使用两个以上的变量名指向同一地址(内存空间),,使得对其中任一个变量的操作实际上都是对同一地址单元进行的。被声明为引用类型的变量名则是实际变量名的,别名,。,引用运算符为&,声明引用的一般形式为:,数据类型&引用变量名=变量名;,或 数据类型&引用变量名=变量名;,或 数据类型&引用变量名=变量名;,对引用进行操作,实际上就是对被引用的变量进行操作,引用不是值,不占存储空间,引用一旦被初始化,就不能再重新赋值,2.10 引用 引用,用于在程序的不同部分使用两个以上,20,【例2.5】引用举例。,#include,void main(),int num=50;int&ref=num;,ref+=10;,coutnum=numendl;,coutref=refendl;,num+=40;,cout num=numendl;,coutref=refendl;,【例2.5】引用举例。,21,11点说明:,在一行上声明多个引用型变量(函数)名时,要在每个变量(函数)名前都冠以“&”符号。,例如:int i=1,j=2;,int,(2),引用不是变量,,所以引用本身不能被修改(不能再改变成为另一个变量的引用)。,(3),一个变量被声明为引用时必须进行初始化,,除非这个引用是用作函数的参数或返回值,为引用提供的初始值应为变量(包括对象)。引用一旦被初始化,就不能再重新赋值。如:,/*接上面两行程序*/int/错,ref=/错,/错,ref=j;/对,11点说明:,22,(4)由于引用不是变量,所以,不能说明引用的引用,也不能说明数组元素的类型为引用数组,或指向引用的指针(引用不占内存空间)。例如:,int /错误,int /错误,由于指针也是变量,因此可以说明对指针变量的引用。例如:,int*a;int*,int b;p=/a指向变量b,(5),引用与指针不同,指针的内容或值是某一变量的内存单元地址,而引用则与初始化它的变量具有相同的内存单元地址。,指针是个变量,可以把它再赋值成其它的地址,然而,建立引用时必须进行初始化并且决不会再指向其它不同的变量。,(4)由于引用不是变量,所以,不能说明引用的引用,也不能说明,23,(6),引用运算符和地址运算符不同,。例如:,int num=50;,int/引用,int*p=/取地址,(7),可以用一个引用初始化另一个引用,。例如:,int num=50;,int,int,ref2=100;/num被修改为100,(8)常把函数的参数说明成引用以建立函数参数的引用传递方式。,【例2.7】引用作为函数参数实现数值交换,(6)引用运算符和地址运算符不同。例如:,24,(9)有空指针,,无空引用,(10),引用不能用数据类型来初始化,。如:,int&ref=int,;/error,(11),返回引用的函数调用可作为左值,若一个函数返回了引用,那么该函数的调用也可以被赋值。,返回值不能是函数的局部变量的引用。,引用返回值只用在需对函数的返回值重新赋值的时候。,【例2.8】统计学生中A类学生与B类学生各为多少个。A类学生的标准是平均分在80分以上,