内容简介目录 本书内容详尽,示例丰富,通过400多个简短易懂的示例深入介绍了C++程序设计方法。全书共分18章,前5章讲解了C++编程和C语言过程化编程之间的区别,内容包括从C到C++的迁移、命名空间、输入输出基础、引用变量和动态内存分配;后面各章介绍了一些常用类及其用、构造函数和析构函数、异常处理、函数重载、继承、模板、输入/输出流、操丛符、string类及标准模板库等内容;本书最后的附录A列出了相关的参考书目,附录B则提供了使用C++的一些准则。本书结构特色实用性和可操作性强。提供了大量的编程示例,帮助学生透彻理解所学的概念。通过大量的练习题进一步巩固所学的内容,确保学生能够真正掌握各章节的内容。科简短明了的"小结"部分总结了各章节的主题内容,使学生对所学的内容一个整体的认识。"注意"部分重点说明了与章节中所介绍概念相关的重要内容。 第1章 由C迁移到C++1.1 概述1.2 C与C++的比较1.3编译器如何识别C++程序1.4预处理器如何识别环境1.5新的注释风格1.6永远不要假定(隐式地使用int类型)1.7 main()的默认返回值1.8声明与定义的区别1.9函数声明中的形参名称1.1 O 函数定义中的形参名称1.1l 所有的函数在调用前必须先声明l-1 2空圆括号的含义1.13函数参数的默认值1.14初始化与赋值的区别1.15放置变量声明的地方1.16 for循环内的变量声明1.17标记名成为类型名1.18 C++与C中枚举类型的区别1.1 9初始化全局变量1.20数组初始化1.2 1 布尔类型1.22 void木指针1.23 使用O,而不是宏NULL1.24 关键字const1.24.1 所有的常量必须初始化1.24.2将常量值的参数传递给函数的含义1.24.3 函数返回值为常量的含义1.24.4 const如何影响指针1.24.5 C++与C中字符数组的区别1.24.6如何支持char const*类型的数组1.24.7 C以及C++处理const方式的区别1.24.8使用const而不是#define1.24 变量的连接1.25新的类型强制转换风格1.25.1 类型强制转换以及转换的区别1.25.2类型强制转换的一般格式1.25.3 static cast1.25.4 reinterpret cast1.25.5 const-cast1.25.6您不会犯错1.26 C以及C++关键字第2章命名空间2.1 概述2.2存在的问题2.3 如何创建命名空间2.4作用域分解运算符2.5 如何访问命名空问的成员2.5.1 直接访问命名空间的成员2.5.2 using声明:访问命名空间成员的另一种方法2.5.3 using指令:访问命名空间成员的另一种方法2.6 小心避免不明确的情况2.7无名的命名空间2.8命名空间的别名2.9 Koenig查找规则第3章输入/输出基础3.1 概述3.2使用新函数的理由3.3头文件:命名约定3.4 iostream头文件3.5 cout对象3.5.1插入运算符3.5.2显式地限定cout对象3.5.3使用using声明来访问cout对象3.5.4使用using指令来访问cout对象3.6关于正确使用std命名空间的建议3.7 了解运算符的优先级3.8输出格式3.9 cin对象3.1O检查文件是否结束第4章引用变量4.1 概述4.2存在的问题4.3如何创建引用变量4.4所有的引用都必须初始化4.5 引用的作用4.6使用const限定引用4.7何时不需要使用引用4.8没有"常量引用"4.9创建对指针的引用4.10创建对数组的引用4.11 由函数返回引用第5章动态内存分配5.1 概述5.2如何为单个对象分配动态内存5.3如何初始化基本类型5.4空圆括号的含义5.5如何释放单个对象的空闲空间5.6如何为对象的数组分配空闲空间5.7如何释放对象数组的空闲空间5.8保持平衡5.9如何使用new和delete在空闲存储区中存储字符串5.10如何分配和删除多维数组5.11 命名该空间5.12两个程序输出示例第6章类6.1 概述6.2 C中的结构6.2.1 全局函数6.2.2 C存在的问题6.3初识封装6.3.1修订后的Circle抽象6.3.2必须支持常量对象6.4结构与类6.5类的用途6.6类的组件6.7如何编写类定义6.7.1 类声明与类定义6.7.2关于输入/输出类6.8数据隐藏的原则6.9访问限定符6.9.1 private关键字6.9.2 public关键字6.9.3 protected关键字6.9.4选择编码风格6.10模块化并实现隐藏6.10.1如何模块化6.10.2用户的任务6.10.3本节小结6.1 1 如何通过实例来访问类成员6.12 内联函数6.12.1 内联函数的含义6.12.2 内联函数与宏的对比6.12.3 使得内联函数对编译器有效6.12.4放置内联函数的地方6.12.5 内联函数的连接6.12.6如何编写全局成员内联函数6.12.7 如何编写类成员内联函数6.12.8隐式内联和显式内联的比较6.13 mutable关键字6.14如何显示类的内容6.15类中的枚举类型6.15.1使用枚举的原因6.1 5.2私有枚举6.1 5.3 公有枚举6.15.4 "Enum Hack"的作用第7章构造函数和析构函数7.1 概述7.2构造函数的定义7.2.1语法规则7.2.2何时不调用构造函数7.2.3编译器提供的默认构造函数7.2.4默认的构造函数:普遍定义7.2.5初始化常量对象7.2.6构造函数重载7.2.7不能直接调用构造函数7.3析构函数的定义7.3.1编译器提供的析构函数7.3.2析构函数的作用7.3.3编写您自己的析构函数7.3.4语法规则7.4如何实例化类并调用默认构造函数7.5如何实例化类并向构造函数传递参数7.6如何阻止使用默认构造函数的实例化7.7隐式类型转换7.8复制构造函数7.8.1默认复制构造函数7.8.2复制构造函数的语法7.8.3复制构造函数的数量7.8.4浅复制与深复制7.8.5编写您自己的复制构造函数7.8.6如何阻止对象复制7.9函数风格的强制转换7.10初始化与赋值7.11基/成员初始化列表7.11.1默认初始化7.11.2强制使用基/成员初始化列表7.11.3 另一种初始化调用的情况7.12关于指针7.13 形参名与类成员名7.14非静态数据成员的初始化顺序7.15 基本类型的数组作为非静态数据成员7.16用户自定义类型数组作为非静态数据成员7.17如何创建用户自定义实例的数组7.18如何声明常量数据成员数组7.19如何在空闲存储区中创建用户自定义类型7.20如何在空闲存储区中创建用户自定义类型的数组7.2l调用new时的语法第8章类的其他特征8.1 概述8.2 this指针8.2.1 解引用this指针来复制调用对象8.2.2解引用this指针以允许链接函数8.3静态类数据成员8.3.1 在类的定义中初始化静态类数据成员8.3.2静态成员函数8.3.3用于生成随机数的类8.3.4 Die类8.3.5 Dice类8.4类的大小8.5友元函数8.5.1 类如何授权一个函数作为它的友元函数8.5.2成员函数和非成员函数8.5.3 使用非成员非友元函数替代友元函数8.5.4在命名空间中声明类的友元函数8.6友元类8.7 类的封装8.8运算符转换函数8.8.1 用途8.8.2语法8.9类成员指针8.9.1全局函数指针8.9.2指向非静态类成员函数的指针8.9.3 使用指向非静态成员函数的指针调用函数8.9.4指向静态类成员函数的指针第9章异常处理9.1 概述9.2如何抛出异常9.3如何捕获异常9.4 catch代码块的匹配处理9.5异常处理的一个简单示例9.6释放堆栈9.7如果调用new失败怎么办9.8如何防止new抛出异常9.9异常的传播9.10如何处理指向空闲空间的指针9.11 不能销毁还没有创建的对象9.12重新抛出对象9.13 从子对象成员中捕获抛出的异常9.14function-try-blocks9.15子对象成员和指针的混合使用9.16对象的局部结构9.17编写异常.安全代码9.17.1 堆栈中的简单对象9.17.2堆栈中的对象数组9.17.3 空闲存储区中的简单对象9.17.4再论空闲存储区中的简单对象9.17.5 空闲存储区中的对象数组9.17.6再论空闲存储区中的对象数组9.18析构函数和异常处理9.19异常规范9.20 出错条件9.20.1 意外错误9.20.2终止错误9.21 编译器如何对待异常规范9.22为类定义operator new()函数第10章函数重载10.1 概述lO.2几个关于函数重载的示例10.3忽略返回类型10.4 const限定参数按值传递l0.5 const限定参数按指针传递10.6 const限定参数按引用传递10.7可变成员函数和常量成员函数10.8 重载决议10.9根据指针类型重载10.10名称重整10.10.1如何避免名称重整10.10.2类型.安全连接10.11运算符函数重载10.11.1运算符优先级表10.11.2重载运算符的命名10.11.3默认参数。10.11.4 C++自带的运算符10.11.5不能改变优先级10.11.6不能改变"Narity"10.11.7不能改变结合性10.11.8成员函数与非成员函数10.11.9至少支持一个类实例10.11.10中缀表示法和函数表示法10.11.1l 二元成员函数和隐式类型转换10.11.12多次重载或者允许隐式类型转换10.11.13运算符的重载10.11.14赋值运算符10.11.15函数调用运算符10.11.16下标运算符10.11.17间接成员运算符10.11.18复合赋值运算符10.11.19自增运算符和自减运算符10.11.20重载逗号运算符10.11.21重载逻辑与和逻辑或运算符10.11.22重载插入运算符10.11.23运算符小结第11章继承11.1 概述11.2 内存中的派生类实例1l.3 使用继承创建is-a关系11.4如何定义派生类11.5再论结构和类11.6 关键字protected11.7访问特权11.8基类"存取器"函数11.9修改继承访问11.10 函数隐藏11.11 派生类成员函数如何调用基类成员函数11.12管理函数11.12.1如何编写管理函数11.12.2派生类到基类的标准转换11.12.3 隐藏非成员函数11.12.4不要对数组进行向上类型转换11.1 3 多态性11.14多态性和虚函数11.14.1 友好的程序代码和不友好的程序代码11.14.2重写虚函数11.14.3虚析构函数11.14.4从基类的构造函数中调用虚函数11.1 5抽象基类11.15.1 再论关于贷款的示例11.15.2关于虚函数的异常规范11.16里氏代换原则11.17多重继承11.17.1 虚基类11.17.2初始化虚基类第12章模板12.1 概述12.2 函数模板12.2.1 不使用宏的原因12.2.2如何编写函数模板12.2.3优化代码12.2.4在何处使用函数模板12.2.5针对不同的参数类型进行实例化12.2.6显式地指定类型12.2.7默认的函数参数12.2.8完全特殊化函数模板12.2.9如何调用特殊化的函数12.2.10对特殊化和重载的选择12.2.11特殊化greater()函数模板12.3类模板12.3.1如何定义类模板12.3.2在类定义之外定义成员12.3.3实例化类模板12.3.4另一个模板的模板实例化12.3.5默认模板参数12.3.6在类模板中声明另一个友元类12.3.7在类模板中声明友元函数12.3.8特殊化类模板12.3.9在类模板中嵌入类模板12.3.10从类模板中派生新类12.4非类型模板参数12.4.1 默认的模板参数和特殊化12.4.2关于使用非类型模板参数的有趣示例12.5 成员模板12.6模板模式12.7关键字typename第13章运行时类型信息l3.1 概述13.2动态转型态13.3动态转型态是如何工作的13.4关键字typeid第14章输出流14.1 概述14.2实例std::cerr和std::clog14.3如何格式化输出14.3.1位格式标志14.3.2如何打开位格式标志14.3.3 如何以合适的基数显示整数14.3.4如何显示整数的基数设置14.3.5如何显示整数的符号14.3.6如何将输出显示为大写字母14.3.7如何显示字符14.3.8如何设置输出字段宽度14.3.9如何指定填充字符14.3.10如何指定字段对齐14.3.1 1 如何格式化浮点型数值14.4如何显示bool类型14.5如何显示地址14.6如何输出到内存缓冲区14.6.1 成员函数ostream::flush()14.6.2预定义的stdio和iostream流的混合使用第15章输入流l5.1 概述15.2如何检查错误15.2.1错误报告标志15.2.2访问成员函数15.2.3直接测试iostream对象15.2.4成员函数std::basic ios::clear()15.2.5如何清空输入流的缓冲区l5.3 字符输入15.3.1使用提取运算符实现对字符串的输入15.3.2限制输入字符的个数15.3.3使用std::istream::getline()实现字符串输入第16章操纵符16.1 概述16.2操纵符的格式16.3一些简单的操纵符l6.4 不带参数调用的内置操纵符16.5使用带有一个参数的操纵符16.6使用带有一个参数的内置操纵符第17章文件输入/输出17.1 概述17.2文件输入/输出类17.3文件输出17.3.1文件名参数17.3.2文件模式参数17.3.3验证文件是否打开17.3.4关闭打开的文件17.3.5输出磁盘文件示例1 7.4 文件输入1 7.5文件位置标记l 7.6 文件更新1 7.7 二进制模式17.8未格式化的输出17.9未格式化的输入17.10重定向I/O第1 8章string类与标准模板库18.1概述18.2 string类l8.3标准模板库18.3.1 std::vector类18.3.2迭代器18.3.3迭代器的类型18.3.4基于string的I/O18.3.5标准模板库中的算法18.3.6标准模板库的主要容器18.3.7比较对象附录A参考书目附录B C++准则