C++程序设计-培训课件-完整版-377p.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C++程序设计-培训课件-完整版-377p.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 程序设计 培训 课件 完整版 377
- 资源描述:
-
1、3:32:061C+程序设计吉林大学吉林大学 软件学院软件学院3:32:072n教师邮箱:教师邮箱:n参考书:参考书:C+程序设计教程程序设计教程 钱能钱能清华大学出版社清华大学出版社 第第2版版n课堂纪律:课堂纪律:n上机:上机:3:32:073第一章:概第一章:概 述述n1-1 培养目标n理解和掌握c+语言的基本语义和语法,初步理解面向对象的思想,初步掌握面向对象的程序设计方法。n提高编程能力和调试程序的能力,为后面的学习打好基础。3:32:0741-2 C语言与C+语言C语言回顾:1972年 bell实验室研制C语言特点:l高度灵活性、实现上的高效性 (比FORTRAN)l简捷和高效 (
2、比Pascal)3:32:075nC语言局限:程序达到一定规模时,模块之间的协调性存在问题,程序的重用性也存在问题,程序员难以控制程序的复杂性。3:32:076nC+产生:n1980年 贝尔实验室 Bjanre Stroustrup 对C改进与扩充n最初称为“带类的C”,(c with classes).n1983年正式命名为C+n3次修订后n1994 年制定了ANSI c+草案n1998年11月,ISO标准被批准。3:32:077nC+是C的改进与扩充nC+包括C的全部属性、特征、优点,是在C的基础上的改进与扩充n C+是C语言改进的基础上,添加了对面向对象程序设计部分的支持nC+包括过程性
3、语言和类部分nC+是C的超集,C是C+的子集nC+是混合型语言,即是过程型的,又是面向对象型的3:32:0781-3 面向过程的程序设计“面向过程”是一种以事件为中心的编程思想。就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。3:32:079 1-4 面向对象程序设计的基本特征1.对象一个对象是客观世界的一个实体数据与数据处理过程作为一个整体对象C+采用“类”来支持对象,同类对象抽象出其共性,形成类,类封装了数据与处理数据的过程(函数)3:32:07102.继承与重用举例C+采用继承支持重用。可通过继承现有类,并对其进行扩展,生成新类,即新
4、类是从现有类派生出来的,成为派生类。3.多态性:多态性指同一个操作在不同的类上有着不同行为。3:32:07111-5:举例比较面向对象和面向过程 程序设计n例如五子棋,例如五子棋,n面向过程的设计思路就是首先面向过程的设计思路就是首先分析问题的步骤:分析问题的步骤:1、开始游戏,、开始游戏,2、黑子先走,、黑子先走,3、绘制画面,、绘制画面,4、判断输赢,、判断输赢,5、轮到白子,、轮到白子,6、绘制画面,、绘制画面,7、判断输赢,、判断输赢,8、返回步骤、返回步骤2,9、输出最后结果。、输出最后结果。n把上面每个步骤用分别的函数把上面每个步骤用分别的函数来实现,问题就解决了来实现,问题就解决
5、了 而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,同时利用第三类对象(规则系统)来对棋局进行判定。3:32:0712面向过程和面向对象不是对立的面向过程和面向对象将长期并存从程序机构上,c+的单一程序体本质上是基于过程的,因为运行程序时,总是启动过程。3:32:0713/*this is a simple c+program*/#include using namespace std;/
6、#include int main()int a,b,result;cout ab;result=3*a-2*b+1;coutresult is result=0&ch=9)?1:0;编译器为内联函数创建一段源代码,每遇到一次该函数的调用都用相应的一段代码来代替。内联函数主要是解决运行效率的问题。使用内联函数可以省去函数调用所需的建立栈内存环境,进行参数传递,产生程序转移的时间开销内联函数应是使用频率高,代码却很短的函数。3:32:0719内联函数必须在调用之前声明或定义。#include using namespace std;inline int isnumber(char);/int i
7、snumber(char);(则正常函数调用)int main()char c;while(cinc&c!=n)if(isnumber(c)coutyou entered a digitn;else cout=0&ch=9)?1:0;此处inline可省略3:32:0720n内联函数的函数体限制:内联函数中,不能含有switch和while。递归函数不能用来做内联函数。内联函数中不能说明数组。否则,按普通函数调用那样产生调用代码。(内联函数是建议性,不是指令性)n内联函数只适合于1-5行的小函数n类结构中所有在类内部定义的函数,都是内联函数。3:32:0721 2-2 重载函数int abs(
8、int);long l_abs(long);double d_abs(double);重载函数:重载函数:int abs(int);long abs(long);double abs(double);C+用一种函数名技术可准确的判断出应使用那一个函数。用一种函数名技术可准确的判断出应使用那一个函数。abs(-10);/调用调用int abs(int);abs(-1000000);/调用调用long abs(long);abs(12.3);/调用调用double abs(double);简化编程,在编程逻辑上,亲近了人类的思维简化编程,在编程逻辑上,亲近了人类的思维3:32:0722 在同一作用
9、范围中为多个函数定义(其功能通常是相在同一作用范围中为多个函数定义(其功能通常是相近的)指定一个近的)指定一个共同的函数名共同的函数名,委托编译器根据每一个单,委托编译器根据每一个单独函数的独函数的形参个数、类型和位置的差异形参个数、类型和位置的差异,在幕后进行名称,在幕后进行名称细分并选择合适的函数调用匹配的现象称为函数重载。细分并选择合适的函数调用匹配的现象称为函数重载。void print(double);void print(long);void print(double,char*);void print(char*,double);void f()print(1L);/print(
10、long)print(1.0);/print(double)print(2.0,”hello”);/print(double,char*)print(”hello”,3.0);/print(char*,double)让重载函数执行不同让重载函数执行不同的功能,是不好的编的功能,是不好的编程风格。程风格。3:32:0723匹配重载函数的顺序:匹配重载函数的顺序:(1)严格匹配)严格匹配(2)内部转换(相容类型匹配)内部转换(相容类型匹配)(3)通过用户定义的转换寻找求一个匹配。)通过用户定义的转换寻找求一个匹配。void print(int);void print(double);void fu
11、nction()print(3);print(5.0);print(a);print(3.1415f);void print(long);void print(double);void function()int a;print(a);/有二义性print(long(a);或者print(double(a);3:32:0724重载的内部实现:重载的内部实现:C+用名字粉碎(用名字粉碎(name mangling)(名字细分、名名字细分、名字压轧)的方法来改变函数名。字压轧)的方法来改变函数名。用用v,c,i,f,l,d,r 分别表示分别表示void,char,int,float,long,do
12、uble,longdouble.int f(char a);/f_c int f(char a,int b,double c);/f_cid3:32:0725返回值类型不能够作为重载依据返回值类型不能够作为重载依据(区分、细分重载)区分、细分重载)void func(int);int func(int);fucn(10);/error这样规定保证对重载的解析与环境无关这样规定保证对重载的解析与环境无关 float sqrt(float);double sqrt(double);void f(double da,float fla)float fl=sqrt(da);/调用调用sqrt(doub
13、le)double d=sqrt(da);/调用调用sqrt(double)fl=sqrt(fla);/调用调用sqrt(float)d=sqrt(fla);/调用调用sqrt(float)3:32:07262-3 默认参数的函数默认参数也称为缺省参量。默认参数也称为缺省参量。例例:void delay(int loops);void delay(int loops)if(loops=0)return;for(int i=0;iloops;i+);允许函数默认参数值,是为了让编程简单,让编译器做更多的检查允许函数默认参数值,是为了让编程简单,让编译器做更多的检查错误工作。错误工作。默认参数函数
14、的声明默认参数函数的声明当又有声明又有定义时,定义中不允许默认参数。当又有声明又有定义时,定义中不允许默认参数。若只有定义,则默认参数才可出现在函数定义中若只有定义,则默认参数才可出现在函数定义中将将loops 定义成默认值为定义成默认值为1000 void delay(int=1000);调用时:调用时:delay();delay(2000);3:32:0727默认参数的顺序规定:默认参数的顺序规定:一个函数中可以有多个默认参数,默认参数应从右至一个函数中可以有多个默认参数,默认参数应从右至左逐渐定义,当调用函数时,从左向右匹配参数。左逐渐定义,当调用函数时,从左向右匹配参数。例:例:voi
15、d foo(int a,int b,bool c);void foo(int a,int b,bool c=false);/ok,c是最后一个参数是最后一个参数 void foo(int a,int b=0,bool c);/fail,b不是最后一参数不是最后一参数3:32:0728当调用有默认参数的函数时,从左向右匹配参数。当调用有默认参数的函数时,从左向右匹配参数。#include using namespace std;void fun(int a=1,int b=3,int c=5)couta=a,b=b,c=c,endl;int main()fun();fun(7);fun(7,9)
16、;fun(7,9,11);coutOK;return 0;3:32:0729默认值的规定:默认值的规定:默认值可以是全局变量、全局常量、函数。默认值可以是全局变量、全局常量、函数。不可不可以是局部变量以是局部变量。因为默认值是在编译时确定的,。因为默认值是在编译时确定的,必须是静态确定的。必须是静态确定的。3:32:0730函数重载与函数默认参数:(1)默认参数不能用于细分重载函数。例1:void func(int,int);void func(int=3,int=4);func(22,32);例2:void func(int);void func(int,int);是重载函数 而void f
17、unc(int);void func(int,int=4);在func(3)调用时有二义性3:32:0731(2)函数重载与函数默认参数:默认函数可将一系列简单的重载函数合成为一个。int month,int day,int year;void Tdate()month=4;day=15;year=1995;void Tdate(int m)month=m;day=15;year=1995;void Tdate(int m,int d)month=m;day=d;year=1995;void Tdate(int m,int d,int y)month=m;day=d;year=y;void T
18、date(int m=4,int d=15,int y=1995)month=m;day=d;year=y;int main()Tdate();Tdate(1);Tdate(1,2);Tdate(1,2,3);return 0;重载函数的功能相同,只是参数个数不同,用默认参数值的方法比较简便重载函数的功能相同,只是参数个数不同,用默认参数值的方法比较简便3:32:0732如果参数值用来确定不同的操作,则用函数重载比较好#include using namespace std;void print();void print(int*);int main()int arr10;int sum=0;
19、for(int i=0;iarri;sum=sum+arri;if(sum100)print(arr);elseprint();return 0;void print(int*pa)coutthe array can be usedendl;for(int i=0;i10;i+)coutpai ;coutendl;void print()coutthe array can not be usedendl;3:32:0733无名参数函数的定义和声明中,都可以省略形参名.void print(int,int);void print(int a,int)coutaendl;void func()pr
20、int(1,2);3:32:07342-4:程序运行时的内存布局(1)代码区(code area):存放程序的代码(各个函数的代码块)(2)全局变量区(data area):存放程序的全局数据和静态数据(3)堆区(heap area):存放程序的动态数据 可以用malloc()与free()以及new和delete 来申请与释放堆内存,也称动态内存、动态数据区。(4)栈区(stack area):存放程序的局部数据(各个函数中的数据)3:32:07353-1:指针1.指针变量的定义与赋值指针是一种数据类型,用于存放内存单元的地址。int*ip;定义同时赋值:int a;int*p=&a;定义之
21、后,单独使用赋值语句:int a,*p;p=&a;int a10,*p;p=a;p=&a0;第三章:第三章:指针和引用指针和引用 3:32:07363.与地址相关的运算 *和&“*”称为指针运算符(间接访问运算符),表示指针所指向的变量的值。一元运算符 int a;int*p=&a;*p=5;“&”称为取地址运算符,用来得到一个对象的地址。一元运算符。*和&是两个互逆的操作,当这两个操作符碰到一起时,其作用相互抵消,例如 *&k=3 与 k=3效果完全相同3:32:07374.用指针处理数组元素例:例:int*p,i,a6=0,1,2,3,4,5;p=a;for(i=0;i6;i+)print
22、f(“%d”,_);ai*(a+i)pi *(p+i)*p+*a+考虑:考虑:的作用的作用 和和*的比较;的比较;越界访问越界访问 数组名和指针数组名和指针(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;(2)数组名的外延在于其能够转换为指向其指代实体的指针,而且是个指针常量;数组名的外延在于其能够转换为指向其指代实体的指针,而且是个指针常量;(3)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是个指针;数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是个指针;#include us
23、ing namespace std;void arrayTest(char str)/char*str,char str10cout sizeof(str)endl;cout+strendl;int main()char str110=“Y and me”;arrayTest(str1);return 0;3:32:07385.void 指针与NULL指针值 (1)void 指针(void *p)空类型指针不指向任何类型,仅仅是一个地址。不能进行指针运算,也不能进行间接引用。*p其他类型指针可以赋值给空类型指针空类型指针经显示转换后方可赋给其他指针。int a=30;int*ip=&a;voi
24、d*vp=ip;/ok 从int*到void*的隐式转换*vp=10;/error vp+;/errorint a;void*p&a;char*q=(char*)p;3:32:0739(2)NULL是空指针值,不指向任何地方。任何类型的指针都可以赋该值。int*ptr=NULL;int*ptr=0;NULL与void*是不同的概念3:32:0740练习题练习题char a=abcdefghij;char*q=a;int*p=(int*)a;while(*q)*q+=*q+1;p+=2;printf(%s,p);/sizeof(char)=1/sizeof(int)=43:32:07416.指针
25、和常量指针和常量 const 说明符说明符const 为指定说明符(也称为常类型说明符),使用指定时,程序执行的为指定说明符(也称为常类型说明符),使用指定时,程序执行的过程中指定的内容不能被改变(冻结)。即一次初始化后,指定的内容始过程中指定的内容不能被改变(冻结)。即一次初始化后,指定的内容始终不变。终不变。(1)定义一般常量)定义一般常量 使用使用const 说明常量:说明常量:int const x=2;或或const int x=2;定义或说明一个常数组可采用如下格式:定义或说明一个常数组可采用如下格式:const 或者或者 const double const a2=1.0,2.0
展开阅读全文