课程概况
Linux操作系统开源的特性使得其获得越来越重要的地位,而Linux系统编程也向C++程序设计者提出了更高的要求。本课程由C/C++语言的共性与特性出发,在深入学习程序设计语言的基础上,进一步强调程序设计语言的适用性,并与Linux系统编程紧密结合,通过大力培养学习者的抽象思维能力和计算思维能力,将学习者对语言作为工具的基本认知转化为动手实践能力,完成从具象到抽象再到具象的思维能力转变。课程内容主要涵盖C++程序设计基本概念、数据组织与算法设计、程序组织、面向对象程序设计方法、泛型编程与模板库以及进程、线程、内存管理、设备驱动程序、网络等Linux系统编程核心主题。
课程大纲
第一讲 C/C++基本语法元素
1.1 提纲
1.2 程序设计的基本概念
1.3 简单C/C++程序介绍
1.4 程序设计的基本流程
1.5 基本语法元素
1.6 程序设计风格
1.7 编程实践
第二讲 程序控制结构
2.1 提纲
2.2 结构化程序设计基础
2.3 布尔数据
2.4 分支结构
2.5 break语句
2.6 循环结构
2.7 编程实践
第三讲 函数
3.1 提纲
3.2 函数声明、调用与定义
3.3 函数调用栈框架
3.4 编程实践
第四讲 算法
4.1 提纲
4.2 算法概念与特征
4.3 算法描述
4.4 算法设计与实现
4.5 递归算法(一)
4.6 递归算法(二)
4.7 容错与计算复杂度
4.8 编程实践
第五讲 程序组织与开发方法
5.1 提纲
5.2 库与接口
5.3 随机数库(一)
5.4 随机数库(二)
5.5 作用域与生存期
5.6 典型软件开发流程(一)
5.7 典型软件开发流程(二)
5.8 编程实践
第六讲 复合数据类型
6.1 提纲
6.2 字符
6.3 数组(一)
6.4 数组(二)
6.5 结构体
6.6 编程实践
第七讲 指针与引用
7.1 提纲
7.2 指针基本概念
7.3 指针与函数
7.4 指针与复合数据类型(一)
7.5 指针与复合数据类型(二)
7.6 字符串
7.7 动态存储管理(一)
7.8 动态存储管理(二)
7.9 引用
7.10 编程实践
第八讲 链表与程序抽象
8.1 提纲
8.2 数据抽象(一)
8.3 程序抽象(二)
8.4 链表(一)
8.5 链表(二)
8.6 链表(三)
8.7 链表(四)
8.8 函数指针(一)
8.9 函数指针(二)
8.10 抽象链表(一)
8.11 抽象链表(二)
8.12 编程实践
第九讲 类与对象
9.1 提纲
9.2 程序抽象与面向对象
9.3 类类型
9.4 对象(一)
9.5 对象(二)
9.6 类与对象的成员(一)
9.7 类与对象的成员(二)
9.8 类与对象的成员(三)
9.9 继承(一)
9.10 继承(二)
9.11 继承(三)
9.12 多态(一)
9.13 多态(二)
9.14 编程实践
第十讲 操作符重载
10.1 提纲
10.2 四则运算符重载(一)
10.3 四则运算符重载(二)
10.4 关系与下标操作符重载
10.5 赋值操作符重载(一)
10.6 赋值操作符重载(二)
10.7 赋值操作符重载(三)
10.8 赋值操作符重载(四)
10.9 赋值操作符重载(五)
10.10 流操作符重载(一)
10.11 流操作符重载(二)
10.12 流操作符重载(三)
10.13 操作符重载总结
10.14 编程实践
第十一讲 泛型编程
11.1 提纲
11.2 泛型编程概览
11.3 异常处理机制(一)
11.4 异常处理机制(二)
11.5 运行期型式信息(一)
11.6 运行期型式信息(二)
11.7 模板与型式参数化
11.8 题外话:术语翻译
11.9 泛型编程实践(一)
11.10 泛型编程实践(二)
11.11 泛型编程实践(三)
11.12 泛型编程实践(四)
11.13 泛型编程实践(五)
11.14 泛型编程实践(六)
11.15 泛型编程实践(七)
11.16 泛型编程实践(八)
11.17 泛型编程实践(九)
11.18 泛型编程实践(十)
11.19 编程实践
第十二讲 Linux系统编程基础
12.1 提纲
12.2 程序执行环境(一)
12.3 程序执行环境(二)
12.4 程序执行环境(三)
12.5 程序执行环境(四)
12.6 输入输出(一)
12.7 输入输出(二)
12.8 文件系统
12.9 设备
12.10 库(一)
12.11 库(二)
12.12 makefile文件(一)
12.13 makefile文件(二)
12.14 makefile文件(三)
12.15 编程实践
第十三讲 进程编程
13.01 提纲
13.02 进程基本概念
13.03 信号
13.04 进程管理(一)
13.05 进程管理(二)
13.06 进程管理(三)
13.07 进程间通信(一)
13.08 进程间通信(二)
13.09 进程间通信(三)
13.10 进程间通信(四)
13.11 进程池
13.12 编程实践
第十四讲 线程编程
14.1 提纲
14.2 线程基本概念
14.3 线程管理(一)
14.4 线程管理(二)
14.5 线程管理(三)
14.6 线程管理(四)
14.7 线程同步机制(一)
14.8 线程同步机制(二)
14.9 C++11线程库(一)
14.10 C++11线程库(二)
14.11 C++11线程库(三)
14.12 C++11线程库(四)
14.13 C++11线程库(五)
14.14 编程实践
第十五讲 网络编程
15.1 提纲
15.2 Internet网络协议
15.3 套接字(一)
15.4 套接字(二)
15.5 编程实践
预备知识
本课程为基础课,无先修要求。若已初步了解并有使用Linux操作系统经验,则课程体验更佳。
常见问题
本课程使用什么教材?
无指定教材。大体上市面上任何一本C/C++的教材都可以参考。至于Linux系统编程部分,以Mark Mitchell、Jeffrey Oldham和Alex Samuel所著《Advanced Linux Programming》和Robert Love所著《Linux System Prorgramming (2/e)》为佳。不过学习者要注意的是,这两本书的主要编程语言为C而不是C++。
本课程仅仅使用C++语言吗?
不。除了C++语言,本课程还使用了汉语和英语。坦率地说,我们可以在业界看到很多有关C和C++语言的争论,尤其是在系统编程领域。正像我在回答上一问题所指出的,很多Linux系统编程方面的书籍使用的是C语言。实际上,编程语言的选择压根就不是问题的重点,不管你使用的编程语言是C还是C++,计算思维能力和抽象思维能力的培养是一贯的,它们之间最大的差别仅仅在于实现的手段而已。相信我,即便仅仅使用C,你也可以构造复杂的抽象代码;而即便使用C++,如果你的思维习惯仍然停留在“见山就是山”的具象阶段,代码质量一样会惨不忍睹。
我没有一点C/C++语言的基础,怎么办?
再次强调,本课程并不需要你有这方面的基础,你会在课程中学到你所需要使用到的知识。当然因为课时的原因,并不是所有C/C++知识都会在本课程上讲授,对于那些被我们省略的知识点,你可以自学,也可以假装它们压根就不存在。
我没有一点Linux操作系统基础,怎么办?
凉拌。自学!同样地,本课程并不需要你有Linux操作系统的基础,但是你至少要会使用它。按照我的经验,哪怕在学习本课程的同时学习使用Linux操作系统,时间上也是来得及的,所以不用特别担心。辛苦一点而已,相比计算思维和抽象思维能力的培养,学习使用Linux操作系统压根就不算个事儿。