C++ 发展历史
起源与诞生(1979~1983)
1979 年,Bjarne Stroustrup 在贝尔实验室工作期间发现,传统的 C 语言在项目开发中表达能力不足,可拓展性和可维护性存在欠缺。为此他设计并开发了 C++。
核心特性
C++ 在 C 语言的基础上引入了类、封装、继承、多态等面向对象特性,促使了 C++ 雏形的形成,并在 1983 年正式更名为 "C++"。
发展与完善(1980~1989)
随着 C++ 在学术界和工业界的普及,它被广泛用于教学研究和产品开发。在此期间,C++ 的标准库、模板等特性得到了进一步的发展和完善。
标准化和定型(1989~1998)
1989 年,ANSI 和 ISO 联合标准化委员会成立,启动标准化工作。1994 年提出首个草案,随后决定将 STL(标准模板库)纳入标准,极大地丰富了语言的能力。1998 年,ANSI/ISO C++ 正式发布,标志着现代 C++ 的成型。
总之,C++ 的发展史是一条从解决实际问题出发,通过引入面向对象范式增强代码组织能力,并通过标准化和吸纳 STL 等强大库,演变成为一个功能全面、性能卓越的编程语言的清晰路径。
C++ 的版本更新
下面是 C++ 语言的更新时间线:

1998 年 C++ 正式发布之初,委员会制定了每隔五年进行一次大更新的'五年计划'。在第一个五年计划即 C++03 版本中,主要是对 C++98 的一些漏洞和语法进行修复,并未发布太多新功能。
后来 C++ 委员会认识到五年目标太宏大,难以实现,于是改为三年计划,后续有了 C++14、17、20、23。如上图所示,C++ 特性介绍越多,此次版本更新就越大。
C++ 参考文档
常用文档
- cppreference: https://en.cppreference.com/w/cpp.html
- cplusplus: https://legacy.cplusplus.com/reference/
小贴士:cplusplus 并非官方文档,且版本仅更新至 C++11,但它是按头文件形式呈现,便于阅读;cppreference 是官方英文文档,信息全面且更新至 C++23,但阅读体验不如前者直观。
编译器生态
标准委员会制定标准,而编译器由各大公司独立开发。目前主流的编译器包括微软的 MSVC、苹果的 Clang 以及 Linux 的 GCC/G++。这些编译器决定了我们能使用哪些新特性。例如 C++23 虽然标准已出,但因编译器支持度问题,实际使用频率尚低。
C++ 的重要性
行业地位
从编程语言排行榜来看,C++、C 和 Java 始终名列前茅。这些变化反映的是行业技术趋势和人才需求方向。
应用领域
C++ 的应用领域非常广泛,包括服务器端、游戏引擎、机器学习底层、音视频处理、嵌入式软件、电信设备、金融应用、操作系统、编译器及基础架构等。
| 大型系统软件开发 | 用于开发编译器、数据库、操作系统(如 Windows、Linux)、浏览器等底层基础建设 |
| 音视频处理 | 主流技术栈以 C++ 为主,常见开源库包括 FFmpeg、WebRTC、Mediasoup 等,适用于实时音频解码、流媒体服务等场景 |
| PC 客户端开发 | 主要用于 Windows 桌面软件(如 WPS),常结合 QT 框架实现跨平台 GUI |
| 服务端开发 | 在对性能要求极高的场景中应用,如游戏服务器、高频交易系统、流媒体后台 |
| 游戏引擎开发 | 多数游戏引擎(如 Unreal Engine)使用 C++ 开发,需掌握图形学、数据结构及物理引擎 |
| 嵌入式开发 | 应用于智能手环、车载系统、工业设备等资源受限场景,分为嵌入式应用开发和驱动开发 |
| 机器学习交互 | 底层算法(如深度学习框架)多使用 C++ 实现以保证性能,Python 负责上层封装 |
| 测试开发 | 编写自动化测试脚本、性能测试工具或开发定制化测试工具 |
由此可见,C++ 在现代社会发展中起着举足轻重的作用,学好这门语言可以参与社会中绝大多数的行业生产。
学习建议及推荐书籍
学习难度
C++ 的学习难度无疑是最高的编程语言之一,其本身的语言设计和发展历史决定了难学难精的特点。网上流传着'21 天精通 C++'的梗图,这恰恰说明了其复杂性。
经典书籍
对于初学者和进阶者,有三本比较推荐的书籍:
- 《C++ Primer》:主要讲解语法,经典的语法书籍。前期自学可能略显晦涩,可作为预习;学了相关课程后,中后期作为语法字典非常好用。
- 《STL 源码剖析》:侯捷老师的经典之作。主要从底层实现角度结合 STL 源码,庖丁解牛式地剖析 STL 的实现。有助于理解别人如何用语法实现高效简洁的数据结构和算法,如何运用泛型封装。建议课程上一半以后,中后期阅读。
- 《Effective C++》:同样由侯捷老师翻译。本书有句评价:'把 C++ 程序员分为看过此书的和没看过此书的'。主要讲了 55 个条款,教你如何正确高效地使用 C++。建议中后期看一遍,工作 1-2 年后再看一遍,会有不一样的收获。
第一个 C++ 程序
我们在刚学习 C 语言时通常写这样的程序:
#include<stdio.h>
int main() {
printf("Hello World\n");
return 0;
}
那么第一个 C++ 程序是怎么写的呢?
#include<iostream>
using namespace std;
int main() {
cout << "Hello World" << endl;
return 0;
}
可以看出,这两段代码在写法上有很大差别,比如头文件和输入输出方式。下面我们来细说。
头文件
C++ 与 C 语言的第一个差别在于头文件。一般来说,C++ 的头文件不带 ".h" 后缀。在标准头文件上,C 语言是 <stdio.h>(Standard Input Output),表示标准的输入输出;而 C++ 的标准头文件则是 <iostream>(Input Output Stream),表示输入输出流。
命名空间
基本定义
定义命名空间需要使用 namespace 关键字,后面跟命名空间的名字,然后接一对 {},其中即为命名空间的成员。命名空间中可以定义变量、函数、类型等。
namespace 本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,从而避免冲突。C++ 中的域包括函数局部域、全局域、命名空间域、类域。域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑。有了域隔离,名字冲突就解决了。局部域和全局域除了影响编译查找逻辑,还会影响变量的生命周期;命名空间域和类域不影响变量生命周期。
namespace 只能定义在全局,当然还可以嵌套定义。项目工程中多文件中定义的同名 namespace 会被认为是同一个 namespace,不会冲突。C++ 标准库都放在一个叫 std(standard)的命名空间中。
为什么需要命名空间?
在 C 语言程序中,我们常碰到命名冲突,即自己命名的变量与头文件中的变量重名:
#include<stdio.h>
#include<stdlib.h>
int rand = 1; // 与 stdlib.h 中的 rand() 函数冲突
int main() {
printf("%d", rand);
return 0;
}
这段代码编译后会出现错误,说明变量 rand 与头文件中的函数发生了冲突。
为了解决这个问题,提出了使用命名空间来区分自己的变量和头文件中的变量。
命名空间的使用方式
编译查找一个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。所以要使用命名空间中定义的变量/函数,有三种方式:
1. 指定命名空间访问(项目中推荐)
这种方式每次在使用自定义限定域时,都要加上限定域名字 ::,很麻烦,但最安全。
#include<iostream>
namespace my_space {
int a = 1;
int b = 2;
}
int main() {
// 这里使用 my_space:: 这样的方式来指定查找的作用域
printf("%d\n", my_space::a);
printf("%d", my_space::b);
return 0;
}
2. 展开命名空间中全部成员(日常小练习推荐)
这种方式就是我们现在刚开始学习使用到的最常用的方式,但项目中不推荐,因为冲突风险很大。
#include<iostream>
using namespace std;
int main() {
// cout 是 std 中的函数,这里使用了 using 将 std 中的变量全部暴露于全局中
cout << "你好" << endl;
return 0;
}
这种方式的缺点是将 std 中的变量名与自己的变量放在同一作用域中,可能会导致命名冲突。
3. using 将命名空间中某个成员展开(项目中经常访问的成员推荐)
这种方式适合项目中经常访问但不存在冲突的成员。
#include<iostream>
// 这样就相当于只把 cin 和 cout 这两个函数名暴露在全局中
using std::cin;
using std::cout;
int main() {
int i = 0;
cin >> i;
cout << i;
return 0;
}
小贴士:如果同个命名空间在不同文件中一起使用,系统会自动将多文件的相同命名空间进行合并,并不会当成其他的命名空间。同时,C++ 标准库都放在一个叫做 std 的命名空间中。


