c++学习要点+各章要点导读+课文精讲串讲文字材料

上传人:无*** 文档编号:41461254 上传时间:2021-11-20 格式:DOC 页数:58 大小:270KB
收藏 版权申诉 举报 下载
c++学习要点+各章要点导读+课文精讲串讲文字材料_第1页
第1页 / 共58页
c++学习要点+各章要点导读+课文精讲串讲文字材料_第2页
第2页 / 共58页
c++学习要点+各章要点导读+课文精讲串讲文字材料_第3页
第3页 / 共58页
资源描述:

《c++学习要点+各章要点导读+课文精讲串讲文字材料》由会员分享,可在线阅读,更多相关《c++学习要点+各章要点导读+课文精讲串讲文字材料(58页珍藏版)》请在装配图网上搜索。

1、c+学习要点1.传指针时,我们可以通过指针来修改它在外部所指向的内容。但如果要修改外部指针所指向的对象是不可能的。例如传递外部指针到函数内来分配空间,必须传递指针的指针或指针的引用。2.charcarry10=0;编译器会将其后所有的东西都置0;3.函数返回值为const时,返回的东西付给一个类型相同的标示后其不能为左值;4.constint*i;intconst*i;int*consti;前两个功能相同,说明I所指向的内容不变;最后一个说明指针指向的地址不变,但内容可变。5.类中的const成员函数。定义为在原型后加const。常量函数不能修改类中的任何属性。但有两种方法可以修改。a)(my

2、class*)this-member1=values;b)将一个成员定义成mutable即可被常量函数修改。6.类中的常量const类型的,不能在类中被用来定义数组。而enumONE=100;TWO=2;定义的ONE、TWO却可以。通常的enum定义的置分配问题:enumAL=9,Z;此时Z的值为10。7.用const定义的int可用来开辟数组,但const定义的常量数组中的元素,不能用来定义数组。8.用sizeof计算变量的空间,如果是数组,按实际空间返回;常量字符串(实际上是在静态内存区开辟的变量)sizeof返回比实际长度加一。如果是指针则不考虑它指向的空间大小,仅仅返回指针类型的大小。

3、如果用sizeof计算函数的行参,即使是属组也仅仅返回一个相关类型指针的大小。9.形如intiarray=12,124,433;编译器会自动给iarray分配3个元素的长度。元素长度的个数计算公式为sizeof(iarray)/sizeof(*iarray)。10.拷贝构造函数:当行参和实参结合时,如果是复杂对象的传值类型,则调用拷贝构造函数生成一个临时对象作为实参,退出函数时,临时对象被调用析构函数释放。当返回值是复杂对象是,也是调用拷贝构造函数来赋值。这就出现构造函数和析构函数被调用次数不相等的情况。拷贝构造函数的原型为A(A&),我们可在类中重载。(缺省的拷贝构造函数是使用位(bit)拷

4、贝方法:浅层拷贝,不拷贝指针指向的内容)。11.volatile类型的变量告诉编译器,本变量不需要进行代码优化。在多线程的应用中,我们如果读入一个变量到寄存器,此时时间片到期,去处理其他线程了,在重新获得处理机时,volatile类型告诉处理机,重新从变量读取数据到寄存器,而不是用寄存器数据直接处理,这样可以防止脏数据。12.class和struct在一定程度上有相同的功能,只不过前者缺省的成员是私有的,后者在缺省时成员为共有的。故而class不是c+必需的保留字13.c和c+编译器,对相同的函数名编译后生成的相同的标示不同,故而在引用c的库文件时必须使用extern“C”告诉编译器,它是c的

5、函数,按c的规则编译。通常我们使用的标准头文件已被处理过。14.#include“filename”;#include,前者先在当前目录下寻找文件,如果找不到再到系统规定的路径下找,后者直接到系统规定的路径下找。15.任何地方分配的静态变量(static),其生命周期和主进程相同。第二次定义一个已存在的static变量,对变量的内用无影响,但它的可见范围只在定义的范围内。(考研曾作错!)(从静态变量的特性不难理解,类中的static类型是所有对象共享的)16.内联函数(inline)在实现上实际和宏类似,在内联函数出现的地方将函数展开来避免函数调用时的出栈、如栈,提高效率。但内联函数的代价是:

6、代码增大。inline函数适合成员函数和自由函数。在类中实现的函数自动为内联函数。inline必须定义到函数的实现上,例如:inline intPlusOne(int)是无效的。友元函数在类的体内被实现自动变为内联函数。17.#include #defineDEBUG(X)cout#X=Xendl 其中的#X表示X被当作字符串输出。18.assert(0!=0); 如果assert中的条件为假,则运行期间回退出程序,且报告出错代码的行号。(#include )19.静态对象在main结束或exit()被调用时才调用自身的析构函数。这意味着,在对象的析构函数中调用exit()是很危险的,有可能进

7、入一个死循环中。调用abort()来退出函数,静态对象的析构函数并不会被调用。我们可以用atexit()来指定跳出main或调用exit时要执行的操作,用atexit注册的函数,可以在所有对象的析构函数之前调用。voidexit_fn2(void)printf(Exitfunction#2calledn);/处理函数atexit(exit_fn2);20.全局变量实际上用的是静态存储。静态变量的构造是在进入main之前调用的,在main结束时调用它的析构函数。变量的名字由小范围(c+而言):/*.cppinta;/静态变量,但为externinta;即它是全局的,外部可见的staticintb

8、;/静态变量,static和extern相反,只在*.cpp中有效,对其他单元(文件)是不可见的。函数的定义和上面相同。main()类的静态成员变量可以如下赋值:intX:s=23;(在*.cpp中,无论公私都可以)21.名字空间(namespace):定义一个名字空间,然后使用unsing就可以将当前的类型上下文转换名字空间所定地的.namespacemathenumsignpositive,negative;classintegerinti;signs;public:interger(intI=0):i(i)signSign().;/endclassintergerA,B,C;interg

9、erdivide(interger,interger);/no;voidq()usingnamespacemath;intergerA;/hidesmath:AA.Sign(negative);Math:A.Sign(positive);22.一般对于函数flaotf(inta,intb); 某些c+编译器编译后生成_f_int_int的名字,有些c编译器则生成_f的名字。故在c+中链接c的库函数时要用extern“C”告诉编译器,按c的规则来编译函数。类似的还有extern“C”#include “myhead.h”,c+还支持extern“C+”.23.在函数调用时,传引用也是将指针压栈。

10、24.构造函数、析构函数、赋值构造函数、重载的=,四者的调用顺序:(三种函数都已实现)a)Xx;Xa=x;result:X:constructX:copy_structb)Xx;Xa;a=x;Result:X:constructX:constructX:copy_struoperator=X:destruct如果没有赋值构造函数则结果:X:constructX:constructoperator=X:destruct(如果直接Xa=x;这不掉用一般的构造函数,调用复制构造函数)指向类的成员函数的指针:设intX:a(void)Xx;int(X:*pf)(void)=&X:a;(x.*pf)()

11、;指向成员变量的指针:设inti;是X的成员变量intX:*pm=&X:i;Xx; 各章要点导读第 1 章 绪论本章作为全书的开篇,旨在使读者初步了解面向对象的程序设计语言之由来,初步了解面向对象的程序设计思想之基本特点,概要性地了解面向对象的软件开发方法,为后续章节的学习奠定基础。为什么需要首先有一个初步和概要性的了解呢?一方面,这是为了在以后的学习中具体接触到每一个新的概念、语法时都能够清楚地认识到,它在面向对象的方法中、在C+语言中的地位和作用是什么。另一方面,是希望读者在一开始就能够认识到,面向对象的思想与人类所习惯的思维方式是一致的,虽然C+语言比起面向过程的语言(如C语言)来要复杂

12、许多,但是C+设计者的目的是为了使事情变得更简单,而不是故弄玄虚将事情搞得更复杂。事实上,正是由于C+语法的复杂性,使得它的表现能力更强,程序员用C+来写程序的时候能够更容易、更灵活地实现各种功能。读者在阅读本章1.1-1.3时会感觉很多问题理解不透,这是正常的。因为需要学完本教材的全部内容,才能对C+语言和面向对象的方法有一个全面的认识。而本章在一开始就给出了一个全面介绍,虽然尽量使用通俗的语言,但是肯定仍有一些问题是读者先现在不能完全理解的。对此读者不必深究,对1.1-1.3的内容阅读后有个大致的了解就行。1.4节介绍了信息的表示与存储,这是程序设计的基本知识,是必须掌握的基础。建议读者认

13、真学习、完全掌握。不过有些读者可能会觉得这些知识在编程中并没有直接使用,不学这一节好像也不影响学习编程。但是没有这些基础知识,会影响你对程序理解。当然,如果觉得枯燥,也可以先略过这一节,待以后遇到疑问时,再来学习。因此有的教师在讲课时也略过这一节,留给学生自学,我本人就是这样做的。1.5节简单介绍了程序的开发过程和一些术语,不必死记硬背,最好结合实验来体会。本章的主要实验任务是学会使用一种C+开发工具,本书的实验用的是VC+6.0开发环境。认真完成这一实验很重要,了解开发环境的基本功能,使完成以后各章实验的基础。第 2 章 C+简单程序设计本章内容是程序设计的基础,学习的目标是掌握C+语言的基

14、本概念和基本语句,能够编写简单的程序段。这是初学程序设计者遇到的第一个难点:将解决问题的步骤用C+语言描述清楚。理解本章的简单例题不难,但是自己编写第一个程序却有点难以下手。学习编写程序可以从修改例题程序开始,也就是在原有例题程序的基础上,尝试自己增加或改变一些功能,或者用不同的方法来解决问题。如果你使用VC+开发环境编译、运行简单程序还有困难,应该首先复习一下实验一。本章的例题都是一些比较简单的问题,但是这些简单的例题给出了一些常见问题的典型解决方法,既是做软件开发必须掌握的基本功也是各种考试中经常出现的题目,读者应该达到熟练掌握,并能够举一反三。例如:例2-3是典型的比较问题,例2-4是情

15、况分支,例2-5是累加问题,也可以用for语句实现,要注意累加和的初始值一般是0,例2-10是简单的统计问题。当你开始改编例题程序时,首先遇到的阻力就是编译时和运行时出现的错误。如果程序中存在语法错误,编译时编译器就会指出错误的位置和错误原因(请参考实验二)。不过遗憾的是,编译器给出的信息常常不是很精确,而且多数编译器给出的错误信息是英文的,这就给初学者带来一定的困难。有时候编译一个十几行的小程序,就会出现几十个语法错误,这时不必感到茫然,只要仔细查看程序,参照编译器给出的错误信息一一改正就行了(有时候改正了一个错误,另外几十个错误也就迎刃而解了)。如果看不懂编译器给出的错误信息,可以借助于编

16、译器的帮助功能,当然一开始还经常需要借助于英文字典。建议读者准备一个笔记本,记下遇到的每一条错误信息、中文意思、导致这一错误的真正原因、解决方法。这样做一开始似乎很麻烦,但是经过一段时间,你会感到受益匪浅。一旦你熟悉了一种编译器给出的错误信息,当你再换用别的编译器时会发现他们对错误的描述都是类似的,你很快就可以适应。这个办法是我上大学时我的老师教我的,我自己觉得很有效,我做老师以后,也这样告诉学生,但愿意这样做的学生很少,大家都嫌麻烦。结果呢,随着学习的深入,作业越来越难、程序越来越大,也就有越来越多的学生抱怨实验课时间不够用。究其原因,很大程度上是因为不熟悉错误信息,改正语法错误花了太多时间

17、。改正语法错误的能力是编程的基本功,也是相对比较简单的事情(毕竟编译器会直接指出错误)。较难以发现和改正的错误,是运行时的错误。也就是说,编译时没有语法错误,但是运行的结果却不对,这往往是因为你的算法(就是解决问题的方法)设计有问题。这样的错误是比较难以定位和改正的,查找这种错误的位置和原因叫做“程序调试”,调试程序的能力和经验需要在长期的编程实践中积累,大多数编译器都提供了辅助调试的功能(debug),实验二将引导你学会使用VC+6.0的debug功能。第 3 章 函数本章的主要目标是学会将一段功能相对独立的程序写成一个函数,为下一章学习类和对象打好必要的基础。掌握函数定义和调用的语法形式并

18、不难,但是要有效地应用函数,必须对函数调用的执行过程和参数的传递有深刻的认识,这也正是初学时的难点。要很好地理解函数的调用和参数传递,尤其是嵌套调用和递归调用的执行过程,比较有效方法是利用编译器的调试功能,跟踪函数调用的执行过程、观察参数和变量的值,实验三会引导你进行跟踪和观察。利用引用传递参数,是函数间数据共享的一个重要方法,但是一部分读者对引用类型的理解会有困难,其实只要简单地将引用理解为一个别名就可以了。在介绍函数的同时,本章也介绍了一些有用的算法。例3-6介绍了产生随机数序列的方法,例3-8、3-9、3-10介绍了递归算法。本章的例题程序与第2章相比显然复杂了一些,需要仔细阅读并上机调

19、试才能完全理解。对于较复杂的程序,书中都以注释的形式给出了详细说明,请读者在阅读程序的时候务必认真阅读注释文字。递归算法是一种非常简洁高效的算法,用途很广泛,但理解起来有一定的难度,自己编写递归程序更不是件容易的事。作为初学者,对此不必着急。学习是一个循序渐进的过程,本章介绍递归算法主要是为了说明C+语言允许函数的递归调用,如果要完全理解和熟练编写递归程序,还需要学习“数据结构”课程,一般的“数据结构”书中都会详细介绍递归算法及其应用。当然,喜欢钻研的读者不妨准备一张大纸,在利用调试功能跟踪递归程序的执行过程时,记录下递归过程中各个变量的值,会有助于对递归算法的理解。第 4 章 类与对象前面介

20、绍的只是一般程序设计的基础知识,从本章开始才真正接触到面向对象的程序设计。类是面向对象程序设计中最重要、最基本的概念,也是学习面向对象方法时遇到的第一个难点。类是对逻辑上相关的函数与数据的封装,是对问题的抽象描述。要理解类与对象必须结合实例来学习,读者一边读书可以一边思考:除了书中列出的例子,现实世界中还有哪些有形或无形的事务可以被抽象为程序中的类,每个类又存在哪些对象(实体)。这样对类的概念就会理解得快一些。在学习类成员的访问控制、构造函数、析构函数时,读者自然会有这样的疑问:这些语法有什么用呢?难道写个小程序也必须搞得这么麻烦吗?应该说C+是适合写大型程序的,C+语言的设计师Bjarne

21、Stroustup在C+语言的设计和演化一书中指出:“C+是作为一种系统编程语言、作为一种为开发由大的系统部件组成的应用而进行设计的”。因此,在初学者编写小型程序时很难看到C+的优越性。虽然我在书中尽量结合实例来讲,但限于本书定位于初学读者,例题不可能很复杂、庞大,所以读者总感到例题只是验证性的,有点牵强。从学习这一章开始,学生就会经常问我,语法为什么是这样、规定为什么这么多?进而将语法规定作为讨厌的东西,在内心抵触。我在书中已经谈了很多关于C+和面向对象方法的特点、用途,但在编写小程序时很难看到面向对象方法的优点。对于初学者来说,我建议换一种思维方式,如果目前还看不到某些语法规定的意义,先不

22、要钻牛角尖。比如构造函数、拷贝构造函数和析构函数,在本章的例题中,还体现不出它们的用途,那就先不理会它们,待以后用到的时候,再去体会其中的妙处,这一章里,就先了解一下这些语法规定。这样想,学习的时候心情是否会轻松些呢?从这一章开始每章的最后一节都是一个实例人员信息管理系统,这个例子贯穿后续各章节,利用每章介绍的知识不断丰富程序的功能,建议读者仔细阅读、体会,并尝试修改、补充程序的功能。本章中还介绍了利用UML语言表示类与对象的方法,以后各章还将进一步介绍用UML语言表示类之间的关系,但这远不是UML语言的全部,这方面的内容也不是初学时的重点,读者可以不必深究,了解一下就可以了。如果有需要,可以

23、另外学习软件工程课程。第 5 章 C+程序的结构本章主要是介绍与程序的结构、模块间的关系、数据共享相关的内容。读者学习这一章时的主要问题可能是感觉到与其它章节相比,这一章显得有些芜杂,语法规定很多。不过只要寻着程序结构和数据共享这两条主线,思路就会比较清晰。标识符的作用域和对象的生存期问题,是研究程序模块之间数据传递、数据共享的基础。静态成员是类的对象之间共享数据和代码的手段。友元是不同的类之间、类与类外的函数之间共享数据的机制。而常引用、常对象、常成员为共享的数据提供了保护机制。使用多文件结构,有利于大型项目的分工合作、分别开发。如果要在一个项目的不同程序文件之间共享数据和代码,就要用到外部

24、变量和外部函数。本章内容语法规定较多,有的读者对这些语法规定不太理解,总想找个老师问问:能不能这样写?是不是会有那样的效果?如果周围没有人可以请教,常常感到束手无策。有的读者逐一理解这些语法规定到也不难,但是会觉得记不住,还会混淆,其实根本原因还是没有将每一个问题理解透彻。我建议读者要自己验证每一个语法规定,用反证的方法更有助于理解和加深印象。比如,语法规定当程序流程离开了一个变量的作用域,就不能使用该变量,那么你可以编一段程序,尝试在变量的作用域之外使用这个变量,看看后果是什么。还可以尝试用普通的成员函数去处理常对象,看看会是什么情况。这样验证以后,很多疑问就解开了。以后学习后续章节时也是这

25、样的,如果有些问题反复看都不能理解、反复想都想不清楚,那就不是看和想能解决的了,这时就需要自己动手编一些程序来试验,效果往往不错。第 6 章 数组、指针与字符串本章介绍了数组、指针与字符串。学习数组时首先要清楚它的用途,数组是用来存储和处理群体数据的一种数据结构。使用数组类型,需要清楚数组元素的存储方式、数组名、下标等概念。数组是由相同类型元素组成的,其元素在内存中是连续存放的,数组名就是数组元素的首地址,是一个常量,而下标标志着元素在数组中的位置序号。需要注意的是数组下标从0开始,不是从1开始。由于数组的这种特性,访问数组元素时只要写出数组名和下标,系统就可以计算出该元素在内存中的位置,从而

26、操作该元素。所以借助于数组可以通过循环语句按照某种规律依次处理大量数据。C+的基本数据类型中没有字符串类型,本章介绍了用字符数组处理字符串的方法。这是从C语言延续过来的方法,但并不是一个好的方案,在C+程序中建议使用C+标准库的string类。指针是C/C+的一个重要特点,也是学习的一个难点。要很好地理解和使用指针,首先需要对计算机的内存和内存地址等概念有所了解,要知道执行中的程序代码和当前使用的数据都是存放在内存中的。指向对象的指针是对象的地址,指向函数的指针是函数代码的地址。指向类的非静态成员的指针使用起来与一般指针略有不同,因为非静态成员是属于对象的,所以必须通过对象名来访问。有了指针,

27、使程序员有了更多的灵活性,同时也带来一些不安全因素,增加了程序出错的机会,因此除了在十分必要的情况下,程序中一般尽量不要使用指针。比如,访问数组元素既可以借助于下标也可以利用指针,通常用下标是比较好的选择。但是当需要进行动态内存分配时,就必须使用指针来存放内存地址了。应用动态内存分配技术,使程序可以有效地使用内存空间,但是当对象的成员指向动态分配的内存空间时,就需要为这个类编写具有深拷贝功能的拷贝构造函数,还要在析构函数中记得释放动态分配的空间。使用指针时,要特别注意避免空指针操作,也就是指针一定要先初始化再使用。使用数组时,要注意数组名是常量不能被赋值。下面是初学者很容易犯的错误:char

28、a4, *p1, *p2;cinp1; /错误,p1没有被初始化p2=a; cinp2; /正确a=abc; /错误,数组名不能被赋值p1=abc; /正确,将字符串常量abc的首地址赋给p1学习这一章时,要善于利用编译器的debug功能观察指针变量中的地址值和该地址中的数据,观察数组中元素的排列,以及动态分配的内存空间中的数据。第 7 章 继承与派生本章介绍类的继承关系,与类的组合关系相似类的继承也是为了代码重用。使用继承首先要理解继承关系的含义,当需要重用一个类的代码时要区别该问题应该使用类的组合关系还是类的继承关系来描述,通常可以用“是一种”来检验类之间是否应存在继承关系。例如,汽车是一

29、种交通工具,因此“汽车”类可以继承“交通工具”类。虽然在构成“汽车”类时需要利用“车轮”类,但是“汽车”与“车轮”之间不存在上述关系,而存在整体与部件的关系,因此用类的组合为宜。在使用继承关系的时候,从基类继承的成员的访问控制属性需要特别注意,初学时不太容易记住。首先要明确从基类继承的成员的访问控制属性受两方面因素影响:一是成员在基类中原来声明的访问控制属性,二是继承方式。很多读者学习本章时都有这样的疑问:分别在什么情况下使用公有继承、保护继承、私有继承?简单来说,如果希望基类的成员被继承过来以后与派生类的成员一样,就用公有继承。如果只希望派生类的成员及其子类能方便的访问从基类继承的成员,不希

30、望类外的函数访问这些成员,可以用保护继承。如果希望基类的成员被继承以后都变成私有的,就用私有继承。无论用哪种继承方式,基类的私有成员被继承以后都不能被直接访问。对待比较简单的问题,像这样选择就可以了,对于复杂系统的开发,需要有更多的考虑,那是系统设计的任务。运用继承关系时,构造函数和析构函数的特性也是一个重要方面。要注意,基类的构造函数和析构函数都不被继承,但是在建立派生类对象时基类的构造函数会首先被自动调用,派生类对象消亡时,最后会自动调用基类的析构函数。派生类的构造函数要负责为基类的构造函数传递参数,否则基类的缺省构造函数会自动被调用。当同时继承多个基类且有对象成员时,要清楚构造函数的调用

31、次序是先调用基类的构造函数,再调用对象成员所在类的构造函数,最后执行派生类的构造函数体,析构函数的执行次序相反。为了观察对象的构造、析构过程,可以在构造、析构函数中输出相应信息,或者利用debug工具跟踪程序流程。在多继承的情况下,如果存在公共基类,就会出现成员标识二义性的问题,这时将公共基类作为虚基类继承是一个比较好的解决方案。本章最后一节的应用实例有助于读者对类的继承和虚基类的理解,建议读者阅读该程序以后尝试添加更多的功能。第 8 章 多态性本章介绍多态性,多态是指同样的消息被不同类型的对象接收时导致不同的行为。首先介绍的运算符重载,是一种静态多态机制,它与函数重载的道理时一样的。实际上“

32、将操作表示为函数调用火时将操作表示为运算符之间没有什么根本差别”,这是Bjarne Stroustup在C+语言的设计和演化一书中说的。认识到这一点,编写运算符重载程序也就不是什么难事了。不过要注意的是,重载运算符是一种扩充语言的机制,而不是改变语言的机制。因此我们只能将已有的运算符重载使之作用于新的类,不能增加新的运算符,也不能将重载的运算符作用于基本数据类型,C+的语法对此都有严格的限制。动态多态性是面向对象程序设计语言的重要特征,在C+中是通过虚函数来实现的。请读者不要将虚函数与前一章讲的虚基类混淆,二者的作用是不同的。虚基类解决的是类成员标识二义性和信息冗余问题,而虚函数是实现动态多态

33、性的基础。派生类对象可以初始化基类对象的引用,派生类对象的地址可以赋值给基类的指针,这意味着一个派生类的对象可以当作基类的对象来用。但是如果想要通过基类的指针和引用访问派生类对象的成员,就要使用虚函数,这便是多态。很多情况下,基类中的虚函数是为了设计的目的而声名的,没有实现代码,这就是纯虚函数,其所在的类成为抽象类。抽象类是为后继所有派生类设计的同一抽象接口。最后一节的应用实例,体现了多态性在实际应用中的作用。第 9 章 群体类和群体数据的组织本章介绍了对线性群体数据的存储和处理,介绍这些内容的目的有三方面:一是以数组类、链表类、栈类、队列类以及查找、排序算法为综合例题,对前面章节的内容进行全

34、面复习;二是使读者掌握一些常用的数据结构和算法,能够解决一些略复杂的问题,也为下一章学习C+标准模板库打下基础。在第六章中曾经介绍过一个动态数组类,但是其结构和功能都比较简单。本章介绍的安全数组类运用了动态内存分配和运算符重载,使得该类对象既具有可变的大小、安全的访问机制,又有基本数组的访问形式。链表是一种存储顺序访问的线性群体的数据结构,本章介绍的单链表由一组具有数据成员和后继指针的结点构成。与数组相比,链表有着更灵活的动态内存分配机制,插入和删除结点时也无须移动其它元素。以数组类和链表类为基础,对数据元素的访问加以限制,便构成了栈类和队列类。栈具有后进先出的特性,也就是数据元素的插入和删除

35、都只能在栈顶进行。队列具有先进先出的特性,元素只能从队尾入队,从队头出队。另外本章还介绍了几种数据查找和排序算法。在对上述数据结构和算法的介绍中,综合运用了前面章节讲过的知识,学习这一章的同时也起到了复习的作用。为了使数组类与基本数组的访问形式一样,定义了一系列运算符重载函数。在数组类的拷贝构造函数和=运算符函数中,可以看到深拷贝与浅拷贝的区别。本章中的数组、链表、栈、队列都是以类模板的形式声明和实现的,查找和排序算法也都是以函数模板形式定义的,这是C+独特的类型参数化机制。通过这些类模板和函数模板的应用,读者可以很容易的体会到模板的作用,而这正是下一章要将的泛形程序设计的基础。本章对类模版的

36、介绍比较简单,没有涉及类模板的继承关系。对初学者来说重点是理解模板的作用,学会简单的应用,对于较复杂的语法问题,可以先不考虑。有些读者可能会感觉本章的例题比起以前的章节来难度明显增大了许多,不过本章的教学目标并不是要使读者仅仅学了这一章就能够设计、实现同样难度的类模板、函数模板。而是通过这些例题复习以前的知识、学会模板的声明和应用,同时初步了解几个常用的数据结构和算法,并能够应用已经编写好的模板来解决问题。这也是为下一章打基础。要深入学习有关数据结构的内容,还需要专门的数据结构教材。第 10 章 泛型程序设计与C+标准模板库这一章的目标主要是初步了解泛形程序设计的概念,学会C+标准模板库(ST

37、L)的使用方法,为此本章介绍了一些与之有关的基本概念、术语和简单的应用举例。STL是最新的C+标准函数库中的一个子集,这个庞大的子集占据了整个库的大约80%的分量。要很好地理解STL,不仅需要相关的数据结构知识,而且需要有一定的编程经验。因此本章旨在使读者对STL有一个基本了解,为进一步学习使用STL打下一个基础。读者只要能看懂本章的例题,并能够模仿着编写类似的简单程序就可以了。要完全掌握STL不是一朝一夕的事,需要参考STL手册,并在长期编程实践中积累经验。ANSI/ISO C+文档中的STL是一个仅被描述在纸上的标准,对于诸多C+编译器而言,需要有各自实际的STL,它们或多或少的实现了标准

38、中所描述的内容,这样才能够为我们所用。之所以有不同的实现版本,则存在诸多原因,有历史的原因,也有各自编译器生产厂商的原因。STL网站(本书的附录C给出了STL中通用算法函数原型及说明。第 11 章 流类库与输入/输出I/O流类库是一个提供输入/输出功能的,面向对象的类库。流是对输入/输出的一个抽象表述,程序通过从流中提取字符和向流中插入字符来实现输入和输出。一般来说,流是与实际的字符源或目标相关的,例如磁盘文件、键盘或显示器,所以对流进行的提取或插入操作实际上就是对物理设备的操作。标准输入/输出流对象是连接程序与标准输入/输出设备的。常用的标准输出流有:cout、cerr、clog,标准输入流

39、有:cin。标准流对象都是在中预先声明好的。除了标准输入/输出流以外,使用其它的流之前都要首先声明流对象,因此对于I/O流类库的结构需要十分清楚。输入/输出流类有许多成员函数,除了主教材中介绍的以外,读者如果需要详细了解更多的信息,请查阅关于标准C+库的书籍和手册。ttp:/ 有I/O流类库的详细说明及例题,使用VC+6.0开发环境的读者,可以查阅MSDN联机帮助系统,获得标准C+库的说明。第 12 章 异常处理在大型面向对象应用程序中,经常涉及到异常处理。使用异常处理使得应用方案的设计更方便、具体。C提供了一个非常好的异常处理方法。通过这种方法,被调函数可以告知调用函数:有某种错误出现。C中

40、的异常处理可以涵盖到对任何错误的处理,不论是内存分配失败还是程序运行过程中类型转换错误。异常处理提供了一种将控制和信息从错误发生点转移到异常处理点的方法。当一个函数中出现错误而它自身不能解决时,这个函数可以抛出(throw)一个异常,通知它的直接或间接调用者处理这个错误。一个函数可以通过捕获(catch)以常来表明它希望处理这种异常。C提供了三个关键字来对例外进行处理。 try:可能抛出异常的段程序必须以try开始。紧跟着try的是一段包含在大括号中的程序,这段程序有可能抛出异常。throw:异常要通过关键字throw来抛出。异常对象的类型决定了哪一个catch语句可以捕获这一异常。catch

41、:处理异常的程序必须以catch开始。跟随在catch后面的是一段包含在大括号中的程序。第 13 章 MFC库与Windows程序开发概述编写Windows环境下的图形用户界面程序,只是C+语言的众多应用领域之一,MFC库是一种C+基础库,为Windows这一特定的操作系统环境下的图形用户界面程序提供了强大的支持。本章的目的在于使读者对Windows环境下的应用开发有一个初步了解,以此作为C+语言的应用实例,并不期望读者通过本章学习能够自如地编写Windows程序。对于初学编程的读者,可以将本章作为一般只是浏览,不必追求完全理解。有兴趣的话,应该按照例13-1的说明,自己上机实践一下,对Win

42、dows程序的开发就有一个概要性理解了。 面向对象程序设计课文精讲串讲文字材料 一、面向对象及C+基础知识 (一)面向对象程序设计基础 (1)面向对象的优点 (2)面向对象程序的结构 (3)面向对象程序语言的关键要素 (4)数据封装 (5)C+ 语言的来龙去脉 (二)C+ 基本程序结构 (1)作用域与作用域运算符: (2)const修饰符 (3)函数 (4)new 和 delete 运算符 (5)引用 二、类和对象 (一)类 (1)类的声明 (2)类的成员 (3)类中成员的访问属性 (4) 类的作用域 (5)类的两种声明方式 (6)空类 (7)嵌套类 (8)类的实例化 (二)数据成员 (1)数

43、据成员的类型 (2)数据成员的修饰符 (3)数据成员的初始化 (三)成员函数 (1)成员函数的定义 (2)内联成员函数 (3)重载成员函数 (4)带缺省参数的成员函数 (5)this 指针 (四)对象 (1)对象的定义 (2)对象的引用 (3)对象的生命周期 (4)对象的相互赋值 (5)对象可以作为数组的元素 (6)可以说明指向对象的指针 (7)对象可以用作函数参数 (8)一个对象可以用作另一个对象的成员 (五)结构和联合 (1)使用结构定义类 (2)使用联合定义类 三、构造函数与析构函数 (一)构造函数 (1)构造函数的作用 (2)构造函数的定义 (3)构造函数的性质 (4)构造函数的种类

44、(5)构造函数与运算符new (6)构造函数用作类型转换函数 (7)构造函数的构成 (8)构造函数的调用 (二)析构函数 (1)析构函数的作用 (2)析构函数的定义 (3)析构函数的性质 (4)缺省析构函数 (5)析构函数与运算符delete (6)析构函数的调用 (7)析构函数的特别事项 (三)构造函数和析构函数与对象 (1)对象的初始化 (2)对象赋值 (3)对象成员 (4)对象数组 四、继承和派生类 (一)基本概念 (1)什么是派生? (2)派生的性质 (3)派生后的变化 (4)派生类的类型 (5)派生的目的 (6)保护成员的作用 (二)派生类的声明格式 (1)单一继承 (2)多重继承

45、(3)派生方式 (三)访问权限 (1)公有派生的访问权限 (2)私有派生的访问权限 (四)赋值兼容规则 (1)适应范围 (2)含义 (3)规则 (五)派生类的构造函数 (1)一般格式 (2)构造规则 (3)调用顺序 (六)派生类的析构函数 (1)格式 (2)调用顺序 (七)二义性及其解决 (1)二义性的产生及作用域运算符 (2)支配规则解决二义性 (八)重复继承 (1)何为重复继承? (2)C+对重复继承的限制 (九)虚基类 (1)问题的提出 (2)虚基类的定义 (3)虚基类的作用 (4)带虚基类的派生类的声明 (5)带虚基类的构造函数的构造 (6)带虚基类的构造函数的调用顺序 (7)带虚基类

46、的析构函数的调用顺序 五、多态性与虚函数 (一)多态性 (1)何为多态性? (2)联编的概念 (3)多态性与联编 (4)重载 (5)引入派生类后的指针 (二)虚函数 (1)函数的作用 (2)虚函数的定义和说明 (3)虚函数的访问权限 (4)成员函数与虚函数 (5)构造函数、析构函数与虚函数 (6)空虚函数 (7)重载函数与虚函数 (8)多重继承与虚函数 (三)纯虚函数与抽象类 (1)何为纯虚函数? (2)纯虚函数的定义 (3)何为抽象类? (4)抽象类的性质 (四)虚析构函数 六、进一步使用成员函数 (一)静态成员 (1)静态数据成员 (2)静态成员函数 (二)友元 (1)友元函数 (2)友元

47、成员 (3)友元类 (4)友元和派生类 (三)Const 对象和Volatile 对象 (1)返回对象 (2)使用带有this指针的函数 (3)同时定义const和volatile成员函数 (4)注意事项 (四)转换函数 (五)指向类成员的指针 (1)指向数据成员的指针 (2)指向成员函数的指针 (六)数组与类 七、运算符重载及流库类 (一)运算符重载 (1)重载方法 (2)运算符重载的方式 (3)运算符重载的说明 (4)对运算符重载的调用 (5)+ 与 - 运算符的重载 (6)对运算符“()”的重载 (7)对运算符“”的重载 (二)运算重载与类型转换 (三)C+ 的流与流库类 (1)C+ 的

48、流 (2)streambuf类 (3)ios 类 (四)输入输出格式控制 (1)用ios的成员函数进行格式控制 (2)用操纵符进行格式控制 (3)自定义操纵符 (五)运算符“”和“”的重载 (1)重载输出运算符“” (六)文件的输入输出 (1)文件的打开与关闭 (2)文本文件的输入输出 (3)二进制文件的输入输出 (4)流的错误处理 八、模板 (一)模板的概念 (二)函数模板与模板函数 (1)函数模板的声明和模板函数的生成 (2)函数模板的异常处理 (三)类模板与模板类 (1)类模板 (2)定义模板类与它的成员函数 (3)类模板的派生 九、进一步掌握面向对象程序设计 (一)面向对象的设计 (1

49、)类的确定 (2)面向对象的设计方法 (3)类群和类树 (4)类群和类树 (二)设计中的几个问题 (1)整体认识 (2)类的组织 (3)类和函数的设计与说明 (4)继承和面向程序设计 十、试题分析 (一)关于各种试题类型的分析 (1)自考试题的出题特点 (2)各种试题类型的特点及答题中应注意的事项 单项选择题 填空题 改错题 完成程序题 程序分析题 面向对象程序设计第一章内容提要 一、面向对象程序设计基础 (1)面向过程与面向对象 1)面向过程及其困境 所谓“面向过程”,就是不必了解计算机的内部逻辑,而是把精力主要集中在解题算法的逻辑和过程的描 述上,使用过程语言编写程序,通过程序把解决问题的

50、执行步骤告诉计算机。 面向过程的程序的可重用性差、维护代价高。也引入了困扰软件开发的两大难题,即: 如何超越程序复杂性障碍; 如何在计算机系统中自然地表示客观世界,即对象模型。 2)面向对象及其优点 面向对象的观点认为,客观世界是由各种各样的实体,也就是对象组成的。每种对象都有自己的内部状态 和运动规律,不同对象之间的相互联系和相互作用就构成了各种不同的系统,并且进而构成整个客观世界 。按照这样的思想设计程序,就是面向对象的程序设计。 面向对象程序设计方法是软件系统的设计与实现的新方法。这种新方法是增加软件的可扩充性和可重用性 ,来改善并提高程序员的生产能力,并能控制软件的复杂性和软件的维护开

51、销。 “面向对象”的优点是: 第一,有希望解决软件工程的两个主要问题软件复杂性控制和软件产生率的提高; 第二,符合人们的思维习惯,即能够自然地表现现实世界的实体和问题,这对软件开发过程有着重要的意 义。 (2) 面向对象程序设计方法 1)面向对象的程序设计中的对象 面向对象的程序设计,是通过为数据和代码建立分块的内存区域,以便提供对程序进行模块化的一种程序 设计方法,这些模块可用作样板,在需要时再建立其副本。所以对象是计算机内存中的一块区域,通过将 内存分块,每个模块(即对象)在功能上相互之间保持相对独立。并且: 这些内存块中不但存储数据,而且也存储代码; 这些内存块的结构可被用作样板产生对象

52、的更多副本。 在面向对象的程序中,对象之间只能通过函数调用实现相互通信。一个对象可以调用另一个对象的函数, 这样,对象之间的相互作用方式是仔细控制的,处于一个对象外部的代码就没有机会通过直接修改对象的 内存区域妨碍对象发挥其功能。 对象的这一特点导致了模拟现实世界的一种新型方法:面向对象就是将世界看成是由一组彼此相关并且能 相互通信的实体即对象组成的。程序中的对象映射现实世界中的对象。 2)面向对象程序的主要结构特点 面向对象程序设计是一种新的程序设计范型。面向对象程序的主要结构特点是: 第一,程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递消息的规 律; 第二,

53、程序中的一切操作都是通过对象发送消息来实现的,对象接收到消息后,启动有关的方法完成相应 的操作。 面向对象程序设计的最大优点就是软件具有可重用性。当人们对软件系统的要求有所改变时,并不需要程 序员做大量的工作,就能是系统做相应的变化。 3)面向对象程序的要素 面向对象的程序设计方法要求语言必须具备抽象、封装、继承和多态性这几个关键要素。 抽象(数据抽象):面向对象鼓励程序员以抽象的观点看待程序,也就是说,程序是一组抽象的对象 类组成的。程序员从一组对象为起点,抽取公共的行为将其放入到一个类中,这基本上是抽象分类的 观点,不同类的对象具有不同的行为。 数据封装:数据封装就是将一组数据和与之有关的

54、操作集合组装在一起,形成一个能动的实体,也就 是数据的表示方式与对数据的操作细节被隐藏起来,用户通过操作接口对数据进行操作。 封装要求一个对象应具备明确的功能,并且具有接口以便和其它对象相互作用。同时,对象的内部实现( 代码和数据)是受到保护的,外界不能访问它们,只有局部于对象的代码才可以访问该对象的内部数据。 对象内部数据结构的不可访问性称为数据隐藏。 面向对象系统中的封装单位为对象,即主要指对对象的封装,而该对象的特性则由它所属的类的说明来描 述。 继承 继承表达的是一种对象之间的相交关系,即一个对象可以获得另一个对象的特性的机制,它支持层次类这 一概念。通过继承,低层的类只需定义特定于它

55、的特征,而共享高层的类中的特征。若类之间有继承关系 ,则它们之间应有下列特性: 类间具有共享特征(包括数据与程序代码的共享); 类间具有细微的差别或新增部分(包括非共享的数据和程序部分); 类间具有层次结构。 继承具有的作用有两方面:其一,可以减少代码冗余;其二,可以通过协调性来减少相互间的接口与界面 。 多态性:不同的对象可以调用相同名称的函数,并可导致完全不同的行为的现象称为多态性。利用多 态性,可大大地提高了解决复杂问题的能力。C+ 语言支持两种多态性:编译时的(静态)多态性和运行 时的(动态)多态性。 (3)C+ 语言的来龙去脉 在C+中,对象具有更大的重要性。在这种方法下,程序中操作

56、的任何成分都可以看做对象。C+是C的扩 充(或称为C语言的超集),是一种基于C的面向对象语言,即它继承了C语言高度简洁、高度灵活和高效 率等优点和特点,完善了C语言的类型检查、代码重用、数据抽象机制,扩充了对面向对象程序设计的支 持。从开发时间、费用到形成的软件的可*性、可重用性、可扩充性、可维护性等方面都显示出 C+ 语 言的优越性。 对象是从类中产生的程序结构,定义类的变量也称为类的实例化。类鼓励程序员在设计程序时将数据和操 作一同考虑,它是C+语言支持面向对象设计的重要语言特色之一。 C+语言不是一种纯面向对象的语言,即C+程序中还要使用像main()这样的全局函数。但是面向对象的思 想

57、为C+程序员指出了一个努力的方向:应该尽可能地把变量和函数都限制在局部的类中。 您当前的位置:面向对象程序设计第一章内容提要 二、C+语言对C语言在非OOP级上的扩充 (1)新的输入输出风格 C+ 的输入输出是通过流来实现的,C+ 的流中与输入输出有关的是: 标准输入流:cin ,通过右移操作符“”进行输入操作,即“cin变量”表示把输入设备(在此为键 盘)上接受到的数据,存入变量中; 标准输出流:cout,通过左移操作符“”进行输出操作,即“cout变量”表示把变量的内容送到标准 输出设备(在此是显示器)上显示。 它们被包含在头文件 iostream.h 中。 由于在 C+ 风格的输入/输出中,数据能自动地按它的数据类型进行转换,所以较之 C 风格的输入/输出 更方便。 在此要说明的是: 使用 C+ 风格的输入输出时,在程序的开始处必须包含语句 #include iostre

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!