
| 《零基础学c++(第2版)》 前言 第一篇 c++基础 第1章 c++概述1 1.1 了解计算机1 1.1.1 计算机硬件2 1.1.2 计算机软件3 1.2 程序设计语言3 1.2.1 机器语言3 1.2.2 汇编语言4 1.2.3 高级语言5 1.2.4 数据结构和算法6 1.2.5 面向过程的程序设计(pop)6 1.2.6 面向对象的程序设计(oop)6 1.3 c++简介7 1.3.1 c++语言发展历程7 1.3.2 c++语言特点8 1.3.3 c++程序开发基本过程8 1.4 c++开发环境的搭建9 1.4.1 visual c++ 6开发环境简介9 .1.4.2 开发步骤10 1.5 第一个c++程序11 1.6 小结12 1.7 上机实践习题12 第2章 开始c++之旅13 2.1 c++程序的结构13 2.1.1 注释14 2.1.2 编译预处理与新旧标准14 2.1.3 主函数14 2.1.4 名称空间16 2.1.5 c++语素17 2.2 变量与基本类型18 2.2.1 变量18 2.2.2 整型20 2.2.3 浮点型21 2.2.4 基本字符型21 2.2.5 宽字符型22 2.2.6 布尔型22 2.3 常量22 2.3.1 整型常量和浮点型常量23 2.3.2 字符型常量23 2.3.3 字符串常量25 2.3.4 符号常量26 2.3.5 枚举常量27 2.4 运算符与表达式28 2.4.1 算术运算28 2.4.2 逻辑运算30 2.4.3 短路表达式30 2.4.4 关系运算31 2.4.5 大有文章: 变量是否为“0”31 2.4.6 条件运算32 2.4.7 位运算32 2.4.8 赋值运算35 2.4.9 ++和--37 2.4.10 逗号表达式38 2.4.11 sizeof运算符与sizeof表达式38 2.4.12 运算符的优先级和结合性38 2.5 类型转换40 2.5.1 赋值转换40 2.5.2 表达式中的转换43 2.5.3 强制类型转换44 2.5.4 函数调用和传递参数时的类型转换45 2.6 流程控制语句45 2.6.1 if...else...选择结构45 2.6.2 switch结构47 2.6.3 if...else...结构和switch结构的比较51 2.6.4 for循环结构51 2.6.5 for循环结构嵌套53 2.6.6 while循环结构54 2.6.7 do...while循环结构54 2.6.8 循环语句的效率55 2.6.9 流程转向控制语句之break55 2.6.10 流程转向控制语句之continue56 2.6.11 自由转向语句goto56 2.6.12 程序中止函数exit()57 2.7 小结58 2.8 上机实践习题58 第二篇 c++过程开发 第3章 数组和c风格字符串61 3.1 什么是数组61 3.2 一维数组62 3.2.1 一维数组的声明62 3.2.2 初始化一维数组63 3.2.3 一维数组应用举例64 3.2.4 数组操作注意事项65 3.3 c 风格字符串65 3.3.1 c 风格字符串的声明65 3.3.2 字符数组的cin和cout66 3.3.3 get()函数和getline()函数67 3.3.4 cin与get()/getline()函数的搭配问题68 3.3.5 访问c风格字符串中的某个元素69 3.3.6 c风格字符串处理函数69 3.4 多维数组71 3.4.1 声明一个多维数组71 3.4.2 初始化多维数组72 3.4.3 多维数组应用举例72 3.4.4 多维数组在内存中是如何排列元素的73 3.5 小结74 3.6 上机实践习题74 第4章 指针和引用76 4.1 指针的定义与使用76 4.1.1 声明一个指针变量76 4.1.2 初始化指针变量79 4.1.3 指向指针的指针80 4.1.4 指针赋值80 4.2 指针的运算81 4.2.1 指针与整数的加减81 4.2.2 同类型指针间的比较82 4.2.3 同类型指针相减82 4.3 动态内存分配83 4.3.1 使用new动态分配内存83 4.3.2 使用delete动态释放及动态申请的内存83 4.3.3 使用new申请动态数组83 4.3.4 不要使用或释放已经释放的内存块85 4.3.5 使用malloc和free动态申请内存85 4.3.6 动态内存申请并不一定能成功87 4.4 指针和const87 4.4.1 禁止改写指针(常量指针或常指针)87 4.4.2 禁止改写间接引用88 4.4.3 既禁止改写指针,又禁止改写间接引用88 4.5 指针与数组88 4.5.1 数组名指针88 4.5.2 数组元素的指针形式90 4.5.3 指向数组的指针90 4.5.4 指针数组92 4.6 引用95 4.6.1 引用的声明95 4.6.2 引用的特点95 4.6.3 引用的使用限制96 4.6.4 其他要说明的问题97 4.7 小结97 4.8 上机实践习题98 第5章 结构、共用体和链表99 5.1 结构99 5.1.1 如何定义一个结构99 5.1.2 结构变量的声明和使用100 5.1.3 结构变量的初始化102 5.1.4 结构变量间是否可以相互赋值102 5.1.5 结构体变量的sizeof103 5.2 共用体105 5.2.1 共用体的定义105 5.2.2 共用体和结构的区别105 5.2.3 共用体变量的声明和初始化107 5.2.4 共用体使用举例107 5.2.5 共用体的sizeof109 5.3 结构数组和共用体数组109 5.3.1 结构数组的声明和初始化109 5.3.2 共用体数组的声明和初始化110 5.4 指向结构的指针111 5.4.1 声明一个结构指针111 5.4.2 结构指针的初始化112 5.4.3 使用指针访问结构成员114 5.5 链表114 5.5.1 链表的结构115 5.5.2 创建链表115 5.5.3 链表与数组的区别116 5.5.4 链表的遍历和查找116 5.5.5 链表的插入和删除118 5.6 小结121 5.7 上机实践习题122 第6章 用函数合理组织程序124 6.1 模块化带来的好处124 6.1.1 函数的调用过程124 6.1.2 抽象和封装125 6.1.3 实现一个函数126 6.2 函数定义126 6.2.1 函数头127 6.2.2 函数体127 6.2.3 函数定义补充说明128 6.3 函数声明129 6.3.1 为什么要进行函数声明129 6.3.2 如何声明一个函数130 6.3.3 分割程序文件131 6.4 函数调用132 6.4.1 形参和实参133 6.4.2 参数类型转换133 6.4.3 值传递134 6.4.4 指针传递135 6.4.5 引用传递136 6.4.6 对3种传递的补充137 6.4.7 默认参数调用138 6.4.8 inline函数140 6.5 递归141 6.6 函数的重载143 6.6.1 何时使用函数重载144 6.6.2 如何实现函数重载144 6.6.3 陷阱:隐式转换导致重载函数出现二义性144 6.7 c++如何使用内存145 6.7.1 自动存储(栈存储)145 6.7.2 静态存储(编译器预分配)148 6.8 作用域与可见域152 6.8.1 作用域153 6.8.2 可见域153 6.8.3 函数的作用域和可见域156 6.9 小结156 6.10 上机实践习题157 第7章 关于函数的高级专题158 7.1 内存使用错误剖析158 7.1.1 内存泄露158 7.1.2 野指针159 7.1.3 试图修改常量160 7.1.4 用错sizeof161 7.1.5 内存越界访问161 7.1.6 变量的初始化162 7.2 重申:函数参数传递和返回机制162 7.2.1 参数传递时的“副本”162 7.2.2 函数返回时的“副本”164 7.3 函数与指针165 7.3.1 指向函数的指针165 7.3.2 typedef167 7.3.3 通过函数指针将函数作为另一个函数的参数168 7.3.4 函数指针数组169 7.3.5 返回函数指针的函数171 7.3.6 带参主函数171 7.4 函数与数组172 7.4.1 数组名作为函数参数172 7.4.2 通过指针得到多于1个的回传值175 7.5 函数与结构体、共用体及类对象176 7.5.1 3种参数调用176 7.5.2 3种返回机制177 7.6 函数编写的建议177 7.6.1 合理使用const177 7.6.2 检查输入参数的有效性178 7.6.3 函数返回类型的判断179 7.7 小结179 7.8 上机实践习题179 第三篇 面向对象的c++ 第8章 面向对象技术基础181 8.1 面向对象基本概念181 8.1.1 类的概念182 8.1.2 类是分层的182 8.1.3 类和对象的关系183 8.2 c++类的定义183 8.2.1 类定义的基本形式183 8.2.2 类定义示例184 8.2.3 class和struct185 8.3 c++类的实现185 8.3.1 在类定义时定义成员函数185 8.3.2 在类定义的外部定义成员函数186 8.4 c++类的使用187 8.4.1 声明一个对象188 8.4.2 对象的作用域、可见域和生存期189 8.5 对象的创建和撤销189 8.5.1 构造函数的作用189 8.5.2 构造函数可以有参数190 8.5.3 构造函数支持重载191 8.5.4 构造函数允许按参数默认方式调用192 8.5.5 初始化表达式192 8.5.6 析构函数194 8.5.7 显式调用析构函数195 8.6 复制构造函数196 8.6.1 复制构造函数调用机制196 8.6.2 默认复制构造函数带来的问题198 8.6.3 解决方案—显式定义复制构造函数199 8.6.4 关于构造函数和复制构造函数201 8.7 特殊数据成员202 8.7.1 const数据成员202 8.7.2 引用成员204 8.7.3 类对象成员206 8.7.4 特别说明210 8.7.5 static数据成员210 8.8 特殊函数成员212 8.8.1 静态成员函数212 8.8.2 const与成员函数214 8.9 对象的组织215 8.9.1 const对象215 8.9.2 指向对象的指针217 8.9.3 对象的大小218 8.9.4 this指针219 8.9.5 对象数组220 8.9.6 对象链表221 8.10 为对象动态分配内存221 8.10.1 使用new和delete为单个对象分配/释放动态内存221 8.10.2 使用new和delete为对象数组分配/释放动态空间222 8.10.3 malloc和free能否为对象动态申请内存224 8.11 小结224 8.12 上机实践习题225 第9章 关于对象的高级专题227 9.1 类的作用域227 9.2 类定义的作用域与可见域229 9.3 对象的生存期、作用域和可见域232 9.3.1 先定义,后实例化232 9.3.2 对象内存的释放与堆内存232 9.4 友元232 9.4.1 友元的非成员函数233 9.4.2 友元的成员函数234 9.4.3 友元函数的重载236 9.4.4 友元类236 9.4.5 友元是否破坏了封装性237 9.5 运算符重载238 9.5.1 运算符重载规则238 9.5.2 以成员函数形式重载运算符239 9.5.3 以友元函数形式重载运算符242 9.5.4 友元函数形式和成员函数形式的比较245 9.5.5 对运算符重载的补充说明246 9.6 运算符重载范例247 9.6.1 赋值运算符247 9.6.2 函数调用运算符250 9.6.3 下标运算符251 9.7 类型转换253 9.7.1 由其他类型向定义类的转换253 9.7.2 由自定义类向其他类型的转换255 9.7.3 隐式转换带来的二义性257 9.8 重载函数选择规则257 9.8.1 重载解析258 9.8.2 什么是完全匹配258 9.9 小结259 9.10 上机实践习题259 第10章 继承262 10.1 什么是继承262 10.1.1 简单示例262 10.1.2 继承的层次性264 10.2 派生类264 10.2.1 public派生与private派生264 10.2.2 protected成员与protected派生265 10.3 多基派生266 10.3.1 多基派生的声明和定义266 10.3.2 二义性问题267 10.3.3 解决方案268 10.4 虚基类268 10.4.1 共同基类带来的二义性268 10.4.2 解决方案270 10.4.3 虚基派生二义性与多基派生二义性不同271 10.5 派生类的构造函数和析构函数271 10.5.1 派生类的构造函数271 10.5.2 派生类的析构函数273 10.5.3 多基派生类的构造函数和析构函数275 10.5.4 虚基派生类的构造函数和析构函数275 10.6 分清继承还是组合278 10.6.1 继承不是万金油278 10.6.2 组合278 10.7 基类与派生类对象间的相互转换280 10.7.1 类型适应280 10.7.2 多基继承时的情况282 10.7.3 公共基类282 10.7.4 虚基类的情况284 10.8 小结284 10.9 上机实践习题285 第11章 多态287 11.1 多态与虚函数287 11.1.1 静态联编287 11.1.2 动态联编287 11.1.3 为什么需要虚函数287 11.1.4 虚函数的声明和定义290 11.2 虚函数的访问290 11.2.1 对象名访问291 11.2.2 指针访问292 11.2.3 引用访问292 11.2.4 类内访问293 11.2.5 在构造函数或析构函数中进行访问294 11.3 纯虚函数与抽象类295 11.3.1 纯虚函数的声明和定义295 11.3.2 抽象类296 11.3.3 另一种抽象类:类中只定义了protected型的构造函数299 11.3.4 延伸:构造函数能否为private型301 11.3.5 虚析构函数302 11.4 虚函数引入的二义性305 11.4.1 多基派生305 11.4.2 共同基类和虚继承307 11.5 重载、覆盖与隐藏309 11.5.1 重载309 11.5.2 覆盖309 11.5.3 隐藏310 11.6 小结311 11.7 上机实践习题312 第四篇 泛 型 编 程 第12章 模板315 12.1 为什么要定义模板315 12.1.1 类型参数化315 12.1.2 模板的定义317 12.2 函数模板318 12.2.1 函数模板的使用318 12.2.2 隐式实例化318 12.2.3 显式实例化320 12.2.4 特化321 12.2.5 重载322 12.2.6 优先级与执行顺序322 12.3 类模板324 12.3.1 定义类模板324 12.3.2 隐式实例化326 12.3.3 显式实例化326 12.3.4 显式特化327 12.3.5 部分特化328 12.3.6 重载和优先级328 12.4 模板的嵌套329 12.4.1 函数成员模板329 12.4.2 对象成员模板330 12.5 模板参数331 12.6 小结332 12.7 上机实践习题333 第13章 标准模板库335 13.1 理解stl335 13.1.1 容器335 13.1.2 适配器336 13.1.3 迭代器336 13.1.4 算法336 13.2 使用序列式容器336 13.2.1 序列式容器的创建和元素的访问336 13.2.2 所有容器都支持的特征338 13.2.3 序列式容器中元素的插入和删除339 13.2.4 vector容器344 13.2.5 deque容器344 13.2.6 list容器344 13.3 使用关联式容器344 13.3.1 set容器345 13.3.2 multiset容器346 13.3.3 map容器346 13.3.4 multimap容器348 13.4 关联式容器支持的成员函数操作349 13.4.1 元素的插入349 13.4.2 元素的删除352 13.4.3 元素的查找与访问354 13.5 迭代器355 13.5.1 理解迭代器本质355 13.5.2 迭代器类型355 13.5.3 为什么要定义这么多迭代器357 13.5.4 容器中定义的迭代器类型与5种类型的对应358 13.5.5 流迭代器358 13.5.6 迭代器失效360 13.6 泛型算法360 13.6.1 什么是函数对象360 13.6.2 算法分类361 13.7 适配器365 13.7.1 容器适配器366 13.7.2 迭代器适配器367 13.7.3 函数适配器369 13.8 小结371 13.9 上机实践习题371 第五篇 输入输出处理和编程规范 第14章 输入输出和文件373 14.1 输入输出概述373 14.1.1 什么是文件374 14.1.2 流374 14.1.3 缓冲区375 14.1.4 重定向375 14.1.5 3种输入输出机制376 14.2 高层i/o377 14.2.1 标准输出函数printf377 14.2.2 标准输入函数scanf381 14.2.3 扫描集384 14.2.4 sprintf函数和sscanf函数385 14.2.5 fprintf函数和fscanf函数386 14.2.6 文件访问机制386 14.3 流类库390 14.3.1 流类库更安全、更高效390 14.3.2 流类库层次390 14.4 输出流394 14.4.1 操作符[[394 14.4.2 其他ostream方法395 14.4.3 格式状态字397 14.4.4 格式控制值的默认值398 14.4.5 flag函数读取和设定格式状态字398 14.4.6 使用setf函数和unsetf函数设定格式关键字400 14.4.7 设置域宽402 14.4.8 填充字符404 14.4.9 浮点数输出和显示精度404 14.4.10 控制符406 14.5 输入流408 14.5.1 ]]操作符408 14.5.2 输入流与格式状态字408 14.5.3 输入流与域宽410 14.5.4 使用get函数读取单个字符411 14.5.5 使用get函数和getline函数读取c风格字符串413 14.5.6 其他istream方法415 14.6 流状态417 14.6.1 什么是流状态417 14.6.2 读取流状态417 14.6.3 管理流状态418 14.7 重载]]和[[420 14.7.1 插入符的重载420 14.7.2 抽取符的重载422 14.8 文件操作423 14.8.1 文件操作基本过程423 14.8.2 文件的打开423 14.8.3 取消文件和流的关联425 14.8.4 文件的读写426 14.8.5 文本文件的读写427 14.8.6 二进制文件的读写428 14.8.7 文件定位指针和随机读取429 14.9 字符串流431 14.9.1 strstream类族431 14.9.2 sstream类族434 14.10 小结437 14.11 上机实践习题437 第15章 名称空间439 15.1 什么是名称空间439 15.1.1 名称空间范例439 15.1.2 定义名称空间440 15.2 实体的作用域与可见域441 15.2.1 实体可见域442 15.2.2 可见域的扩展442 15.2.3 using声明机制443 15.2.4 using声明带来的多重声明问题(二义性)445 15.2.5 空间内的屏蔽445 15.2.6 先声明,后使用446 15.3 名称空间的作用域与可见性447 15.3.1 名称空间的定义策略447 15.3.2 推荐用法450 15.3.3 名称空间嵌套451 15.3.4 using编译指令452 15.3.5 未命名的名称空间453 15.4 对名称空间的思考454 15.5 小结454 15.6 上机实践习题454 第16章 异常和错误456 16.1 编码时的防错456 16.1.1 调用abort函数或exit函数456 16.1.2 返回错误标志457 16.2 异常机制458 16.2.1 关键字throw460 16.2.2 异常处理程序460 16.2.3 自定义异常对象463 16.2.4 有继承关系的类异常464 16.2.5 terminate函数和set_terminate函数466 16.2.6 unexpected函数与set_unexpected函数467 16.2.7 标准异常468 16.2.8 对unexpected函数的补充470 16.3 异常发生时的内存管理471 16.3.1 堆栈解退471 16.3.2 异常处理机制与函数的不同472 16.3.3 构造函数中抛出异常473 16.3.4 内存泄露474 16.3.5 析构函数中可否抛出异常475 16.4 auto_ptr类476 16.4.1 使用auto_ptr类模板477 16.4.2 关于auto_ptr的若干问题477 16.5 小结478 16.6 上机实践习题479 第17章 rtti和类型转换操作符481 17.1 rtti机制481 17.1.1 dynamic_cast操作符482 17.1.2 typeinfo类和typeid操作符483 17.1.3 补充说明484 17.2 类型转换操作符484 17.2.1 const_cast操作符484 17.2.2 static_cast操作符485 17.2.3 reinterpret_cast操作符486 17.3 小结486 17.4 上机实践习题487 第18章 string字符串类489 18.1 为什么要使用string类489 18.2 声明一个字符串489 18.3 字符串的输入输出491 18.4 string类功能492 18.4.1 string字符串和c风格字符串的转换492 18.4.2 赋值和清空492 18.4.3 元素删除493 18.4.4 元素追加与相加493 18.4.5 元素插入494 18.4.6 大小和容量494 18.4.7 元素存取494 18.4.8 字符串比较495 18.4.9 提取子串495 18.4.10 搜索与查找495 18.5 小结496 18.6 上机实践习题496 第19章 编码风格497 19.1 程序的排版497 19.1.1 注释497 19.1.2 空行的用法498 19.1.3 代码行498 19.1.4 空格498 19.1.5 缩进与对齐499 19.1.6 &和*的位置499 19.2 命名规则499 19.2.1 windows风格和unix风格500 19.2.2 如何对程序实体命名500 19.3 项目文件的组织500 19.3.1 模块划分500 19.3.2 头文件500 19.3.3 定义文件501 19.3.4 目录结构501 19.4 小结 501 19.5 上机实践习题502 第20章 程序编译503 20.1 程序的编译流程503 20.2 预处理504 20.2.1 头文件包含505 20.2.2 宏505 20.2.3 条件编译506 20.2.4 #ifdef、 #ifndef与重复包含507 20.2.5 使用const代替#define定义常量508 20.2.6 inline与#define的比较509 20.3 vc6调试入门509 20.3.1 断点的设置与去除509 20.3.2 条件断点510 20.3.3 数据断点510 20.3.4 消息断点511 20.3.5 观察视图(watch)511 20.3.6 内存视图(memory)511 20.3.7 变量视图(variables)511 20.3.8 寄存器视图(registers)511 20.3.9 调用堆栈视图(call stack)512 20.3.10 反汇编视图(disassembly)512 20.3.11 进程控制512 20.4 其他调试手段512 20.4.1 debug模式和release模式512 20.4.2 assert宏512 20.4.3 输出字符串513 20.5 小结513 20.6 上机实践习题513 第六篇 面试题精选 第21章 常见面试题517 21.1 常见基本知识问答题517 面试题1:简述面向对象的3个基本特征517 面试题2:局部变量能否和全局变量重名517 面试题3:类成员函数的重载、覆盖和隐藏的区别是什么518 面试题4:用变量a给出下面的定义518 面试题5:在c++中,下面的结构是合法的吗?如果是,其作用是什么519 面试题6:在非c++中建类 a 和 b,在哪几种情况下b能隐式转化为a519 面试题7:c++中的空类,默认产生哪些类成员函数519 面试题8:c++有哪些性质(面向对象特点)519 面试题9:子类析构时要调用父类的析构函数吗520 面试题10:什么是引用?声明和使用“引用”要注意哪些问题520 面试题11:将引用作为函数返回值类型的格式及优点有哪些520 面试题12:引用与指针的区别是什么520 面试题13:重载和重写(覆盖)的区别520 面试题14:多态的作用是什么520 面试题15:请指出const与#define相比有何优点521 面试题16:c语言中static关键字的具体作用有哪些521 面试题17:如何判断程序是由c 编译程序还是由c++编译程序编译的521 面试题18:关键字const的含义是什么521 21.2 世界500强公司的智力问答题522 面试题19:工人分金条522 面试题20:分蛋糕522 面试题21:过桥问题522 面试题22:黑白帽子523 面试题23:电梯与钻石523 面试题24:手电筒传递523 面试题25:烧绳问题524 面试题26:圆的下水道盖子524 面试题27:选建筑师524 面试题28:天平分盐524 面试题29:分不开的钱524 面试题30:小鸟追火车525 面试题31:给红色最大的机会525 面试题32:镜子中的影像525 面试题33:污染的药丸525 面试题34:称出不是标准重量的水525 面试题35:多彩的果冻526 面试题36:电子游戏机526 面试题37:监狱里的囚犯526 面试题38:灯的状态526 面试题39:时针和分针527 面试题40:3个奇数527 面试题41:屋内的灯527 面试题42:找出最重的球528 面试题43:盲人分袜子528 面试题44:烧香计时528 面试题45:平分蜂蜜528 面试题46:猜经理女儿的年龄528 面试题47:两个圆环529 面试题48:喝啤酒529 面试题49:算24点529 面试题50:聪明人529 面试题51:海盗分金币529 面试题52:到底是什么牌530 面试题53:聪明的老板娘531 面试题54:找出不同重量的球531 21.3 分析题532 面试题55:分析下面的程序段,显示最后的结果532 面试题56:分析程序最后的输出结果532 面试题57:分析最后输出的结果533 面试题58:求下面函数的返回值533 面试题59:分析最后输出的结果534 面试题60:分析最后输出的结果535 21.4 编程题536 面试题61:结果输出到文件536 面试题62:string类的具体实现537 面试题63:链表题,一个链表的节点结构538 面试题64:写一个函数并找出在一个整数数组中第二大的数540 面试题65:字符串的逆序输出541 面试题66:判断操作系统的位数541 面试题67:实现对数组的降序排序542 面试题68:斐波那契数列1、1、2、3、5等,编写程序求第10项543 |
商品评论(0条)