第2章C对C的扩充.ppt
《第2章C对C的扩充.ppt》由会员分享,可在线阅读,更多相关《第2章C对C的扩充.ppt(109页珍藏版)》请在三一办公上搜索。
1、第2章 C+对C的扩充,第2章 基本内容,掌握C+语言在结构化程序设计(非面向对象)方面对C语言扩充的性能,为编写面向对象的C+程序打下基础。,第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.1 C+的发明人,Bjarne Stroustrup(本贾尼斯特劳斯特卢普)博士,C+语言之父,1950年出生于丹麦,1979年在英国剑桥大学
2、获得计算机科学博士学位,AT&T、贝尔实验室和ACM成员。1979年,B.S开始开发一种语言,当时称为“C with Class”,1983年演化为C+。1998年,ANSI/ISO C+标准建立,同年,B.S推出了其经典著作The C+Programming Language的第三版。Stroustrup博士是C+语言的设计者和第一位实现者,该语言业已成为世界上最通用的支持面向对象技术的程序设计语言。,Ken Thompson和Dennis Ritchie 美国科学家,1983年图灵奖获得者,UNIX和C语言的发明者。,2.1 C+开发工具的历史90年代初的Turbo C+,2.1 C+开发
3、工具的历史90年代中期的Borland C+for dos,2.1 C+开发工具的历史90年代中期的Borland C+Builder for Win,2.1 C+开发工具的历史21世纪的visual C+6.0,2.1 C+开发工具的历史visual studio 2010,2.1 C+的特点 C+语言既保留了C语言的有效性、灵活性、便于移植等全部精华和特点,又添加了面向对象编程的支持,具有强大的编程功能,可方便地构造出模拟现实问题的实体和操作;编写出的程序具有结构清晰、易于扩充等优良特性,适合于各种应用软件、系统软件的程序设计。用C+编写的程序可读性好,生成的代码质量高,运行效率仅比汇编语
4、言慢10%20%。,2.2 C+语言的文件扩展名,为了使编译器能够区别是C语言还是C+语言,C+语言体系规定用“.cpp”(意即C Plus-Plus)作为C+语言源文件的扩展名以区别于C语言用的“.C”文件扩展名。虽然仅差两个字母,但编译时的处理却相差甚远。“cpp”的文件扩展名与操作系统无关。与C+语言源文件相关的头文件扩展名一般仍用“.h”,但有些操作系统也有规定使用“.hpp”充当头文件扩展名的。,2.3 注释符,1.段注释:/*/2.单行注释:/当只做单行注释时便可用“/”符号表示从此符号起至行尾均为行注释内容。3.程序编译时将忽略所有的注释内容。,2.4 名字空间(名空间names
5、pace),名字空间域是随标准C+而引入的。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字:namespace ns1 float a,b,c;fun1(),花括号括起来的部分称声明块。声明块中可以包括:类、变量(带有初始化)、函数(带有定义)等。在域外使用域内的成员时,需加上名字空间名作为前缀,后面加上域操作符“:”。这里添加了名字空间名称的成员名被称为限定修饰名。如:ns1:a,ns1:fun1()等等。最外层的名字空间域称为全局名字空间域(global namespace scope),即文件域。名字空间域可分层嵌
6、套,同样有分层屏蔽作用。例如:namespace n1 namespace n2/名字空间嵌套 class matrix/名字空间类成员matrix 访问matrix,可写:n1:n2:matrix。,使用using声明可只写一次限定修饰名。using声明以关键字using开头,后面是被限定修饰的(qualified)名字空间成员名,例如:using n1:n2:matrix;/名字空间类成员matrix的using声明以后在程序中使用matrix时,就可以直接使用成员名,而不必使用限定修饰名。使用using指示符可以一次性地使名字空间中所有成员都可以直接被使用,比using声明方便。usin
7、g指示符以关键字using开头,后面是关键字namespace,然后是名字空间名。,标准C+库中的所有组件都是在一个被称为std的名字空间中声明和定义的。在采用标准C+的平台上使用标准C+库中的组件,只要写一个using指示符:using namespace std;就可以直接使用标准C+库中的所有成员。注意:如果使用了名空间std,则在使用#include编译预处理命令包含头文件时,必须去掉头文件的扩展名.h,否则会出错。,2.5 C+语言的输入输出,C+语言另外定义了一套流对象与运算符来替代C语言中对标准输入输出函数scanf和printf的引用。C+语言的保留字为:cout“输入内容”;
8、/cin为标准输入流对象(默认从键盘输入)#include 输入重定向,【例2.1】C+的输入输出举例。#include/使用名空间std,则必须去掉.h扩展名using namespace std;void main()char name10;int age;coutname;coutage;coutname is nameendl;coutage is ageendl;,补充(写出程序执行结果,假定输入1和2)#include/使用名空间std,则必须去掉.h扩展名using namespace std;void main()char ch1,ch2;int n1,n2;cinch1ch2
9、;n1=ch1-0;n2=n1*10+(ch2-0);coutn2;,补充(写出程序执行结果)#include/使用名空间std,则必须去掉.h扩展名#includeusing namespace std;void main()int n,count=0;for(n=1;n=100;+n)coutsetfill(*)setw(10)n;count+;if(count%5=0)coutendl;,程序执行结果,2.6 变量的定义,在C语言中,局部变量说明必须置于可执行代码段之前,不允许局部变量声明和可执行代码混合在一起。但C+在变量的定义上作了两种较大的改变,一是允许变量的定义语句可以出现在程序
10、的任何位置,使得局部变量的定义点与使用点不至于离得太远,增强程序的可读性,而且也不必在编写某一程序块的开始时就考虑要用到哪些变量;二是允许直接使用结构体名定义变量,这种扩展为程序员在编程中提供了不少方便。类似地在C+语言中联合名、枚举名也可在定义后独立地作为类型名使用。,【例2.2】C+的变量定义举例。#includeusing namespace std;void main()struct studentint no;float math;int n;cinn;student wang;wang.no=n;cinwang.math;coutwang.no wang.mathendl;,2.7
11、 强制类型转换,格式:(数据类型)(表达式)数据类型(表达式),2.8 动态内存的分配与释放,栈内存与堆内存栈空间是编译时分配的固定大小的内存。用于存放函数调用者的地址、返回值、保存的机器状态(用于返回)、函数参数、局部变量和临时变量等堆内存是程序运行时分配的大小可变的内存,也称为动态内存C+提供了两种方法进行内存动态分配和释放malloc()和free()(从C标准库中继承包含malloc.h)new和delete,2.8 动态内存的分配与释放,1.new运算符 指针变量=new 数据类型;new从堆内存中为程序分配可以保存某种类型数据的一块内存空间,并返回指向该内存的首地址,该地址存放于指
12、针变量中。堆内存可以按照要求进行分配,程序对内存的需求量随时会发生变化,有时程序在运行中可能会不再需要由new分配的内存空间,而且程序还未运行结束,这时就需要把先前占用的内存空间释放给堆内存,以后重新分配,供程序的其它部分使用。,2.delete运算符运算符delete用于释放new分配的内存空间,它的使用形式为:delete 指针变量;其中的指针变量保存着new动态分配的内存的首地址。3.注意:(1)用new获取的内存空间,必须用delete进行释放;(2)对一个指针只能调用一次delete;(3)用delete运算符作用的对象必须是用new分配的内存空间的首地址。,#include usi
13、ng 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);,指针变量=new 数据类型数组大小;此时指针变量指向第一个数组元素的地址。使用new分配数组时,不能提供初始值。使用new建立的数组变量也由delete释放。其形式为:delete 指针变量;或delete 指针
14、变量;同样,也可以用new来为多维数组分配空间,但是除第一维可以为变量外,其它维数都必须是常量。,4用new建立数组类型的变量,注意在使用delete时,不用考虑数组的维数。有时,并不能保证一定可以从堆内存中获得所需空间,当不能成功地分配到所需要的内存时,new返回0,即空指针。因此我们可以通过判断new的返回值是否为0,来得知系统中是否有足够的空闲内存来供程序使用。例如:int*p=new int100;if(p=0)cout cant allocate more memory,terminating.endl;exit(1);其中exit函数的作用是终止程序运行。,#include usi
15、ng namespace std;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】从堆内存中获取一个整型数组,赋值后并打印出来。,2.9 作用域运算符:,通常情况下,如果全局变量与局部变量同
16、名,那么局部变量在其作用域内具有较高的优先权。C语言规定只能在变量的作用域内使用该变量,不能使用其他作用域中的变量,可采用C+中提供的作用域运算符:,它能指定所需要的作用域。注意:不能用:访问函数中的局部变量。在C+语言中作用域运算符:还用来限定类的成员,,#include using namespace std;float a=2.4;/全局变量void main()int a=8;/局部变量coutaendl;cout:aendl;/:a表示全局作用域中的变量a,数组程序设计举例1(要求:分析运行结果?),#include void main()int x10,i,j;j=0;/计数器初值
17、赋0 coutxi;for(i=0;i0)j+;coutj=j;,数组程序设计举例1,从键盘上输入10个整数,统计其中的正整数的个数,程序运行结果:(从键盘输入:-2 3 4-5-3 9-23 0-1 21)输出:j=4,数组程序设计举例2,用冒泡排序法对10个数按从小到大的顺序输出思想:冒泡法的基本思想是对数组元素做若干次的遍历调整,每次遍历都是对相邻的两个数两两比较并调整,将小的调到前头,大的调到后面。,第一趟循环4次,第二趟循环3次,第三趟循环2次,第四趟循环1次,5个数,数组程序设计举例2,#include void main()int a11;int i,n,t;/i表示数组下标,n
18、表示遍历次数,t用来交换数据 coutai;coutai+1)t=ai;ai=ai+1;ai+1=t;coutthe sorted numbers:endl;for(i=1;i11;i+)coutai;coutendl;,程序运行结果:input 10 numbers:1 32 13 0 23 9 45 8 19-7 the sorted numbers:-7 0 1 8 9 13 19 23 32 45,字符数组程序设计举例1(要求:分析运行结果),#include#include void main()char str20;int i,j;cin.get(str,20);j=strlen(
19、str);for(i=j-1;i=0;i-)cout.put(stri);,字符数组程序设计举例1,从键盘上输入一个字符串,然后将其逆序输出,运行的结果是:(从键盘输入:abcdefg)gfedcba,使用字符串常量来对字符数组初始化。例如char str10=student;或者直接将花括号省略,写成如下的形式char str10=student;注意:字符串常量所占的空间一定不能超过字符数组的长度。如果字符串常量占用的空间小于数组的长度,则后面的元素自动的赋值为0,字符数组,字符数组的输出,用cout输出。格式为:cout字符串或字符数组名;用cout流对象的put。格式为:cout.pu
20、t(字符或字符变量);这种方法,每次只能输出一个字符;要输出整个字符串,应采用循环的方法,#include void main()char s20=This is a string.;int i=0;while(si!=0)cout.put(si);i+;,字符数组的输出,用cout流对象的write方法。格式为:cout.write(字符串或字符数组名,个数n);其作用是输出字符数串中的前n个字符。,#include void main()char s20=This is a string.;cout.write(s,4);,分析该程序的输出结果,字符数组的输入,利用cin直接输入。格式为:
21、cin字符数组名;用这种方法输入字符串时,cin只能接收空格之前的部分。也就是说,当字符串中有空格时,用这种方法无法接收全部的字符串。利用cin流对象的getline方法。格式为:cin.getline(字符数组名,输入字符串的最大长度n);参数“字符数组名”是存放字符串的数组名称参数“输入字符串的最大长度n”包括了字符串结束标记0在内,字符串处理函数,字符串的连接函数(strcat)调用的一般形式:strcat(char,const char);,#include#include void main()char st120=qing,st2=huadaxue;strcat(st1,st2);
22、coutst1;,运行的结果:,调用的一般形式:strcpy(char,const char);例如:char s112,s2=student;strcpy(s1,s2);执行上面的语句后,s1存放的是从字符串2那里拷贝的字符串“student”和0,剩下的空间自动赋值为结束符号0。数组1的长度不能小于数组2的长度 字符串2可以为字符数组名,还可以使用一个字符串常量 不能使用赋值语句将一个字符串常量直接赋值给一个字符数组 也不能将一个字符数组直接赋值给另一个字符数组,字符串拷贝函数(strcpy),字符串比较函数(strcmp),形式:strcmp(char,const char);字符串1=
23、字符串2,返回值=0;字符串1字符串2,返回值0;字符串1字符串2,返回值0 字符串、字符串2可以是字符数组也可以是字符串常量。字符串的比较不能使用以下的形式:if(s1=s2)coutyes;只能使用该函数来进行比较。所以应该写成:if(strcmp(s1,s2)=0)coutyes;,字符数组程序设计举例(功能?),#include#include void main()char str120,str220,str350;cin.getline(str1,20);cin.getline(str2,20);if(strcmp(str1,str2)0)strcpy(str3,str1);str
24、cat(str3,str2);else strcpy(str3,str2);strcat(str3,str1);coutstr3;,字符数组程序设计举例功能,程序运行结果:(从键盘输入:China Beijing)则输出:BeijingChina,从键盘上输入两个字符串,按照由小到大的顺序将其连接在一起,二维数组,定义的一般形式为类型说明符 数组名常量表达式1常量表达式2 例:int a53;表示a为整型二维数组,其中第一维有5个下标(04),第二维有3个下标(02),数组的元素个数为15,可以用于存放5行3列的整型数据表格。,二维数组的存储,C+语言中,二维数组在内存中默认情况下采用行优先存
25、储(对float a23画存储示意图)二维数组的初始化 分行对二维数组赋初值。如 int a23=1,2,3,4,5,6;对所有数据一起赋值,放在一个花括号中。如:int a23=1,2,3,4,5,6;部分元素赋值,如:int a23=1,2,4;数组的元素全部赋值时,可以省略数组的第一维长度,二维数组元素输入输出例子,#include void main()int i,j,a23=3,0,1,10,-4,9;for(i=0;i=1;i+)for(j=0;j=2;j+)coutendlaij=aij;,程序运行结果:a00=3a01=0a02=1a10=10a11=-4a12=9,数组程序设
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 扩充
链接地址:https://www.31ppt.com/p-5897006.html