C讲义(20121025版)

举报
资源描述
C+高级教程(讲义)湖南理工学院信息与通信工程学院邓涛目 录封面0目录1为什么学习与如何学习 3第 一 单 元 从 C 到 C+5一、C/C+语言标准 5二、C+与 C 的不同 5三、如何在V C中编译CQ+源程序 6四、内联函数6五、函数重载与安全链接 6六、引用7七、关于new与 delete运算符 8八、其它8九、练习8第二单元(上)10一、关于预处理器(Preprocessor Reference)10二、编译指示指令#pragma编译指示 10三、#号运算符 10四、#号运算符 11五、函数模板/模板函数 11六、VC程序设计初步 12七、理解VC13八、名空间14第二单元(下)Visual C+6.0 Run-Time Library Reference 15一、关于VC6运行库的简介 15二、VC6运行库函数分类介绍 16第三 单 元 类34一、类的概述34二、类与对象的关系 34三、类的声明、类的构成 34四、类声明和成员函数定义的分离 35五、类中的运算符重载 36六、数据类型转换与显式构造函数 37七、继承与派生 40八、多态性与虚函数 42第四单元string与输入输出流类46、C+中的字符串string 46二、C+中的标准输入输出流类 49第五单元C+标准模板库 58一、类模板或模板类 58二、STL 概述58三、序列式容器一一元素排列次序和置入时次序一致 60四、仿 函 数(Function objects,Functors)65五、关联式容器 67六、其它容器68七、算法概述70八、算法纵览74九、关于算法的一个综合示例一一多叉路口交通灯的管理问题 76十、STL迭代器 81十一、标准异常 85附录一致计算机系05级全体同学的一封信 89附录二一个表达式分析器源码 90附录三 我的第一个MFC练习程序 91为什么学习与如何学习一、为什么要学习C+?从多个方面来思考这个问题 计算机软件最多的是由何种语言写成的?计算机工业、教育和科研领域最多的是使用何种语言来进行交流的?运行效率最高的 功能最强大的 学习资料最丰富的C+己成为全世界专业编程人员的首选语言摘 自 标准C+宝典一 c语言是程序员的语言。使人吃惊的是,并不是所有的计算机编程语言都是为程序员设计的。摘 自 C+:T h e C o m p l e t e R e f e r e n c e 一一C+是一个难学易用的语言。C+的难学,不仅在于其广博的语法、语法背后的语义、语义背后的深层思维、深层思维背后的对象模型;C+的难学,还在于它提供了四种不同但却相辅相成的编程思维模型:。在如此庞大复杂的机制下,万千使用者前仆后继的动力是:一旦学成,妙用无穷。摘 自 Mo r e E f f e c t i v e C+虽然只商业化不到1 0 年,C+却俨然成为几乎所有主要计算环境的系统程序语言霸主.C+拥有比语言更丰富的东西。是的,C+还有一个伟大的标准程序库。摘 自 Mo r e E f f e c t i v e C+总之,要成为一个真正的程序员,必须学习C+,因为在只有学习过C+之后,才真正拥有进行各种软件开发的能力,不论是网络应用软件、数据库操作软件、数据库管理系统、操作系统还是各种开发环境、各种语言的编译器和解释器。当然,在学过C+之后,如果我们只是专门从事某一个方面的工作的话,通过学习那些专门为这一方面而设计的语言来加快开发的进程是可取的。但要记住,C+是你必须跨过的门槛。二、怎样学习C+(关于学习C+之我见)C+的学习一般分为三个阶段L C+语言的学习。2 .运行库和S T L(S t a nd a r d T e m p l a t e Li b r a r y 标准模板库)的学习。3 .在 W i nd o w s 或 U ni x 环境的程序设计中学习运用各种类库。时间上的分配第一阶段(C+语言的学习)一到二个月第二阶段(运行库和S T L)三个月第三阶段(W i nd o w s 或 U ni x 程序设计)六个月第一阶段的学习用书 标准C+宝典(林丽闽译)Thinking in C+(C+编程思想)(第一卷)C+Primer The C+Complete reference(C+参考大全)The C+Programming Language (Bjarne Stroustrup)第二阶段的学习用书 C+标准程序库(侯捷译)Thinking in C+(第 2 卷)第三阶段的学习用书 Programming Windows with MFC Desktop Applications with Microsoft Visual C+6.0 深入浅出MFC Programming Visual C+Programming WindowsC+讲义第一单元 从C到C+无忌此时不过九岁,虽然聪明,但要短期内领悟谢逊这些世上罕有的武功,却怎生能够?谢逊又教他转换穴道、冲解穴道之术,这是武学中极高深的功夫,无忌连穴道也认不明白,内功全无根柢,又如何学得会了?谢逊便又打又骂,丝毫不予姑息。殷素素常见到儿子身上青一块、乌一块,甚是怜惜,向谢逊道:“大哥,你武功盖世,三年五载之内,无忌如何能练得成?这荒岛岁月无尽,不妨慢慢教他。”谢逊道:“我又不是教他练,是教他尽数记在心中。”殷素素奇道:“你不教无忌武功么?谢 逊 道:哼,一招一式的练下去,怎来得及?我只是要他记着,牢牢的记在心头。”张无忌此时自己明白了义父的苦心,义父一身武功博大精深,倘若循序渐进的传授拆解,便教上二十年也未必教得完,眼见相聚时日无多,只有教他牢牢记住一切上乘武术的要诀,日后自行体会领悟。倚天屠龙记一、C/C+语言标准1)C 语言由Dennis Ritche发明,1989年成为ANSI标 准(C89),1999年提出新的C标 准(C99)2)C+语言由Bjarne Stroustrup于 1979年提出并完善,1998年成为ANSI/ISO标准。3)The Design and Evolution of C+一书详细介绍了 C+的发展历程。4)期待中的C+0X。二、C+与 C 的不同1)C+是面向对象的程序设计语言,C 是面向过程的。2)头文件的不同。(VS string)3)注释的不同。(/)4)局部变量声明的位置不同。(任何位置V S 只有开头)5)增加了新的关键字。6)C+引入了函数模板和类模板,支持泛型编程。(泛型编程与STL)7)C+引入了运行时类型识别RTTI。8)C+引入了新的异常处理机制。9)C+中的 new 和 delete 代替了 C 中的 malloc 和 free。10)C+引入了名空间机制来避免名称冲突。11)C+中函数名若不带参数可以不声明void。1 2)运行库有了大的变动。13)C+标准中包含了 STLo可以说,C+标准的发布对C+领域带来了翻天覆地的大变动一一不是来自语言本身,而是来自标准程序库。一 Learning Standard C+as a New Language三、如何在V C 中编译C/C+源程序1)在 V C 中编译的方法为:选择File/New,在 New向导的Projects选单中选择Win32Console Application,同时在Project name中给工程取名,并在Location中为工程选定工程保存目录,然后选择0K。2)在 Win32 Console Application-step 1 of 1 对话框中选择 An empty project.然后选择Finish,并在 New project Information 对话框中选择 OK。(这样我们就新建了一个新的、控制台应用程序的工程,工程尚未包含任何程序文档。下面我们将用两种方法将源程序加入到工程中去。)3)第一种方法a)用一种文本编辑器编辑C/C+源程序。b)将编辑好的源程序保存为叩p 文件或h 文件。c)在 VC 中选择 Project/Add to Project/Files,在 Insert Files into Project 对话框中指定要加入到工程中的一个或多个文件。4)第二种方法a)在 VC 中选择 Project/Add to Project/New,New 向导的 Files 选单中选择 C/C+Header File或 C+Source File,并勾选Add to Project,同时为文件取好名字,然后选择OK。b)然后在工程的工作区的文件视窗中选择并打开刚才加入的空文件,在其中输入源程序即可。5)最后,请在V C 中编译并运行源程序。a)当编译时出现错误时,可将光标放在错误号的前面然后使用F1键来查询相应错误所产生的原因。b)当需要查询某些函数的定义时也可使用F1键来完成。注:使用两种方法编译例1-01。四、内联函数1)目的:提高效率注:使用macro也可提高效率,但有缺陷。a)macro看上去像函数调用但却并非总是像函数那样行为,因而可能隐藏许多难以发现的bugob)macro无法访问类对象的成员。2)使用:短小代码、频繁使用的代码可以声明为内联函数。3)内联函数中不能有循环语句。4)只是C+标准对C+编译器实现的一个建议。5)Any function defined within a class body is automatically inline.6)方法:函数前加上inline即可。五、函数重载与安全链接1)C+中允许多个函数共用同一函数名,只要它们之间的参数个数或参数类型或参数顺序有所区别即可。2)函数重载与二义性有时编译器不能在重载函数之间作出选择称具有二义性的重载。原因一:C+的自动类型转换。例如:例 1-02#include using namespace std;float myfunc(float i)return i;double myfunc(double i)return i;int main()coutmyfunc(10.1);/OK,无二义性coutmy func(10);二义性return 0;)注:编译此例并查看错误号,说明错误号的命名规则,如何查看帮助原因二:在重载函数中使用默认变元。float myfunc(float i)return i;)float myfunc(float i,int j=l)(return i+j;3)函数重载引起的链接问题a)如果在不同的转换单元中声明了多个同名函数,C+链接器如何确定将链接的函数体呢?为解决这个问题,C+采用了名字重组(name mangling)技术,给编译器内部的函数标识符重新命名。重组后的函数名包括了指定函数返回值类型和参数类型的标志。在可重定位的目标文件里,对函数的调用以及函数的定义都被转换成重组后的名字,而这个名字里惟一的。b)C+可以重组函数,其它语言则没有此功能(例如C),为了使得在C+中也能调用己编译的C 函数,必须通知C+链接器和编译器停用函数名重组技术,这时使用extern C”的链接说明一一声明大括号内的内容都是用C编译器编译的。例如:#ifdef _cplusplusextern c#endif#ifdef _cplusplus)#endif、引用1)引用是个别名,必须初始化,不能为空,不可改变其值,实现机制与指针相似,最常用于函数形参。2)向函数传递参数可有值传递、指针传递和引用三种方法,对于大型结构,值传递效率低下。3)如果指向的变量可能不存在就使用指针,若确信变量肯定存在就用引用。4)如果使用指针就要测试是否为NULL。void myFunc(double*pd)(if(pd)cout*pd;七、关于new与 delete运算符1)C+程序的内存格局分为四个区 全 局 数 局 区 代 码 区 栈 区 堆 区全局变量、静态数据和常量放在全局数据区;所有函数以及类的成员函数的代码放在代码区;为运行函数而分配的局部变量、函数参数(返回数据、返回地址)存放在栈区。以上三区的内存一经分配不得变动。2)很多
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新


电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号