一个程序员的C++学习之路(整理)

作者: ajian005

链接:https://blog.csdn.net/ajian005/article/details/8003655

C++学习之路

1、why要学习C/C++/object-c?


最近想写点有用的东西,发现自己最拿手的java用起来真是笨手笨脚的。


碰到好多实现起来巨繁琐的问题,比如操作底层库,和OS framework交互,做个用户体验好点的本地图形程序等等,这些都是java的软肋。


其实,我一直对底层颇感兴趣,工作中也只能接触一下JVM,但VM毕竟是VM,始终与底层失之交臂。


Linux、Mysql、Memcached、Boost、Apache、JVM、ACE... ... 很多基础服务都是用C/C++实现的,要像了解他们原理、能看懂代码、可以修改bug、增加新功能模块

开发嵌入式、中小型项目C/C++项目,维护C/C++项目... ...


加深对系统底层的理解


2、How学习C/C++?


下文是我整理的一些C++图书列表,按顺序阅读,可涵盖入门到精通。


《The C programming language》必读

《C++ Primer》,号称是一本可以让你从C或JAVA程序员转为一个真正的C++程序员的入门参考书,必读。

《The C++ programming language》,C++之父,人称B教主著作,在看过C++ primer后,应该可以跳章选读。

《Think in c++》,网上说此书的中文版翻译质量奇差,推荐看影印版,选读。

《Effective c++》,类似 Effective java,讲的是最佳实践,程序员必读。


《More effective c++》,上书的补充。

《The C++ standard library》,会写C,不会用标准库怎么行。这就跟java程序员不会用java.util包一样,必读。

《Effective STL》,STL库的最佳实践。Effective C++作者又一力作,必读。

《The annotated STL source》,STL源码分析,这本书应该算是深入/精通类了,选读。

《Generic programming and STL》,号称C++编程里,就是跟模板,泛型打交道,那么精通泛型是势在必行。


《C++ Template》,C++模板编程,代码复用的经验之道,必读。

《Exceptional C++》,跟Effective C++类似,属于最佳实践和难题解析,书中列出了许多应用场景和实例代码供读者揣摩,选读。

《More Exceptional C++》,上书的补充。

《Exceptional C++ Style》,上上书的补充

《Inside The C++ Object Model》,有了上面这些书做铺垫,那么终于可以读此神书了。它会带你游览C++对象模型的底层实现机制。读完此书,任何C++代码看起来如同行云流水,必读。


3、优秀的C/C++开源项目(阅读代码)


OS:Linux kernel  LVS、Linux应用程序

DB:Mysql、PostgreSQL

Complier:VM、GCC

Framework:OpenSip、SipProxy、

Net:ACE(Java Mina、Netty)、TCP/IP、HTTP协议栈

Cache:Memcached、Redis、

Library:STL(java util package)、Boost、Qt(UI)、

balance:Apache、Nginx

... ...

自学者可以参考的学习顺序(Linux C++现场全科班培训的顺序)

http://www.xuanyuan-soft.cn/

 

Linux C++全科班课程,专注Linux/UNIX服务器端软件开发(后台开发),培养企业所需的专业Linux/UNIX C++软件工程师。课程涉及UNIX/Linux服务器端软件开发的各个方面:Linux/UNIX、C++、Boost、ACE、Oracle /MySQL、企业级的实战项目等。

上课方式

  • 全日制脱产学习、历时4个月(120天 * 10小时 = 1200小时)。

课程模块

  • Linux C++全科班课程由以下模块组成:

Module01 - Linux系统基础

由于本系列课程基于Linux(或UNIX),熟悉Linux操作系统是必要的前提。 该模块的课程包含以下方面的内容:


  • 常用Unix/Linux命令

    熟悉文件管理、文本处理、进程管理、网络、系统管理等各个方面大约100个常用的命令。

  • 深入了解bash
    了解Linux默认shell: bash 的语法、命令执行、I/O重定向、任务控制等。

  • 正则表达式基础
    由于UNIX/Linux中很多强大的文本处理命令如:grep、awk、sed,还有vi编辑器等工具配合正则表达式将产生强大的威力,所以熟悉正则表达式语法是十分必要的。

  • find、grep、sed、awk
    四个强大的UNIX工具,特别是sed、awk在文本处理方面的能力非常强大,在Linux下工作应该掌握这几个命令。


Linux环境高级编程


一、课程目标

本次课程涵盖Linux系统编程的几个主要方面,通过本次课程的学习,学员将具备以下能力:


了解Linux系统调用和类库的区别;

熟悉文件I/O、文件和目录、进程管理、进程间通信(IPC)、信号、时间与定时器的编程。

二、参训要求

参加本次课程的学员须具备以下能力:

  • 本次课程使用 C语言 教学,所以学员需拥有较好的C语言基础;
    能熟练使用常用的Linux命令;
    能熟练使用gcc、gdb、熟练撰写makefile;
    最好熟练使用vi、emacs等文本编辑器其中的一种。


三、课程实践环境


  • 学员自备电脑

  • 操作系统:GNU/Linux 2.6+(建议使用Redhat AS 5+或Ubuntu、Fedora)

  • 编译器:GCC v4.1+、GDB v7.0+

  • 可选IDE:Eclipse CDT


四、课程大纲


本次课程由以下几个部分构成:


1、预备知识


  • UNIX历史和标准

    UNIX; BSD & System V

    GNU project; Linux Kernel

    POSIX, SUSv3, SUSv4

  • Linux系统相关概念
    系统调用和库函数
    错误处理
    特性测试宏
    系统数据类型
    系统限制和选项 (sysconf(), pathconf())
    系统参数: /proc文件系统


2、文件I/O


  • Linux I/O系统调用与C标准库stdio的比较

  • I/O系统调用: open(), close(), read(), write()

  • 控制I/O的Buffer

  • 读写指针的定位:lseek()

  • I/O控制:ioctl()

  • 原子操作和数据竞态

  • 文件控制: fcntl()

  • 文件打开的状态标志(status flags)

  • 文件描述符

  • 复制文件描述符:dup(), dup2()


3、文件和目录


  • 文件属性

    获取文件的属性:stat()

    文件的时间戳

    文件的所有权:chown()

    文件的操作权限:chmod()

  • 目录和连接文件

    硬连接和软连接 (符号连接)

    目录

    迭代目录树

    当前工作目录(CWD)

    路径名

  • 监控文件系统的事件:inotify

    inotify API

    inotify事件

    inotify限制


4、进程控制


  • 进程属性

    进程ID(PID)和父进程ID(PPID)

    进程内存布局

    栈 (Stack)

    堆 (Heap)

    命令行参数和环境变量列表

    非局部goto (nonlocal goto):setjmp() 和 longjmp()

  • 创建和终止进程

    创建进程:fork()

    fork() 后的多进程数据竞态

    进程终止:exit(3) 和 _exit(2)

    退出处理器:atexit()

    等待子进程的退出:wait(), waitpid(), waitid()

    SIGCHLD 信号

  • 执行程序

    execve()

    exec() 系列库函数

    解释脚本

    文件描述符和 exec()

    信号和 exec()

    执行Shell命令:system()

  • 守护进程 (Daemons)

    创建守护进程的几个步骤

    使用 SIGHUP 信号使一个进程变成守护进程

    系统中守护进程的示例:syslog

  • 进程权限相关

    文件 /etc/passwd 和 /etc/group

    User ID, and Group ID

    Real, effective, and saved set IDs

    其它 group IDs

    Set-user-ID and set-group-ID programs

    获取或修改进程权限


5、信号 (Signals)


  • 信号类型和默认动作

  • 信号处理方式

  • 信号处理器

  • 发送信号

  • 信号集

  • 阻塞信号(signal mask)

  • 系统调用的中断和重新执行

  • 等待信号


6、时间和定时器(Timers) 


  • 时间相关的数据类型

  • POSIX Clock

  • 获取当前时间

  • 设置当前时间

  • C标准库 时间函数

  • Sleep

  • 定时器(Timers)

    简单的定时器:alarm()

    interval Timers

    高级定时器


7、进程间通信 (Interprocess Communication, IPC)
    

  • 传统UNIX IPC

    管道和优先队列 (Pipe and FIFO)

    SYSV 消息队列 (SYSV Message Queue)

    SYSV 信号量 (SYSV Semaphore)

    SYSV 共享内存 (SYSV Shared Memory Segments)

    内存映射文件 (Memory Mapping Files)

  • POSIX IPC

    POSIX IPC的优势

    POSIX 消息队列 (POSIX Message Queue)

    POSIX 信号量 (POSIX Semaphore)

    POSIX 共享内存 (POSIX Shared Memory Segments)


五、时间安排


课程时间:3天,以每天6小时计,具体安排如下:


Day1
1 - 预备知识
2 - 文件I/O
3 - 文件与目录


Day2
4 - 进程控制
5 - 信号
6 - 定时器


Day3
7 - 进程间通信
课程回顾与总结

六、课程资源

Module02 - Linux开发环境

不同系统平台下的开发工具、开发环境各有不同。该模块课程关注的是Linux C++/C开发所必需的一系列工具:


  • vi(vim)文本编辑器
    一个UNIX世界标准的文本编辑器,简约而强大,不论作为开发人员还是系统管理员,熟练使用vi是一项基本的、且不可或缺的技能。

  • gcc/g++ C/C++编译器
    通过具体的示例讲解使用gcc/g++编译单个、多个文件、共享库、静态库等。

  • gdb 调试器
    通过具体的示例来熟悉通过gdb来调试C/C++应用程序、修正应用程序运行期的错误。

  • make和makefile
    学习编写makefile,使用make来构建一个完整的项目。

  • CVS - 版本控制
    运用CVS来进行代码的版本控制。

  • Eclipse CDT(Linux Emacs 、Windows MS Vistual Studio )
    一个非常强大的C/C++ IDE,强大的文本编辑器、与GCC工具链的无缝结合、方便的gdb前端、集成CVS/Subversion等版本控制等,提供众多的便利,大大减轻开发者的负担。


Linux高性能网络编程


 一、课程目标

本次课程深入讲解Linux下的socket编程,并以此为基础,着重讨论如何提高网络服务端应用的性能,通过本次课程的学习,学员将收获以下方面的成果:
 

熟练使用socket系列函数进行网络编程;

深刻理解服务端应用的性能要求;

利用Linux提供的各种机制,有效地解决服务端应用的性能瓶颈。

二、参训要求


参加本次课程的学员须具备以下能力:

了解TCP/IP协议,有网络编程概念。
本次课程使用 C语言 教学,所以学员需拥有较好的C语言基础;
能熟练使用常用的Linux命令;
能熟练使用gcc、gdb、熟练撰写makefile;
最好熟练使用vi、emacs等文本编辑器其中的一种。


三、课程实践环境

学员自备电脑

操作系统:GNU/Linux 2.6+(建议使用Redhat AS 5+或Ubuntu、Fedora)
编译器:GCC v4.1+、GDB v7.0+
可选IDE:Eclipse CDT


四、课程大纲


本次课程由以下几个部分构成:


1、POSIX Thread - 多线程

  • 线程管理

    线程创建:pthread_create()

    线程终止:pthread_exit()

    线程连接和分离:join and detach

  • 线程同步机制

    互斥体:mutex

    读写锁:read-write lock

    条件变量:condition variable

  • 线程属性控制

  • mutex属性控制


2、Socket 简介


  • Socket地址数据结构:struct sockaddr,struct sockaddr_in

  • 字节序以及字节序操作:ntohl(), ntohs(), htonl(), htons()

  • Internet地址操作:inet_aton(), inet_addr(), and inet_ntoa(), inet_pton(), inet_ntop()


3、TCP Socket


  • socket():创建socket

  • bind():绑定地址

  • listen():开始侦听

  • accept():接受来自客户端的连接

  • connect():连接到服务器

  • getsockname()和getpeername():获取本地和对端地址

  • I/O 操作:read(), write()

  • 更高效的I/O 操作:readv(), writev()

  • TCP Server编程步骤

  • TCP Server v1:迭代式Echo Server

  • TCP Server v2:多进程并发式Echo Server,使用fork()和exec*()

  • TCP Server v3:多线程并发式Echo Server,使用pthread

  • TCP Client编程步骤

  • TCP Client:Echo Client


4、UDP Socket

  • recvfrom()和sendto():收发UDP数据报

  • UDP Echo Server

  • UDP Echo Client

  • 组播(Multicast)和广播(Broadcast)


5、Socket Options和 IP Options


  • 常用的Socket Options

  • 常用的IP Options

  • Socket选项和IP选项对网络应用的影响


6、I/O多路复用:构建反应式(Reactive)网络应用


  • UNIX I/O多路复用机制概要

  • 为什么I/O 多路复用对于网络应用很重要

  • I/O 多路复用与多线程(反应式模型和并发模型)

  • select / poll

  • 在TCP Server和UDP Server中使用select和poll

  • Linux特有I/O 多路复用机制:Event poll (epoll)

  • 在TCP Server和UDP Server中使用epoll


7、异步I/O:构建前摄式(Proactive)网络应用


  • 相关概念:同步I/O和异步I/O、Proactor模式

  • 异步I/O 是如何提高I/O 性能的

  • 异步I/O系列操作

  • 使用异步I/O的机制构建TCP Server


8、高性能网络编程讨论


  • 考究高性能网络编程中应该遵循的原则,讨论并发、同步、事件多路分离等机制的适用场

  • 网络应用的瓶颈何在

  • 事件多路分离 vs 一连接一线程 (Event demultiplexing vs One thread per connection)

  • 同步I/O vs 异步I/O (Synchronous I/O vs Asynchronous I/O)

  • 如何适当地使用多线程

  • 什么时候需要多个 事件多路分离线程


9、应用层协议定义与实现


  • 为什么要自定义应用层协议

  • 定义应用层协议 (以XMMEP协议为例)

  • 用C++实现自定义的协议 (以XMMEP协议为例)

  • 注:XMMEP为X-Messenger Message Exchanging Protocol


五、时间安排


课程时间:2天,以每天6小时计,具体安排如下:


Day1

1 - POSIX Thread - 多线程
2 - Socket 简介
3 - TCP Socket
4 - UDP Socket
5 - Socket Options和 IP Options


Day2

6 - I/O多路复用:构建反应式(Reactive)网络应用
7 - 异步I/O:构建前摄式(Proactive)网络应用
8 - 高性能网络编程讨论
9 - 应用层协议定义与实现


课程回顾与总结


六、课程资源

 

Linux高级I/O机制


一、课程目标


I/O常常是现代应用程序的性能瓶颈,为突破这个瓶颈,现代操作系统不断推出新的I/O机制,使高性能的I/O编程变成可能。本次课程将讨论Linux下几种高性能I/O的机制,这些功能都是基于成熟的系统调用,通过本次课程的学习,学员将掌握以下内容:

  • 传统File I/O;

  • 散/聚 I/O (Scatter/Gather I/O);

  • 阻塞式和非阻塞式I/O;

  • I/O多路复用;

  • select() ,  poll();

  • Event poll (epoll);

  • 异步I/O;


运用I/O多路复用机制和异步I/O机制提高网络应用的并发响应和性能。

二、参训要求


  • 参加本次课程的学员须具备以下能力:

  • 本次课程使用 C语言 教学,所以学员需拥有较好的C语言基础;

  • 能熟练使用常用的Linux命令;

  • 由于本次课程涉及socket编程,所以学员需有Linux下socket编程的经历;

  • 能熟练使用gcc、gdb、熟练撰写makefile;

  • 最好熟练使用vi、emacs等文本编辑器其中的一种。


三、课程实践环境


  • 学员自备电脑

  • 操作系统:GNU/Linux 2.6+(建议使用Redhat AS 5+或Ubuntu、Fedora)

  • 编译器:GCC v4.1+、GDB v7.0+

  • 可选IDE:Eclipse CDT


四、课程大纲


本次课程由以下几个部分构成:


1、预备知识


  • 理解:UNIX下一切皆文件

  • I/O的实质和I/O的步骤


2、文件I/O


  • Linux I/O系统调用与C标准库stdio的比较

  • I/O系统调用: open(), close(), read(), write()

  • 控制I/O的Buffer

  • 读写指针的定位:lseek()

  • I/O控制:ioctl()

  • 原子操作和数据竞态

  • 文件控制: fcntl()

  • 文件打开的状态标志(status flags)

  • 文件描述符

  • 复制文件描述符 (dup(), dup2())


3、散/聚I/O (Scatter/Gather I/O)

  • 什么是散/聚 I/O,为什么需要散/聚 I/O

  • 系统调用:readv(), writev()


4、I/O多路复用 (I/O Multiplexing)


  • 什么是I/O多路复用

  • I/O多路复用和多线程并发处理I/O的区别

  • select(), poll():传统的UNIX I/O多路复用机制

    select(), pselect()

    poll(), ppoll()
    Epoll:Linux系统新的I/O多路复用机制

  • Event poll介绍

  • 创建epoll实例

  • 控制epoll

  • 等待I/O事件

  • epoll的两种触发方式:水平触发(level-triggered)、边缘触发(edge-triggered)


5、异步I/O


  • 关于同步I/O:阻塞式I/O和非阻塞式I/O

  • 什么异步I/O

  • 理解同步I/O和异步I/O的差别

  • 异步I/O重要数据结构:异步I/O控制块--struct aiocb

  • 异步读、写操作:aio_read(), aio_write()

  • 检查异步操作的结果:aio_error(), aio_return()

  • 取消异步操作:aio_cancel()

  • 异步文件同步:aio_fsync()


6、使用高性能I/O机制提高网络服务端应用的性能

  • 为什么传统的I/O机制会导致服务端应用的性能瓶颈

  • 使用select()和poll()实现ACE中的Reactor模式

  • 使用epoll实现ACE中的Reactor模式

  • 在网络应用中使用异步I/O机制:模拟ACE中Proactor模式和框架\

  • 实例演示,区别传统I/O机制和高性能I/O机制对于服务端应用的重要性


五、时间安排


课程时间:2天,以每天6小时计,具体安排如下:

Day1

1 - 预备知识
2 - 文件I/O
3 - 散/聚 I/O
4 - I/O多路复用
 

Day2
5 - 异步I/O
6 - 高性能I/O机制和网络服务端应用

Module03 - C++编程语言

深入讲解C++编程语言的各个方面,即完整的C++语法讲解:


  • 语言基础
    详细介绍变量、表达式、语句、指针、数组、流程控制、函数、文件组织等。

  • 抽象机制 - 面向对象编程
    深入讲解C++的抽象机制,封装(类)、继承、多态;操作符重载、函数对象、异常处理等。

  • 模板 - 泛型编程
    详细介绍C++的模板机制,类模板、函数模板、模板特化等方面的内容。


C++面向对象编程高级培训


 一、课程目标


本次课程围绕C++面向对象编程这一课题,深入的讲解C++ OOP语言机制,以及运用面向对象技术有效架构C++应用。通过本次课程的学习,学员将具备以下能力:


  • 深刻理解C++面向对象语言机制;

  • 面向对象编程的若干法则。


二、参训要求


  • 参加本次课程的学员须具备以下能力:

  • 本次课程假定学员有编程经历,使用C/C++、Java或其它语言实际编写过代码;

  • 能熟练使用Windows或Linux下的C++编译器(如g++)、调试器(如gdb)。


三、课程实践环境


  • 学员自备电脑

  • 实践平台 (以下二者之一):

    Win32 / Visual Studio 2008 (或更新)

    Linux 2.6.18+ x86-32 / GCC 4.1.2+ / Eclipse CDT 、vi


四、课程大纲


本次课程由以下几个部分构成:


1、从C到C++

  • 引用和指针:为什么引用很重要

  • const关键字:为什么const很重要

  • 名字空间 (namespace)


2、深入C++对象

  • 关于C++对象

    内置类型的对象,如int、double对象

    自定义类型的对象

  • 对象类型的定义
    关键字class和struct
    类成员:成员函数和数据成员
    静态数据成员
    成员的访问控制
    对象的size
    关于this指针
    onst成员函数、const究竟修饰什么
    mutable数据成员
    4种特殊成员函数:constructor、destructor、copy constructor、operator=
    对象的构造、初始化列表
    对象的析构
    对象的复制
    什么情况下有必要显式定义4种特殊函数
    C++对象生命周期


3、操作符重载


  • 关于C++中操作符重载机制

  • 重要操作符重载
    算术运算:+, -, *, /, %, ++, --, ...
    关系运算:>, <, ==, !=
    下标存取:[ ]
    函数调用:(),函数对象
    类型转换、单参数构造函数与隐式转换、阻止隐式转换 -- explicit关键字

  • 友元与成员


4、面向对象基础 -- 继承

  • 基类与派生类

  • 再谈对象的构造与析构

  • 虚函数、纯虚函数

  • 派生类的内存布局、虚函数表

  • 多态、多态类型、如何体现多态

  • 虚析构、为什么虚析构很重要


5、关于继承更多的话题


  • 多继承

  • 虚继承与虚基类

  • 对基类的访问、public / protected / private继承

  • Down cast:static_cast<>和dynamic_cast<>

  • 运行期类型识别 (RTTI)


6、C++与面向对象设计

  • C++语言机制提供了完整的OOP支持

  •  超越继承

  • OOP若干法则和设计模式
    封装变化,分离不变与变化
    面向接口编程,而不是针对实现编程
    多用组合、少用继承
    努力保持交互对象间的松耦合
    类设计的开闭原则:类应该对扩展开放、对修改关闭
    依赖抽象,而不是依赖具体类
    最少知识原则
    好莱坞法则 (控制反转):不要打电话给我,我会找你的
    单一责任原则:一个类应该只有一个引起变化的原因


五、时间安排


课程时间:3天,以每天6小时计,具体安排如下:

Day1
1 - 从C到C++
2 - 深入C++对象
3 - 操作符重载

Day2
4 - 面向对象基础 -- 继承
5 - 关于继承更多的话题


Day3
6 - C++与面向对象设计


课程回顾与总结

Module04 - C++标准库(注意:C++11规范增加了一些标准库)

 完整地讲解STL各大组件:容器、算法、函数对象、容器适配器、迭代器、迭代器适配器等;另外还包括string、I/O stream;为了更好地了解STL容器的特性、排序算法,额外安排:数据结构简介和常用排序算法简介2个部分的内容。


  • 常用数据结构简介
    介绍动态数组、linked-list、binary search tree、rb-tree、hash table、stack、queue、heap等常用的数据结构。

  • STL容器详细介绍
    vector、list、deque、stack、queue、priority_queue、map、set等容器的特性和用法。

  • 常见排序算法介绍
    简要介绍各种常见排序算法的原理,及其实现。STL算法和预定义函数对象

  • 标准库提供了多达60多个算法函数,涉及排序、搜索、排列组合等多个方面,其中多数算法会使用如greater、less、binder2nd等函数对象,该单元的课程详细介绍了上述算法的使用和相关函数对象的具体作用。

  • 迭代器
    STL容器和算法高度解耦,而算法之所以能方便的作用于STL容器,维系二者的就是迭代器。
    在这个单元的课程中讲介绍C++迭代器的类别、各类迭代器适配器的用法。

  • string - 字符串
    相对于C风格的字符串处理,C++提供了更安全和方便的字符串类型 string,给class提供类众多的方法确保针对字符串处理的安全、便捷性。该单元的课程讲完整地介绍string的使用。

  • I/O stream
    C++标准库提供的一个强大的I/O流框架。本单元详细介绍标准输入/输出、文件输入/输出、字符串输入/输出流的运用,利用操控符来控制输入/输出的格式。

  •  数值
    介绍C++数值运算的算法,如valarray、4组数值算法函数、随机数等方面的内容。

 

C++泛型编程与STL高级培训:


 一、课程目标

 

C++作为一门多风格的程序设计语言,除了强大的面向对象支持外,泛型编程(模板机制)的支持更是极大程度上提高了C++的表现能力,现在模板的运用已成为C++类库、应用程序中自然且不可分割的一部分,渗透到各个角落。本次课程将深入、细致的讲解C++模板机制、STL、Boost相关类库的实现思路、手法以及其表现出的智慧,以企通过本次课程的学习,将这些经验自如地用到后续的软件开发中。这次课程关注:

  • C++模板机制

  • STL和Boost部分类库的剖析


二、参训要求


参加本次课程的学员须具备以下能力:

  • 本次课程假定学员有编程经历,使用C/C++、Java或其它语言实际编写过代码;

  • 能熟练使用Windows或Linux下的编译器(如g++)、调试器(如gdb)。


三、课程实践环境



  • 学员自备电脑

  • 实践平台 (以下二者之一):

    Win32 / Visual Studio 2008 (或更新)

    Linux 2.6.18+ x86-32 / GCC 4.1.2+ / Eclipse CDT 、vi


四、课程大纲


本次课程由以下几个部分构成:


1、C++ 模板机制

  • 关于C++模板

  • 类模板

  • 函数模板

  • 模板实例化

  • 模板参数

  • 使用模板参数指定策略

  • 特征类 (Traits classes)

  • 模板特化
    完全特化
    部分特化

  • 类模板的派生

  • Curiously Recurring Template Pattern (CRTP)、

  • 依赖名字:关键字typename和template的另一种用处


2、STL 概要


  • 什么是STL

  • STL组件

    容器

    算法

    迭代器

    函数对象

     适配器

    分配器

  • STL的能力与限制


3、STL容器
 

  • 序列容器
    Vector
     Deque
    List

  • 有序关联容器

    Multisets

    Sets

    Multimaps

    Maps

  • 无序关联容器

    Unordered Multisets

    Unordered sets (Hashsets)

    Unordered Multimaps

    Unordered maps (Hashmaps)


4、STL迭代器


  • 关于迭代器

  • 迭代器的操作

  • 迭代器类别

    Input Iterators

    Output Iterators

    Forward Iterators

    Bi-directional Iterators

    Random Access Iterators、

  • Constant Iterators

  • Reverse Iterator


5、STL算法


  • STL算法一览

  • 算法类别

  • 各类算法介绍

    非修改性算法

    修改性算法

    排序算法

    集合算法

    堆算法


6、预与定义STL数对象


  • 预定义一元函数对象

  • 预定义二元函数对象

  • 判断式(Predicates)


7、STL适配器


  • 适配器的概念

  • 容器适配器
    Stack
    Queue

  • 迭代器适配器
    Inserters

  • 函数对象适配器
    Binders
    Function Adapters
    Negaters


五、时间安排


课程时间:2天,以每天6小时计,具体安排如下:

Day1
1 - C++ 模板机制
2 - STL 概要
3 - STL容器

Day2
4 - STL迭代器
5 - STL算法
6 - 预与定义STL函数对象
7 - STL适配器

Module05 - C++ Boost

Boost是由C++标准委员会成员发起、众多C++业界高人参与设计并实现的一个涉及面广、质量高且业已广泛使用的C++标准后备库,其中 TR1已经被纳入C++0x标准库。不论从风格和内容组织上讲,都可以认为Boost项目是C++标准库的延伸。截止到boost 1.43版本,boost项目拥有大约100个用途广泛的实用库。这部分课程将介绍服务器端开发所需要的几个组件:


  • 容器与数据结构
    介绍boost.any, boost.tuple, boost.array, boost.unordered(基于hash table,即hash_map和hash_set)等组件。

  • 字符串算法和文字处理
    介绍boost.lexical_cast, boost.format, boost.string_algo等组件。

  • 正则表达式
    正则表达式语法(perl正则表达式语法)的讲解,boost.regex库的使用。

  • 智能指针
    详细介绍shared_ptr、scoped_ptr、weak_ptr等智能指针的使用。

  • 函数对象相关
    详细介绍boost.bind, boost.mem_fn, boost.function, boost.ref, boost.lambda等组件。

  • 序列化
    通过实例熟悉boost.serialization库的用法。

  • 日期与时间
    boost.date_time库的详细介绍。

  • 多线程
    作为服务器端开发必不可少的内容之一:多线程支持,boost提供了一个跨平台的线程库:boost.thread。
    本单元的课程详细介绍boost.thread。

  • 网络编程
    boost.asio库,通过对各类操作系统原生的socket API以及事件多路分离、异步I/O API的封装,构成了一个性能优秀、便于编程的网络编程框架,使复杂的网络编程任务变得简单、安全、并且高效。
    本单元的课程通过一系列的示例来展示:通过asio来构建TCP同步/异步服务器和客户端、UDP同步/异步服务器和客户端应用,从而熟悉asio的接口和编程套路。


Boost核心类库精讲


一、课程目标


Boost是由C++标准委员会成员发起、众多C++业界高人参与设计并实现的一个涉及面广、质量高且业已广泛使用的C++标准后备库,其中 TR1已经被纳入C++0x标准库。不论从风格和内容组织上讲,都可以认为Boost项目是C++标准库的延伸。本次课程撷取一系列重要的类库进行深入的讲解,涉及的类库如下:


  • 容器与数据结构;

  • 字符串算法和文字处理;

  • 内存管理相关;

  • 函数对象与高阶编程;

  • I/O

  • 一些实用类库


二、参训要求


  • 参加本次课程的学员须具备以下能力:

  • 熟练掌握C++语法,理解C++面向对象和泛型(模板)机制;


三、课程实践环境


  • 学员自备电脑

  • 实践平台 (以下二者之一):

    Win32 / Visual Studio 2008 (或更新)

    Linux 2.6.18+ x86-32 / GCC 4.1.2+ / Eclipse CDT 、vi

  • Boost 1.47.0+


注:在上课之前,学员须搭建好上述开发实践环境,如有困难,可以在开课前通过E-Mail或MSN、QQ等方式与讲师沟通。


四、课程大纲


本次课程由以下几个部分构成:


1、Boost类库概要


  • Boost的发展

  • Boost与C++0x(现在的C++2011标准)

  • Boost类库组织

  • Boost类库的适用范围


2、容器与数据结构


  • array:STL风格的定长数组

  • unordered:基于hash_table的关联容器,hash_map、hash_set、multi_hash_map、multi_hash_set

  • bimap:双向map

  • mutli_array:多维数组

  • pointer container:指针容器

  • property_tree:适合用于读/写配置文件的容器

  • 更多实用数据结构简介


3、字符串算法与文字处理


  • lexical_cast:类型转换的类模板

  • string_algos:字符串算法库,如查找、匹配、替换等操作

  • tokenizer:强大的字符串分割工具

  • regex:强大而易用的正则表达式库,支持perl、sed、awk等正则表达式语法


4、函数对象与高阶编程


  • 回顾std::bind1st()、std::bind2nd()、std::mem_fun()、std::ptr_fun()等适配器
    bind和mem_fn:C++标准库的binder增强版

  • ref:对象引用的包装器

  • Function:函数概念的泛化,函数对象的包装器,可以实现函数的延迟调用和回调

  • lambda:匿名函数对象,可以很大程度上减少显式定义函数和函数对象的需求

  • signal2:线程安全的Signal-Slot机制 (Publishers → Signals/Subscribers → Slots),即Observer模式的实现;


5、内存管理


  • smart pointers:boost智能指针,scoped_ptr、shared_ptr

  • pool:内存池


6、I/O


  • serializtion:序列化,将C++对象的序列化和反序列化,支持的格式有文本格式、xml格式、以及可移植的二进制格式

  • format:C printf格式的输入/输出格式化操作,拥有更好的类型安全和容错能

  • iostreams:C++标准库iostream的补充


7、实用类库


  • date_time:日期时间库

  • system:操作系统支持

  • filesystem:可移植的文件系统访问、操作

  • program_options:应用程序命令行参数、选项设置以及获取实用工具

  • timer:定时器


五、时间安排


课程时间:2天,以每天6小时计,具体安排如下:
 

Day1
1 - Boost类库概要
2 - 容器与数据结构
3 - 字符串算法与文字处理
4 - 函数对象与高阶编程


Day2
5 - 内存管理
6 - I/O
7 - 实用类库

Boost高性能网络编程


 一、课程目标


本次课程围绕高性能网络编程这一主题,从众多的Boost类库中挑选出Boost.Asio、Boost.Thread以及其它配套的实用库,作为主要学习的内容,通过本次课程的学习,学员将具


备以下能力:

  • 掌握智能指针、高阶函数对象、对象序列化/反序列化等类库的使用;

  • 理解现代操作系统线程模型、并发以及同步机制;

  • 熟练使用Boost.Thread线程管理和同步机制接口开发并发应用;

  • 深刻理解现代操作系统中事件多路分离和分派机制如select、epoll等、了解异步I/O以及完成事件的分派;

  • 熟练使用Boost.Asio构建稳定、高效和灵活的网络应用。


二、参训要求


参加本次课程的学员须具备以下能力:


  • 熟练掌握C++语法,理解C++面向对象和泛型(模板)机制;

  • 了解TCP/IP协议,有网络编程概念。


三、课程实践环境


  • 学员自备电脑

  • 实践平台 (以下二者之一):
    Win32 / Visual Studio 2008 (或更新)
    Linux 2.6.18+ x86-32 / GCC 4.1.2+ / Eclipse CDT 、vi

  • Boost 1.47.0+


注:在上课之前,学员须搭建好上述开发实践环境,如有困难,可以在开课前通过E-Mail或MSN、QQ等方式与讲师沟通。


四、课程大纲


本次课程由以下几个部分构成:


1、Boost.Serialization - 序列化


  • 基本类型和自定义类型的序列化;

  • 数组、指针和智能指针的序列化;

  • STL容器、std::string的序列化;

  • 识别类的版本;

  • XML格式的archive;

  • 二进制格式的archive。


2、Boost.Smart_Ptr - 智能指针


  • 回顾std::auto_ptr<>;

  • 无Copyable 语义的scoped_ptr<>;

  • shared_ptr<>;

  • weak_ptr<>;

  • enable_shared_from_this<>;


3、Boost.Bind and Boost.Function- 函数对象相关


  • 什么是函数对象?

  • 回顾std::bind1st()、std::bind2nd()、std::mem_fun()、std::ptr_fun()等适配器;

  • Boost bind();

  • Boost Function;

  • Boost ref()。


4、Boost.Signals2 - 实现回调机制


  • Boost Signal2:线程安全的Signal-Slot机制 (Publishers → Signals/Subscribers → Slots),即Observer模式的实现;

  • 简单的回调;

  • 多个Slot回调;

  • 管理Connections;

  • 一些示例。


5、一些实用类库


  • Boost.Property_Tree;

  • Boost.Format;


6、Boost.Thread - 多线程


  • 线程与进程之区别;

  • 用户线程与内核线程;

  • 不同操作系统中的线程模型;

  • 线程管理:线程创建、中断、分离/连接等;

  • 同步机制:Mutex、Lock、Condition_variable、TSS等。


7、Boost.Asio - 网络编程


Boost.Asio库,通过对各类操作系统原生的socket API以及事件多路分离、异步I/O API的封装,构成了一个性能优秀、可移植性高、便于编程的网络编程框架,使复杂的网络编程任务变得简单、安全、并且高效。


Asio相关概念:同步I/O和异步I/O、Proactor模式、Asio和线程;

 

  • Linux 下 I/O事件多路分离机制:select、epoll;

  • TCP同步I/O Server/Client编程示例;

  • UDP同步I/O Server/Client编程示例;

  • TCP异步I/O Server/Client编程示例;

  • UDP异步I/O Server/Client编程示例;

  • Timer - 定时器;

  • Asio核心接口介绍。


8、高性能网络编程讨论


  • 考究高性能网络编程中应该遵循的原则,讨论并发、同步、事件多路分离等机制的适用场合。

  • 网络应用的瓶颈在何处?

  • 事件多路分离 vs 一连接一线程 (Event demultiplexing vs One thread per connection);

  • 同步I/O vs 异步I/O (Synchronous I/O vs Asynchronous I/O);

  • 如何适当地使用多线程?

  • 什么时候需要多个 事件多路分离线程?


9、应用层协议定义与实现

  • 为什么要自定义应用层协议?

  • 定义应用层协议 (以XMMEP协议为例);

  • 用C++实现自定义的协议 (以XMMEP协议为例)。

  • 注:XMMEP为X-Messenger Message Exchanging Protocol。


五、时间安排


课程时间:3天,以每天6小时计,具体安排如下:

Day1

1 - Boost.Serialization - 序列化
2 - Boost.Smart_Ptr - 智能指针
3 - Boost.Bind and Boost.Function- 函数对象相关
4 - Boost.Signals2 - 实现回调机制
5 - 一些实用类库


Day2

6 - Boost.Thread - 多线程
7 - Boost.Asio - 网络编程1

Day3

7 - Boost.Asio - 网络编程2

8 - 高性能网络编程讨论
9 - 应用层协议定义与实现

课程回顾与总结

Module06 - C++ ACE

ACE是一个被广泛使用、设计优雅、高性能的C++通信框架(不仅仅是通信框架),其设计及实现被众多开源框架所借鉴。是构建稳定、高性能、高吞吐量、跨平台的服务器端程序的优秀框架。本模块的课程包含以下几个方面: 


  • ACE基础网络I/O相关对象
    详细介绍ACE_SOCK、ACE_SOCK_Acceptor、ACE_SOCK_Connector、ACE_INET_Addr等class的使用。

  • Reactor框架
    ACE Reactor框架简化事件驱动程序的开发,而事件驱动是很多网络化应用的基本特征,这些应用常见的事件源包括I/O事件、Posix信号或 Windows句柄激发以及定时器到期等。
    本单元介绍ACE_Event_Handler、Timer、ACE_Reactor等类的使用,并使用该框架构建一个简易的多人聊天室应用。

  • Task框架
    ACE Task框架提供了强大而可扩展的面向对象并发能力,如在基于对象的上下文(context)中派生线程,以及在执行不同线程中的对象之间传递消息和对消息进行排队。

  • Acceptor-Connector框架
    ACE Acceptor-Connector框架实现了Acceptor-Connector模式,这种模式通过解除:1,网络化应用中相互协作的对等服务的连接和初始化所需的活动、2,以及它们一旦连接和初始化后所执行的处理的耦合,增强了软件复用和可扩展性。

  • Proactor框架
    Proactor框架引入异步I/O机制,既保留了Reactor框架的事件多路分离,避免多线程的开销,同时还缓和了反应式的同步I/O的瓶颈效应。


ACE高性能网络编程


一、课程目标


本次课程针对使用ACE工具包进行高性能网络应用开发,通过本次课程的学习,学员将具备以下能力:

  • 了解ACE的架构和组件;

  • 理解现代操作系统线程模型、并发以及同步机制;

  • 熟练使用ACE线程管理和同步机制接口开发并发应用;

  • 熟练使用ACE基本的IPC SAP接口,如SOCK_Stream、SOCK_Dgram等;

  • 深刻理解现代操作系统中事件多路分离和分派机制如select、epoll等、了解异步I/O以及完成事件的分派;

  • 熟练使用ACE Reactor组件、Acceptor-Connector组件、Proactor组件等构建稳定、高效和灵活的网络应用。


二、参训要求


  • 参加本次课程的学员须具备以下能力:

    熟练掌握C++语法,理解C++面向对象和泛型(模板)机制;
    了解TCP/IP协议,有网络编程概念。


三、课程实践环境


  • 学员自备电脑

  • 实践平台 (以下二者之一):

    Win32 / Visual Studio 2008 (或更新)

    Linux 2.6.18+ x86-32 / GCC 4.1.2+ / Eclipse CDT 、vi

  • ACE 6.0.0+


四、课程大纲


本次课程由以下几个部分构成:


1、 ACE简介


  • 什么是ACE?

  • ACE的使用范围;

  • ACE工具包的架构层次;

  • ACE的组件简介。


2、ACE基础的网络I/O对象

  • 详细介绍ACE_SOCK、ACE_SOCK_Acceptor、ACE_SOCK_Connector、ACE_INET_Addr等class的使用。

  • ACE Socket基类:ACE_SOCK;

  • TCP主动连接对象:ACE_SOCK_Connector;

  • 基于TCP、面向连接的Socket:ACE_SOCK_Stream;

  • TCP被动连接对象:ACE_SOCK_Acceptor;

  • 基于UDP、无连接的Socket:ACE_SOCK_Dgram (Unicast)、ACE_SOCK_Dgram_Mcast (Multicast)、ACE_SOCK_Dgram_Bcast (Broadcast)。


3、ACE并发编程:线程与同步


  • 线程与进程之区别;

  • 用户线程与内核线程;

  • 不同操作系统中的线程模型;

  • ACE线程管理:Thread_Manager;

  • ACE线程同步:ACE_Guard、ACE_Thread_Mutex等;

  • ACE Task框架:Message_Block、Message_Queue、ACE_Task。


4、ACE Reactor框架


ACE Reactor框架简化事件驱动程序的开发,而事件驱动是很多网络化应用的基本特征,这些应用常见的事件源包括I/O事件、Posix信号或 Windows句柄激发以及定时器到期等。

  • 关于ACE Reactor框架;

  • 关于事件多路分离和分派 (Event demultiplexing and dispatching );

  • Linux下 I/O事件多路分离机制:select、epoll;

  • 事件处理器 ACE_Event_Handler:

  • I/O事件(输入、输出)、信号、超时事件、异常事件的捕获和处理;

  • ACE_Timer_Queue和ACE_Time_Value:

  • 定时器的应用;

  • ACE_Reactor:ACE的反应器为ACE Reactor框架的核心,负责事件的检测、多路分离和事件处理器的分派;

  • 例程:基于ACE Reactor框架实现一个多人聊天室。


5、ACE Acceptor-Connector框架


ACE Acceptor-Connector框架实现了Acceptor-Connector模式,这种模式通过解除:1,网络化应用中相互协作的对等服务的连接和初始化所需的活动、2,以及它们一旦连接和初始化后所执行的处理的耦合,增强了软件复用和可扩展性。


  • 集成了Message_Queue的ACE_Event_handler:ACE_Svc_Handler;

  • 接受器:ACE_Acceptor;

  • 连接器:ACE_Connector;

  • 例程:基于Acceptor-Connector框架实现一个转发服务器。


6、ACE Proactor框架


Proactor框架引入异步I/O机制,既保留了Reactor框架的事件多路分离,避免多线程的开销,同时还缓和了反应式的同步I/O的瓶颈效应。

  • 关于Proactor模式和Proactor框架;

  • 关于异步I/O;

  • 异步I/O工厂类:

  • ACE_Asynch_Read_Stream和ACE_Asynch_Write_stream;

  • ACE_Handler;

  • 前摄式Acceptor-Connector;

  • 前摄器:ACE_Proactor;

  • 例程:基于Proactor框架重新实现多人聊天室。


7、ACE实用工具


  • ACE日志实用工具:ACE_Log_Msg;

  • 读写配置文件:ACE_Configuration_Heap;

  • Singleton模式 (单例模式) 的ACE实现:ACE_Singleton类模板。


8、高性能网络编程讨论


  • 考究高性能网络编程中应该遵循的原则,讨论并发、同步、事件多路分离等机制的适用场合。

  • 网络应用的瓶颈在何处?

  • 事件多路分离 vs 一连接一线程 (Event demultiplexing vs One thread per connection);

  • 同步I/O vs 异步I/O (Synchronous I/O vs Asynchronous I/O);

  • 如何适当地使用多线程?

  • 什么时候需要多个 事件多路分离线程?


9、应用层协议定义与实现
 

  • 为什么要自定义应用层协议?

  • 定义应用层协议 (以XMMEP协议为例);

  • 用C++实现自定义的协议 (以XMMEP协议为例)。

  • 注:XMMEP为X-Messenger Message Exchanging Protocol。


五、时间安排


课程时间:3天,以每天6小时计,具体安排如下:

Day1
1 - ACE简介
2 - ACE基础的网络I/O对象
3 - ACE并发编程

Day2
 4 - ACE Reactor框架
 5 - ACE Acceptor-Connector框架
 

Day3
6 - ACE Proactor框架

7 - ACE实用工具
8 - 高性能网络编程讨论
9 - 应用层协议定义与实现

课程回顾与总结

Module07 - 数据库开发

数据库作为服务器端应用数据持久化的最重要的部件,在服务器端应用开发中占有非常重要的地位。本模块主要针对Oracle 10g和MySQL 5.1两种关系型数据库管理系统。本模块包含以下内容:


  • SQL语言
    详细介绍DML、DDL语句的语法和使用。

  • Oracle PL/SQL
    全面介绍Oracle PL/SQL语法,以及使用PL/SQL编写存储过程、函数、触发器。

  • MySQL存储过程
    编写MySQL存储过程、函数、触发器。

  • C++ OTL(OTL 是 Oracle,Odbc and DB2-CLI Template Library 的缩写,是一个C++编译中操控关系数据库的模板库,它目前几乎支持所有的当前各种主流数据库)
    OTL:Oracle、ODBC and DB2-CLI Template Library。通过OTL,可以方便、高效的与各类主流的关系型数据库如DB2、Oracle、Infomix、Sybase、MySQL等通信。例如Oracle,MS SQL Server,Sybase,Informix,MySQL,DB2,Interbase / Firebird,PostgreSQL,SQLite,SAP/DB,TimesTen,MS ACCESS等等。OTL中直接操作Oracle主要是通过Oracle提供的OCI接口进行,进行操作DB2数据库则是通过CLI接口来进行,至于MS 的数据库和其它一些数据库,则OTL只提供了ODBC来操作的方式。当然Oracle和DB2也可以由OTL间接使用ODBC的方式来进行操纵。

  • 在MS Windows and Unix 平台下,OTL目前支持的数据库版本主要有:Oracle 7 (直接使用 OCI7),Oracle 8 (直接使用 OCI8),Oracle 8i (直接使用OCI8i),Oracle 9i (直接使用OCI9i),Oracle 10g (直接使用OCI10g),DB2 (直接使用DB2 CLI),ODBC 3.x,ODBC 2.5。 ODBC:开放数据库互连(Open Database Connectivity,ODBC)

Module08 - 项目实战

课程结束后,学员需基于C++、Boost或ACE实现以下2个项目:


  • 项目1:X-Messenger Servers
    IM(即时通信)服务器群,类似于MSN、QQ等IM的服务器。可以基于Boost.asio或ACE实现。

  • 项目2:X-Messenger Client
    IM(即时通信)客户端软件,类似于MSN、QQ等IM的工具。实现Contacts管理、P2P文件传输、P2P一对一文本聊天、群聊等现代IM客户端功能,可以基于Boost.asio或ACE实现。

C++进阶 必读书籍

(一)语言入门:


《C++ Primer》
最新版本:第三版(第四版国外已上架, 国内一些网上书店也在预订中)
适合有丰富C经验,缺乏C++经验的。不过我个人一直认为此书带着过于强烈的C语言的痕迹,对于C++的学习未必是 好事。


《The C++ Programming Language》/《C++程序设计语言》
最新版本:第三版特别版
简称 TC++PL,有其他语言的丰富经验的。(也有人简称之为“TCPL”,但需与另一本《The C Programmer Language》区分开来)


《Essential C++》
《Accelerated C++》
这两本薄一些,都是不错的选择。《Accelerated C++》本人没有读过,从各方面的评价来看,完全值得推荐。

以上几本书都有相应的中文版,而且翻译的质量都不错。上面的书未必都需要读一遍,但无论如何,TC++PL是应该阅读的。


(二) 进阶A:


这个路线侧重于语言本身


《Effective C++》
最新版本:第二版(第三版国外已上架,国内一些网上书店也在预订中)
简称EC。C++程序员必读! 很多时候,我们说C++圣经不是指TC++PL,而是这一本。《The Pragmatic Programmer》一书中写到:“一旦你发现自己要参与C++项目的开发,赶快跑(不要走)到书店去购买Scott Mayer的《Effective C++》,可能还要《More Effective C++》”。


《C++ Coding Standards: 101 Rules, Guidelines, and Best Practices》/《C++ 编程规范》
个人认为此书应为C++程序员必备的案头书。几乎Effective系列和Exceptional系 列都在这里得到了总结。最新的模版、异常的业界经验都在这里的到了体现。可能的唯一缺陷就是对一个新手而言,关于“为什么这么做”的问题,解释的不够。
我 的看法是:如果你不理解其中的条款,记忆,并且照做;如果你理解其中的条款,我猜你一定会同意书中的观点。我认为这本书中的内容至少在2009年以前都不 会过时,人们将广为传诵它制定的101条戒律。
还不知道他的简称,也许“101”会成为一个候选者?


提到《Effective C++》,那么另外三本书一一浮出水面:
《More Effective C++》
《Exceptional C++》
《More Exceptional C++》。
新书《Exceptional C++ Style》也是值得一看的好书。
上 述几本书,一本也不应该放过。
个人建议上述书籍按顺序阅读。并且,在将来反复阅读这几本书。


(三)进阶B:


这 个路线侧重于程序库。


《The C++ Standard Library》/《C++标准程序库—自修教程与参考手册》
听说过STL吗?这本书会教你最基本 的,也是最重要的STL的使用。这本书,应该是必读的。

《Effective STL》
会使用STL还不够,还必须知道什么时候选择什么STL组件,这是STL使用的必读书。


《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》/《泛型编程与STL》。
这本书理论性较强,但是真的很严谨,而且并不是非常难懂。理解其 中对于Concept的解释,将是非常重要的。


《C++ STL》

这不是讲述使用程序库的,而是讲述程序库实现原理的。肠胃不好的,需要慢慢吸收。

这个路线的书,仍然是建议按顺序阅读。
进阶A、进阶B两个路线应该是可以并行的。

其他进阶参考书

提 出这些参考书,只是避免争议,也为开阔视野,笔者并不曾完全读过所有的。


《Thinking in C++》/《C++编程思想》
这本书及其中文版传言好坏都有,没有认真看过,不做评价,如果确有兴趣,不妨尝试 一下该书。


以下几本书基本上涉及的都是语言本身,大体上可以按照以下的顺序阅读。


《C++必知必会》
如果早一年,这本书将是重量级的,然而它被101和《Exceptional C++ Style》盖过一头。


《C++ Gotchas: Avoiding Common Problems in Coding and Design》/《C++程序设计陷阱》
这又是一本我未曾读过,而且广受好评的书。


《STL 源码剖析》
这本书我刚到手,就被人"借"走,以至于到现在也没有看过。看过这本书的朋友,可以给一个合适的评价。


高级:


《The Design and Evolution of C++》/《C++语方的设计和演化》
简称D&E,内 容并不艰深,Bjarne的书,仅此,就值得一读。
前段时间,互动网曾8块一本(人民币)贱卖此书,现在好像没了。


《Inside The C++ Object Model》/《深度探索C++对象模型》
C程序员读后一定会觉得C++原来并不神秘。


《C++ Template》
在阅读STL、Boost或者Loki的源代码之前,请仔细阅读本书,它可以减轻一些阅读的烦恼。这本书是讨 论C++模版的权威。


《Modern C++ Design Generic Programming and Design Patterns Applied》/《C++设计新思维——泛型编程与设计模式之应用》
简称MCD。在阅读MCD之前,建议先阅读一下《C++ Template》。


《对象揭秘:Java、Eiffel和C++》
你对C++不满吗?这本书可以部分地帮你完成抱怨的目标。也许它还可以让你不迷信C++。


最后,一份C++标准文档也是应该加以咀嚼的。 


还有一些书籍,并不能简单的归于C++,也难以在纯粹的书本学习中加以掌握。 《Design Patterns》/《设计模式》一书就归于此类。


所有上述的书籍,要么谈论C++语言本身,要么谈论STL的,要么兼而有之(当然严格讲STL也是C++语言非常重要的一部分)。偶尔,某些书中条 目也会涉及实际工程。这些书并不是C++软件开发的全部,但是他们很重要。阅读这些书,未必需要化费太多的精力,有时候是会困难,但也有时候会很快速。


最 后,编程语言并非计算机科学技术的全部,尤其对于在校的学生来说,打好基础、开阔视野都是非常重要的。


***********************

有几本书,需要说明一下

《Multi-Paradigm Design For C++ 》,这本书有些陈旧,也许在出版的年代还是很优秀的,现在,这样的书已经完全可以被推荐书目覆盖了。最重要的是,书中的某些观点今天已经不合时宜了。


《C++编程惯用法》这是一本如雷贯耳的书,可惜,这本书是1992年出版的,书中的很多内容,已经被后来的作品覆盖,而且讲述得更全面严谨。另 外,该书中对于C++的认识,在今天看来,已经过时甚至成为错误的观点。因此,只适合已经通晓C++的人参考。


《深入浅出MFC》
这是一本讲述如何使用MFC库的书。今天,MFC日渐式微,而且,MFC所使用的C++技术也是一直为人所诟病的。书确实是不错的,但是,学习C++并不 一定要学习MFC。因此,对于学习C++而言,这本书不是必须。


《The Art Of C++》
老实说,我对这本书的评价一般般。而且,“Art”名不副实,有翻译成《C++实战》,到是更确切一些。


《大规模C++编程》
这是一本重要的书,特别是对于缺乏大规模C++软件开发的人来说,尤其如此。但是,这本书的中文版翻译太差劲了。这是一本关于工程的书,因此,并不是 C++学习必备的。另外,书中的观点略嫌保守,对于最新的C++技术运用不多。


《Imperfect C++》
这是一本基础于实践结合的书,确实很优秀,而且所讲内容并不很难。但是从学习C++的角度而言,理解这本书需要许多的实践经验。推不推荐,属于两难的一本 书。


《C++ Primer》和《TC++PL》都不适合初学者
这个书目的目标是:帮助一个人在C++领域尽快地登堂入室,帮助一个人成为合格的C++程序员。
这个书目不适合下列目标:应付各类计算机考试,应付面试,快速了解C++。


《C语言参考手册(原书第5版)》  ----   作为参考书,没错的


引用China-pub上的介绍:


本书是经典C语言参考手册的最新版,在强调正确性、可移植性和可维护性的基础上,对C语言的具体细节、运行库以及C语言编程风格做了完整、准确的描述。本 书涵盖了传统C语言、C89、C95、C99等所有C语言版本的实现,同时讨论了C++与C语言兼容的部分。全书自上而下介绍了C语言的词法结构、预处理 器、声明、类型表达式、语句、函数和运行库,是所有C语言编程人员必备的参考书。 这本畅销的权威参考手册对C语言的基本概念和运行库提供了完整的描述,同时还强调了以正确性、可移植性和可维护性为根本出发点的良好的C语言编程风格,被 国外众多高校广泛采用为教材或教学参考书,本书描述了C语言各个版本的所有细节,是C语言编程人员和实现者惟一必备的参考手册。最新的第5版经过修订和更 新,融入了最新C语言标准ISO IEC 9899:1999的完整描述,包括强大的语言扩展和新的函数库。 Web站点www.CAReferenceManual.com中包 含了本书较长示例的源代码、对C语言争论点的深入讨论、最新ISO IEC语言标准修订以及其他重要C语言资源的链接。本书作为参考手册,提供了非常详细、清晰的c语言描述:


  • 标准C语言(1999):是标准C语言的新版本,支持复数类型与布尔类型、变长数组、精确浮点 数编程和具有可移植性与国际化的新的库函数

  • 标准以C语言(1989):当前大多数编程人员使用的C语言版本

  • 传统C语言:1990年之前常用的版本,还有几百万行代码正在使用

  • C++兼容C语言:可以同时在C语言与C++中使用的代码

  • 所有C语言版本的完整运行库


《C语言的科学与艺术》 --- 非常好的一本书,现在也有中文版


引用China-pub上的介绍:


本书是计算机科学的经典教材,介绍了计算机科学的基础知识和程序设计的专门知识。本书以介绍ANSI C为主线,不仅涵盖C语言的基本知识,而且介绍了软件工程技术以及如何应用良好的程序设计风格进行开发等内容。本书采用了库函数的方法,强调抽象的原则, 详细阐述了库和模块化开发。此外,本书还利用大量实例讲述解决问题的全过程,对开发过程中常见的错误也给出了解决和避免的方法。本书既可作为高等院校计算 机科学入门课程及C语言入门课程的教材,也是C语言开发人员的极佳参考书。


《C语言接口与实现:创建可重用软件的技术》


引用China-pub上的介绍:


本书概念清晰、内容新颖、实例详尽,是一本有关设计、实现和有效使用C语言库函数,掌握创建可重用C语言软件模块技术的参考指南。本书倡导基于接口的C语 言设计理念及其实现技术,深入详细地描述了24个C语言接口及其实现。


本书通过叙述如何用一种与语言无关的方法将接口的设计与实现独立开来,从而形成一种基于接口的设计途径来创建可重用的API,本书是一本针对C语言程序员 的不可多得的好书,也是值得所有希望掌握可重用软件模块技术的读者阅读的参考书籍。关于如何设计、实现和有效使用库函数的指南少之又少(如果说还有的 话)。这本力作填补了这个空白。它可以作为下一代软件的工具书.所有的C语言程序员都应该阅读。——W.Richard Stevens 


“我向每位专业C语言程序员推荐这本书。C语言程序员们忽视书中所描述的各种技术已经太长时间了。”   

——Norman Ramsey,贝尔实验室研究员


《C程序设计语言(第2版·新版)》


引用China-pub上的介绍:


本书是由C语言的设计者Brian W. Kernighan和Dennis M. Ritchie编写的一部介绍标准C语言及其程序设计方法的权威性经典著作。全面、系统地讲述了C语言的各个特性及程序设计的基本方法,包括基本概念、类 型和表达式、控制流、函数与程序结构、指针与数组、结构、输入与输出、UNIX系统接口、标准库等内容。


本书的讲述深入浅出,配合典型例证,通俗易懂,实用性强,适合作为大专院校计算机专业或非计算机专业的C语言教材,也可以作为从事计算机相关软硬件开 发的技术人员的参考书。 在计算机发展的历史上,没有哪一种程序设计语言像C语言这样应用如此广泛。


本书原著 即为C语言的设计者之一Dennis M.Ritchie和著名的计算机科学家Brian W.Kernighan合著的 一本介绍C语言的权威经典著作。我们现在见到的大量论述C语言程序设计的教材和专著均以 此书为蓝本。原著第1版中介绍的C语言成为后来广泛使用的C语言版本—— 标准C的基础。人们熟知的“hello, World”程序就是由本书首次引入的,现在,这一程序已经成为所有程序设计语言入门的第一课。原著第2版根据1987年制定的ANSIC标准做了适当的 修订.引入了最新的语言形式,并增加了新的示例,通过简洁的描述、典型的示例,作者全面、系统、准确地讲述了C语言的各 个特性以及程序设计的基本方法。对于计算机从业人员来说,本书是一本必读的程序设计语言方面的参考书。

 

C/C++学习路线图


推荐↓↓↓
C语言与C++编程
上一篇:C/C++整型变量赋值操作是原子性的吗? 下一篇:浅谈C/C++混合编程