本书以C++ 14/17/20标准为指引,深入浅出地介绍了标准C++面向对象程序设计的相关知识,包括C++对C语言的扩展以及类、对象、友元、继承、多态、虚函数、重载、I/O流类库、文件、模板与STL、异常、多线程等内容。全书本着易于理解、实用性强的原则设计其内容和案例,并以一个规模较大的综合性程序贯穿于C++面向对象编程的全过程,引领读者理解和掌握面向对象程序设计的思想、方法和技术,以及运用C++设计自定义类进行软件开发的方法。本书取材新颖,内容全面,通俗易懂,可作为高等院校计算机、电子信息类专业及其他理工类相关专业和信息管理与信息系统等专业的教材,也可作为C++语言自学者或程序设计人员的参考用书。
杜茂康,男,重庆邮电大学教授,主要研究方向:信息系统设计与研究、数据库系统应用、商务数据挖掘。出版教材8部,英文译著3部,主持和参与了省部级以上项目6项、信息化平台建设方面的横向课题3项,获得省部级教成果奖4项。
目 录
第1章 C++与面向对象程序设计 1
1.1 面向对象程序设计概述 2
1.1.1 面向过程程序设计 2
1.1.2 面向对象程序设计 3
1.1.3 面向对象程序设计语言的特征 4
1.2 C++语言概述 6
1.2.1 C++语言简史 7
1.2.2 C++的特点 8
1.2.3 C++程序的结构 8
1.2.4 标准C++程序设计 11
1.3 数据的输入和输出 13
1.3.1 数据类型 13
1.3.2 流的概念 15
1.3.3 cin和提取运算符>> 15
1.3.4 cout和插入运算符<< 17
1.3.5 输出格式控制符 19
1.3.6 数制基数 21
1.3.7 string和字符串的输入、输出 22
1.3.8 数据输入的典型问题 24
1.4 编程实作:Visual C++ 2022编程简介 28
习题1 32
第2章 C++程序设计基础 34
2.1 C++语言对C语言的类型扩展和类型定义 35
2.2 C++程序变量设计的基本思想 36
2.3 左值、右值和断言 38
2.4 指针 39
2.4.1 指针概述 39
2.4.2 void*指针和获取数组首、尾元素位置的指针 41
2.4.3 内存的分配和释放 42
2.4.4 智能指针 44
2.5 引用 49
2.5.1 左值引用 49
2.5.2 右值引用、移动及其语义 52
2.6 const和constexpr常量 54
2.6.1 常量的定义 54
2.6.2 const、constexpr与指针 55
2.6.3 const与引用 56
2.6.4 顶层const和底层const 57
2.7 auto、decltype和decltype(auto)类型 58
2.8 C++新式for循环和数组 60
2.8.1 begin、end和基于范围的for循环 60
2.8.2 vector和valarray 61
2.9 数据类型转换 63
2.10 函数 66
2.10.1 函数原型 66
2.10.2 函数参数传递的方式 67
2.10.3 函数默认参数 71
2.10.4 函数返回值 72
2.10.5 函数重载 75
2.10.6 函数与const和constexpr 78
2.10.7 内联函数 81
2.11 匿名函数 82
2.12 命名空间 88
2.13 变量 90
2.13.1 变量定义 90
2.13.2 作用域 90
2.13.3 变量的类型和生命期 92
2.13.4 变量初始化 93
2.13.5 局部变量与函数返回地址 97
2.14 预处理器 97
2.15 文件的输入和输出 100
2.15.1 文件操作的基本流程 100
2.15.2 输入流、输出流的泛化思想 101
2.16 编程实作:C++程序设计初步 102
习题2 104
第3章 类和对象 110
3.1 类的抽象和封装 111
3.1.1 抽象 111
3.1.2 封装 113
3.2 结构 115
3.2.1 C++对结构的扩展 116
3.2.2 类 118
3.3 数据成员 119
3.4 成员函数 120
3.4.1 成员函数定义方式和内联函数 120
3.4.2 常量成员函数 122
3.4.3 成员函数重载和默认参数值 123
3.5 对象 123
3.6 构造函数设计 126
3.6.1 编译器默认添加成员函数 127
3.6.2 构造函数和类内初始值 128
3.6.3 默认构造函数 130
3.6.4 重载构造函数 133
3.6.5 构造函数与初始化列表 135
3.6.6 委托构造函数 137
3.7 析构函数 138
3.7.1 析构函数的设计思想和定义 138
3.7.2 弱指针与析构函数 140
3.8 赋值运算符函数、复制构造函数和移动函数设计 142
3.8.1 赋值运算符函数 142
3.8.2 复制构造函数 146
3.8.3 移动函数 149
3.9 静态成员 154
3.10 this指针 157
3.11 对象应用 161
3.11.1 成员访问操作符 161
3.11.2 对象数组与对象指针 164
3.11.3 向函数传递对象 165
3.11.4 对象成员 166
3.12 类的作用域和对象的生命期 169
3.13 友元 172
3.14 编程实作:类的接口与实现的分离 173
3.14.1 头文件 174
3.14.2 源文件 175
3.14.3 对类的应用 176
习题3 180
第4章 继承 185
4.1 继承的概念 186
4.2 protected与继承 187
4.3 继承方式 188
4.4 派生类对基类的扩展 191
4.4.1 成员函数的重定义和名字隐藏 191
4.4.2 基类成员访问 193
4.4.3 using和隐藏函数重现 194
4.4.4 派生类修改基类成员的访问权限 195
4.4.5 友元与继承 196
4.4.6 静态成员与继承 197
4.4.7 继承和类作用域 198
4.5 构造函数和析构函数 199
4.5.1 派生类构造函数的建立规则 200
4.5.2 派生类构造函数和析构函数的调用次序 205
4.5.3 派生类的赋值、复制和移动操作 207
4.6 基类与派生类对象的关系 208
4.6.1 派生类对象对基类对象的赋值和初始化 209
4.6.2 派生类对象与基类对象的类型转换 211
4.7 多继承 213
4.7.1 多继承的概念和应用 213
4.7.2 多继承方式下的成员二义性 215
4.7.3 多继承的构造函数和析构函数 216
4.8 虚拟继承 217
4.9 继承和组合 222
4.10 编程实作:继承编程应用 226
习题4 231
第5章 多态 237
5.1 多态概述 238
5.1.1 多态的概念 238
5.1.2 多态的意义 240
5.1.3 多态和绑定 241
5.2 虚函数 241
5.2.1 虚函数的意义 241
5.2.2 override和final 244
5.2.3 虚函数的特性 246
5.3 虚析构函数 251
5.4 纯虚函数和抽象类 252
5.4.1 纯虚函数和抽象类 252
5.4.2 抽象类的应用 254
5.5 运行时类型信息 262
5.5.1 dynamic_cast 263
5.5.2 typeid 266
5.6 编程实作:多态编程应用 268
习题5 269
第6章 运算符重载 274
6.1 运算符重载基础 275
6.2 重载二元运算符 277
6.2.1 类与二元运算符重载 277
6.2.2 非类成员方式重载二元运算符的特殊用途 280
6.3 重载一元运算符 282
6.3.1 作为成员函数重载 282
6.3.2 作为友元函数重载 284
6.4 特殊运算符重载 285
6.4.1 重载++和-- 285
6.4.2 下标[ ]和赋值运算符= 287
6.4.3 类型转换运算符 289
6.4.4 仿函数 292
6.5 输入/输出运算符重载 293
6.6 编程实作:运算符重载编程应用 295
习题6 300
第7章 模板和STL 303
7.1 模板的概念 304
7.2 函数模板和模板函数 305
7.2.1 函数模板的定义 305
7.2.2 函数模板的实例化 306
7.2.3 模板参数 307
7.3 类模板 311
7.3.1 类模板的概念 311
7.3.2 类模板的定义 311
7.3.3 类模板实例化 313
7.3.4 类模板的应用 315
7.4 模板设计中的独特问题 316
7.4.1 模板参数类型推导 316
7.4.2 内联与常量函数模板 320
7.4.3 默认模板实参 320
7.4.4 仿函数应用 321
7.4.5 成员模板 322
7.4.6 可变参数函数模板 323
7.4.7 元编程的基本概念 324
7.4.8 模板重载、特化、非模板函数及调用次序 327
7.5 STL程序设计 330
7.5.1 函数对象 330
7.5.2 顺序容器 331
7.5.3 迭代器 339
7.5.4 pair和tuple容器 342
7.5.5 关联式容器 345
7.5.6 算法 352
7.5.7 STL容器和算法处理自定义类的常见问题 355
7.6 编程实作:模板和STL编程应用 357
习题7 358
第8章 异常 362
8.1 异常处理概述 363
8.2 C++异常处理基础 364
8.2.1 异常处理的结构 364
8.2.2 异常捕获 365
8.3 异常和函数 367
8.4 异常处理的特殊情况 368
8.5 异常和类 373
8.5.1 构造函数和异常 373
8.5.2 异常类 375
8.5.3 派生异常类的处理 378
习题8 381
第9章 线程 383
9.1 程序、进程和线程 384
9.2 线程等待和线程ID获取 388
9.2.1 线程等待 388
9.2.2 获取线程ID 390
9.3 类和线程 391
9.4 线程同步 393
9.4.1 互斥锁 393
9.4.2 读写锁 396
9.4.3 信号量 397
9.4.4 条件变量 402
习题9 405
第10章 流和文件 410
10.1 C++ I/O流及流类库 411
10.2 I/O流类的成员函数 412
10.2.1 类istream的常用成员函数 412
10.2.2 类ostream的常用成员函数 414
10.2.3 数据输入、输出的格式控制 415
10.3 文件操作 418
10.3.1 文件和流 418
10.3.2 二进制文件 420
10.3.3 随机文件 423
习题10 425
参考文献 428