一个程序员的C++学习之路

Posted 一去丶二三里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个程序员的C++学习之路相关的知识,希望对你有一定的参考价值。


来源 | 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++通信框架(不仅仅是通信框架),其设计及实现被众多开源框架所借鉴。是构建稳定、高性能、高吞吐量、跨平台的服务器端程序的优秀框架。本模块的课程包含以下几个方面: