您好,欢迎访问三七文档
C++程序设计吉林大学软件学院教师邮箱:liay@jlu.edu.cn参考书:C++程序设计教程钱能清华大学出版社第2版课堂纪律:上机:第一章:概述1-1培养目标理解和掌握c++语言的基本语义和语法,初步理解面向对象的思想,初步掌握面向对象的程序设计方法。提高编程能力和调试程序的能力,为后面的学习打好基础。1-2C语言与C++语言C语言回顾:C语言特点:(1)语言简洁、紧凑、使用方便,32个关键字,书写形式自由(2)丰富的运算符和数据类型(3)直接访问内存,进行位操作,胜任操作系统的开发(4)生成的目标代码质量高,程序运行效率好(5)可移植性好C语言局限:没有支持代码重用的语言结构程序达到一定规模时,程序员难以控制程序的复杂性。C++产生:1980年贝尔实验室BjanreStroustrup对C改进与扩充最初称为“带类的C”,(cwithclasses).1983年正式命名为C++3次修订后1994年制定了ANSIc++草案1998年11月,ISO标准被批准。C++是C的改进与扩充C++包括C的全部属性、特征、优点,是在C的基础上的改进与扩充C++是C语言改进的基础上,添加了对面向对象程序设计部分的支持C++是C的超集,C是C++的子集C++包括过程性语言和类部分C++是混合型语言,即是过程型的,又是面向对象型的1-3面向过程的程序设计“面向过程”是一种以事件为中心的编程思想。就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。1-4面向对象程序设计的基本特征1.对象一个对象是客观世界的一个实体数据与数据处理过程作为一个整体——对象C++采用“类”来支持对象,同类对象抽象出其共性,形成类,类封装了数据与处理数据的过程(函数)2.继承与重用举例C++采用继承支持重用。可对现有类进行扩展,并生成新类,即新类是从现有类派生出来的,成为派生类3.多态性:多态性指同一个操作在不同的类上有着不同行为。1-5:举例比较面向对象和面向过程程序设计例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,同时利用第三类对象(规则系统)来对棋局进行判定。面向过程和面向对象不是对立的面向过程和面向对象将长期并存从程序机构上,c++的单一程序体本质上是基于过程的,因为运行程序时,总是启动过程。/*thisisasimplec++program*/#includeiostreamusingnamespacestd;//#includeiostream.hintmain(){inta,b,result;coutpleaseinputtwonumbers:\n;cinab;result=3*a-2*b+1;coutresultisresultendl;return0;}1-6C++的程序结构1.预处理命令:宏定义命令、文件包含命令和条件编译命令2.输入和输出:3.函数:4.语句:是组成程序的基本单元。以分号结束。5.变量:6.其他:如符号常量和注释信息。C++中尽量把常量定义为符号常量#definePI3.1415constdoublePI=3.1415;1-7C++程序的实现编辑、编译、运行1.编辑:将编写好的C++源程序输入到计算机中,生成磁盘文件的过程。磁盘文件的名字要用扩展名.cpp。2.编译:C++程序的实现必须要使用某种C++语言的编译器对程序进行编译。功能是:将程序的源代码转换成为机器代码的形式,称为目标代码(.obj),然后,再使目标代码进行连接,生成可执行文件(.exe)。编译过程可分为三个子过程:预处理过程、编译过程、连接过程(1)预处理过程:执行预处理命令(2)编译过程:进行词法分析和语法分析的过程,又称源程序分析的过程。符号表:又称字典。映射程序中的各种符号及其他们的属性。是在进行词法分析和语法分析是生成的,在生成中间代码和可执行的机器代码时使用。错误处理程序:生成目标代码:.OBJ为扩展名的磁盘文件,机器可识别文件内容,却不能执行。(3)连接过程:编译器对每个源文件单独进行编译,多个源程序的目标代码以及库文件(.Lib)连接在一起,才能形成可执行文件(.exe)。由连接器完成.3.运行:上机环境:Visualc++6.0Visualstudio2008一个C++程序有一个主函数和若干个子函数构成,主函数是程序执行的开始点。C++使用函数来组织程序的,C++是函数驱动的。C++不允许函数定义嵌套。函数有两种:标准库函数和用户自定义函数。第二章函数2-1内联函数内联函数也称内嵌函数,它的语法格式与普通函数一样,只是在函数原型或函数定义标题头之前加上关键字inlineinlineintisnumber(char);inlineintisnumber(charch){return(ch='0'&&ch='9')?1:0;}编译器为内联函数创建一段源代码,每遇到一次该函数的调用都用相应的一段代码来代替。内联函数主要是解决运行效率的问题。使用内联函数可以省去函数调用所需的建立栈内存环境,进行参数传递,产生程序转移的时间开销内联函数应是使用频率高,代码却很短的函数。内联函数必须在调用之前声明或定义。#includeiostreamusingnamespacestd;inlineintisnumber(char);//intisnumber(char);(则正常函数调用)voidmain(){charc;while(cinc&&c!='\n'){if(isnumber(c))coutyouenteredadigit\n;elsecoutyouenteredanon-digit\n;}}intisnumber(charch)//inlineintisnumber(charch){return(ch='0'&&ch='9')?1:0;}此处inline可省略内联函数的函数体限制:内联函数中,不能含有switch和while。递归函数不能用来做内联函数。内联函数中不能说明数组。否则,按普通函数调用那样产生调用代码。内联函数只适合于1-5行的小函数类结构中所有在类内部定义的函数,都是内联函数。2-2重载函数intabs(int);longl_abs(long);doubled_abs(double);重载函数:intabs(int);longabs(long);doubleabs(double);C++用一种函数名技术可准确的判断出应使用那一个函数。abs(-10);//调用intabs(int);abs(-1000000);//调用longabs(long);abs(12.3);//调用doubleabs(double);在同一作用范围中为多个函数定义(其功能通常是相近的)指定一个共同的函数名,委托编译器根据每一个单独函数的形参个数、类型和位置的差异,在幕后进行名称细分并选择合适的函数调用匹配的现象称为函数重载。voidprint(double);voidprint(long);voidprint(double,char*);voidprint(char*,double);voidf(){print(1L);//print(long)print(1.0);//print(double)print(2.0,”hello”);//print(double,char*)print(”hello”,3.0);//print(char*,double)}让重载函数执行不同的功能,是不好的编程风格。匹配重载函数的顺序:(1)严格匹配(2)内部转换(相容类型匹配)(3)通过用户定义的转换寻找求一个匹配。voidprint(int);voidprint(double);voidfunction(){print(3);print(5.0);print(‘a’);print(3.1415f);}voidprint(long);voidprint(double);voidfunction(){inta;print(a);//有二义性}print(long(a));或者Print(double(a));重载的内部实现:C++用名字粉碎(namemangling)(名字细分)的方法来改变函数名。用v,c,i,f,l,d,r分别表示void,char,int,float,long,double,longdouble.intf(chara);//f_cintf(chara,intb,doublec);//f_cid返回值类型不能够作为重载依据(区分、细分重载)voidfunc(int);intfunc(int);fucn(10);//error这样规定保证对重载的解析与环境无关floatsqrt(float);doublesqrt(double);voidf(doubleda,floatfla){floatfl=sqrt(da);//调用sqrt(double)doubled=sqrt(da);//调用sqrt(double)fl=sqrt(fla);//调用sqrt(float)d=sqrt(fla);//调用sqrt(float)}2-3默认参数的函数默认参数也称为缺省参量。例:voiddelay(intloops);voiddelay(intloops){if(loops==0)return;for(inti=0;iloops;i++);}允许函数默认参数值,是为了让编程简单,让编译器做更多的检查错误工作。默认参数函数的声明当又有声明又有定义时,定义中不允许默认参数。若只有定义,则默认参数才可出现在函数定义中将loops定义成默认值为1000voiddelay(int=1000);调用时:delay();delay(2000);默认参数的顺序规定:一个函数中可以有多个默认参数,默认参数应从右至左逐渐定义,当调用函数时,从左向右匹配参数。例:voidfoo(inta,intb,boolc);voidfoo(inta,intb,boolc=false);//ok,c是最后一个参数voidfoo(inta,intb=0,boolc);//fail,b不是最后一参数当调用有默认参数的函数时,从左向右匹配参数。#includeiostreamusingnamespacestd;voidfun(inta=1,intb=3,intc=5){couta=a,b=b,c=c,endl;}voidmain(){fun();fun(7);fun(7,9);fun(7,9,11);coutOK;}默认值的规定:默认值可以是全局变量、全局常量、函数。不可以是局部变量。因为默认值是在编译时确定的,必须是静态确定的。函数重载与函数默认参数:(1)默认参数不能用于细分重载函数。例1:voidfunc(int,int);voidfunc(int=3,int=4);func(22,32);例2:voidfunc(int);voidfunc(int,int);是重载函数而voidfunc(int);voidfunc(int,int=4);在func(3)调用时有二义性应该避免重载过程中的涉及参数个数的默认设置函数重载与函数默认参数:(2)默认函数可将一系列简单的重载函数合成为一个。intmonth,intday,intyear;voidTdate(){mo
本文标题:全c++吉大
链接地址:https://www.777doc.com/doc-3836634 .html