首页 > 图书中心 > C++面向对象程序设计教程

前言

作者使用过数本C++面向对象程序设计的教材,发现不少问题,C++教学的普遍结果是,学生学完了C++,但却不会使用目前流行的C++开发工具编写程序。而且不少教材都存在错误。例如某C++语言经典教材在关于打开文件的代码中出现了类似如下的代码:  ofstream outFile;                            // 定义文件变量

if (outFile.open("test.txt", ios::app))             // 以追加方式打开文件

{  // 打开文件失败

    cout <<"打开文件失败!" <<endl;

    exit(1);                            // 退出程序

}上面代码完全不能通过编译,原因是文件流类的成员函数open()返回值类型为void,出现这些错误的原因是作者想当然按照C语言类似函数fopen()编写代码,没有上机测试所写代码,至使学生看完书后还不能上机编程或上机编程非常困难,实际上只要上机运行很容易就能发现类似的错误及错误的原因,可按如下方式进行修改:  ofstream outFile;                            // 定义文件变量

outFile.open("test.txt", ios::app);              // 以追加方式打开文件    

if (outFile.fail()) 

{  // 打开文件失败

    cout <<"打开文件失败!" <<endl;

    exit(1);                            // 退出程序

}书籍中存在错误是在所难免的,但是这种潜在错误对读者的影响是难以估量的。由于这类教材的读者面太大,读者很难有机会发现这种错误,并会一直延续这种错误的观念,这类问题在一些教材中存在了十多年,甚至最近的最新版也依然存在。

传统的C++教学都过于注重解释C++语言本身,而忽视了其在具体环境中的使用指导,例如对于如下的类声明及相关代码:  #include <iostream>                           // 编译预处理命令

using namespace std;                        // 使用命名空间std 

// 声明复数数

class Complex

{

private:

// 数据成员

  double real;                        // 实部

  double image;                        // 虚部

public:

// 公有函数    

  Complex(double r = 0, double i = 0): real(r), image(i){}            // 构造函数

    friend Complex operator+(const Complex &z1, const Complex &z2)     // 复数加法

    { return Complex(z1.real+z2.real, z1.image+z2.image); }

    …

};上面的类声明及相关代码在Visual C++ 2005、Visual C++ 2005 Express、Dev-C++ 4.9.9.2和MinGW Developer Studio 2.05都能正常通过运行,但在Visual C++ 6.0 SP6下会出现编译时错误,是Visual C++ 6.0的一个Bug,在Visual C++ 6.0中可将:  #include <iostream>                           // 编译预处理命令

using namespace std;                        // 使用命名空间std 改为:  #include <iostream.h>                           // 编译预处理命令

#include <stdlib.h>                           // 包含system()的声明这时才可正常运行,又比如对于输入运算符“>>”和输出运算符“<<”重载为类的友元函数时,采用标准头文件iostrteam,在Visual C++ 6.0 SP6、Visual C++ 2005、Visual C++ 2005 Express、Dev-C++ 4.9.9.2和MinGW Developer Studio 2.05中都不能通过编译,只能在Visual C++ 6.0中采用传统的头文件iostream.h才能通过编译。但将输入运算符 ">>" 和输出运算符“<<”重载为普通函数时无任何编译问题。

可惜的是,作者还没有发现哪本教材对上面类似的具体编程环境进行详细指导,这类教材无形中大大增加了学生应用C++的难度。

本书作者经过十多年教学及查阅大量参考资料后编写了本书,全书共分为8章。第1章阐述C++的主要特点及C++程序开发过程,还详细介绍了C++在非面向对象方面的常用新特性。第2章介绍了面向对象程序设计技术,C++类的定义、对象的创建以及对象成员的访问,友元与静态成员等基本内容。第3章介绍了模板编程方法,并对模板容易出现的编程问题进行详细的讨论。第4章介绍了运算符重载,重点对不同C++编译器使用运算符重载时的兼容性问题进行具体指导。第5章着重介绍了C++的继承机制及虚基类。第6章介绍了多态性,重点介绍了虚函数和抽象类。第7章介绍了输入输出流,重点讨论标准输入输出流类、文件操作与文件流类。第8章对C++中的其他主题进行了深入阐述,这些主题都是难点,但都不是重点。如果这些内容在前面的章节中加以讨论,对于学生就会因难度过大而较难进入面向对象的思维模式,当学生已具备面向对象的思维习惯以后,再来介绍这些典型问题应该比较合适。

对于初学者,考试时往往会感到茫然而不知所措,因此本书习题包括了选择题、填空题和编译题。这些题目选自于考试题,可供学生期末复习,也可供教师编写试题时参考,对教师还提供了习题参考答案。

本书在部分章节中还提供了实例研究,主要提供给那些精力充沛的学生深入学习与研究,这些实例包括对正文内容的应用(例如第6.4节中栈的实现实际上就是抽象类的一个典型应用,第7.5节中的简单工资管理系统就是文件操作的应用)、读者深入学习时可能会遇到的算法(例如第3.4节中的快速排序)以及应用所学知识解决实际问题(例如第7.5节中的简单工资管理系统就是文件操作实现简单信息管理系统),通过读者对实例研究的学习,可提高实际应用C++面向对象程序设计的能力,当然有一定的难度,但应比读者的想象更易学习与掌握。

为了尽快提高读者的实际编程能力,本书各章提供了程序陷阱,包含了在实际编程时容易出现的问题,也包括了正文内容的深入讨论,还包括了对C++编译环境中存在兼容性问题进行了实用而具体的指导,这部分内容不管对初学者还是长期编程的人都很有用。

现在谈谈有关C++编译器的问题,在C++之外的任何编程语言中,编译器都没有受到过如此的重视。这是因为C++是一门非常复杂的语言,以至于编译器也难于构造,我们常用的编译器都不能完全符合C++标准,如下介绍一些常用的优秀C++编译器。

 (1)  Visual C++编译器。由微软开发,现在主要流行Visual C++ 6.0、Visual C++ 2005以及Visual C++ 2005 Express,特点是集成开发环境用户界面友好,信息提示准确,调试方便,对模板支持最完善;Visual C++ 6.0对硬件环境要求低,现在安装的计算机最多,但对标准C++兼容只有83.43%, Visual C++ 2005与Visual C++ 2005 Express在软件提示信息上做了进一步的优化与改进,并且对标准C++兼容达到了98%以上的程度,但对硬件的要求较高;还有Visual C++ 2005 Express是一种轻量级的Visual C++软件,对于编程爱好者、学生和初学者来说是很好的编程工具。微软在2006年4月22日正式宣布 Visual Studio 2005 Express版永久免费。

 (2)  GCC编译器。著名的开源C++编译器。是类UNIX操作系统(例如Linux)下编写C++程序的首选,有非常好的可移植性,可以在非常广泛的平台上使用,也是编写跨平台、嵌入式程序很好的选择。GCC 3.3与标准C++兼容能够达到96.15%。现已有一些移植在Windows环境下使用GCC编译器的IDE(集成开发环境),例如Dev-C++与MinGW Developer Studio,其中Dev-C++是能够让GCC在Windows下运行的集成开发环境,提供了与专业IDE相媲美的语法高亮、代码提示和调试等功能;MinGW Developer Studio是跨平台下的GCC集成开发环境,目前支持 Windows、Linux和 FreeBSD;根据作者的实际使用,感觉使用GCC编译器的IDE错误信息提示的智能较低,错误提示不太准确,还有就是对模板支持较差,但对语法检查较严格,在Visual C++编译器中编译通过的程序可能在GCC编译器的IDE还会显示有错误信息。

本书所有算法都同时在Visual C++ 6.0、Visual C++ 2005、Visual C++ 2005 Express、Dev-C++和MinGW Developer Studio中通过测试。读者可根据实际情况选择适当的编译器,建议选择Visual C++ 6.0. 

教师可采取多种方式来使用本书作为讲授C++面向程序设计,应该根据学生的背景知识以及课程的学时数来进行内容的取舍。为满足不同层次的教学需求,本教材使用了分层的思想,分层方法如下:没有加星号“*”及双星号“”的部分是基本内容,适合所有读者学习;加有星号“*”的部分适合计算机专业的读者作为深入学习的选学部分;加有双星号“”的部分适合于感兴趣的读者研究。

作者为本书提供了全面的教学支持,如果在教学或学习过程中发现与本书有关的任何问题都可以与作者联系:youhongyue168@gmail.com,作者将尽力满足各位的要求,并可能将解答公布在作者的教学网站http://cs.scu.edu.cn/~youhongyue上。在教学网站上将提供如下内容。

 (1)  提供书中所有例题在Visual C++ 6.0、Visual C++ 2005、Visual C++ 2005 Express、Dev-C++和MinGW Developer Studio开发环境中的测试程序,今后还会提供当时流行的C++开发环境的测试程序,还提供本书作者开发的软件包。

 (2)  提供教学用PowerPoint幻灯片PPT课件。

 (3)  向教师提供所有习题参考答案,对学生来讲,将在每学期期末(第15周~第20周)公布解压密码。

 (4)  提供高级语言程序设计问答专栏。

 (5)  提供至少6套C++面向对象程序设计模拟试题及其解答,以供学生期末复习,也可供教师出考题时参考。

 (6)  提供C++面向对象程序设计相关的其他资料(例如Dev-C++与MinGW Developer Studio软件、流行免费C++编译器的下载网址). 

希望各位读者能够抽出宝贵的时间,将对本教材的建议或意见寄给作者,你的意见将是我们再版修订教材的重要参考。

何凯霖、姜琳、聂清彬、黄维、游倩、邹昌文、王文昌、周焯华、胡开文、沈洁、周德华、欧阳、文涛、文芝明和文波等人对本书做了大量的工作,包括编写部分章节,提供资料,调试算法,参与了部分内容的编写,在此特向他们表示感谢;作者还要感谢为本书提供直接或间接帮助的每一位朋友,由于你们热情的帮助或鼓励激发了作者写好本书的信心和写作热情。

本书的出版要感谢清华大学出版社编辑,由于他们为本书的出版倾注了大量热情,也由于他们具有前瞻性的眼光才让读者有机会看到本书。

尽管作者有良好而负责任的严格态度,并尽了最大努力,但由于作者水平有限,书中难免有不妥之处,因此,敬请各位读者不吝赐教,以便作者有一个提高的机会,并在再版时尽力采用你们的意见,尽快提高本书的质量。

作 者2010年2月

版权所有(C)2023 清华大学出版社有限公司 京ICP备10035462号 京公网安备11010802042911号

联系我们 | 网站地图 | 法律声明 | 友情链接 | 盗版举报 | 人才招聘