跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 四十年演进史:从 C with Classes 到现代标准

C++ 语言发展历经四十余年演变,从早期的 C with Classes 到如今的现代化标准,其核心在于解决大规模软件工程的复杂性。本文梳理了 C++ 的关键发展阶段,推荐了权威学习资源与书籍,并深入解析了命名空间机制以规避标识符冲突。通过对比 C 语言基础程序与现代 C++ 实践,帮助开发者理解语言特性及最佳实践。

锁机制发布于 2026/3/16更新于 2026/8/2138 浏览
C++ 四十年演进史:从 C with Classes 到现代标准

C++ 四十年演进史与核心概念解析

结束了 C 语言的学习,我们开始探索 C++ 这门更强大的编程语言。C++ 在 C 语言的基础上发展而来,既保留了其高性能特性,又增加了面向对象和泛型编程等现代化功能。经过数十年发展,C++ 通过命名空间解决了标识符冲突问题,提供了丰富的标准模板库,C++11 及后续标准更带来了革命性改进。

一、波澜壮阔的 C++'发家'历史

纵观 C++ 的发展历程,大致可以概括为以下几个关键节点:

1. C with Classes (1979-1983) - 起源

**'C++之父'**是本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)。

开创初衷: 在 C 语言的高效和底层控制能力基础上,通过增加面向对象和泛型编程等机制,来应对大规模软件工程的复杂性。

关键特性: 主要引入了类、基本继承、内联函数和访问控制等核心概念。

C++ 早期发展示意图

2. 早期发展:C++的"++"从何来 (1983-1989)

  • 正式命名: 1983 年,语言正式更名为 C++。"++"是 C 语言的自增运算符,象征着对 C 语言的超越。
  • 语言丰富特性: 增加了虚函数、函数和运算符重载、引用、常量等,奠定了其特色功能。
  • 走向世界: 1985 年,本贾尼发布经典著作《The C++ Programming Language》,同年首个商业 C++ 编译器 C Front 发布,推动了语言的普及。

3. 标准化与成熟 (1990-1998)

  • 标准启动: 为避免不同编译器可能导致的分裂,ANSI 和 ISO 于 1990 年联合开始了 C++ 的标准化进程。
  • STL 的融合: 标准模板库 (STL) 被纳入标准草案。STL 提供了泛型的容器、迭代器和算法,极大提升了代码的复用性和表现力。
  • 首个国际标准: C++98 于 1998 年正式发布。它统一了语言规范,确立了模板、异常处理等现代特性,这标志着 C++ 成为一个成熟、稳定的工业级语言。

4. 现代化浪潮(2011-至今)

  • 里程碑: C++11,被视为现代 C++ 的开端,是一次翻天覆地的更新。
  • 持续演化:
    • C++14:对 C++11 的小幅度增强和缺陷修复,被称为'完整版的 C++11';
    • C++17:引入更多的实用特性,如结构化绑定、std::filesystem、std::variant 等;
    • C++20:C++ 的一次飞跃,引进了模板、概念、协程等改变编程范式的强大特性;
    • C++23:对 C++20 的进一步完善,增加了更多的标准库支持和语言特性。

C++ 版本演进图

C++ 生态图

二、推荐学习资源与书籍

在学习过程中,选择合适的参考资料至关重要。

参考网站

  1. https://legacy.cplusplus.com/reference/ 注意,这个网站不是 C++ 的官方网站,已停止更新,其中 C++ 标准只更新到了 C++11。但网站内容的呈现是以头文件的形式,比较容易使用。
  2. https://zh.cppreference.com/w/cpp
  3. https://en.cppreference.com/w/ 第 2、3 两个网站是当前 C++ 官方维护的网站。一个是中文版、一个是英文版,相较于第一个网站内容更专业。(遗憾的是,中文版网站目前失效,建议优先使用英文版)

书籍推荐

  • 《C++ Primer》 这是一本系统讲解 C++ 语法的权威著作,被誉为 C++ 程序员的语法宝典。适合编程的各个阶段阅读:学习初期可作为入门引导,虽然大部分内容抽象,能看懂多少算多少;中后期则是作为语法字典,随时查阅不懂的语法,提升编程能力。
  • 《STL 源码剖析》 由侯捷老师编著的经典之作,深入剖析了 C++ 的标准模板库和源码实现,从底层角度揭示 STL 的设计精髓。阅读这本书能让人体会到工程级别的代码封装与设计思想。建议在有了一定的 C++ 基础后再阅读,以拓宽视野。
  • 《Effective C++》 同样由侯捷老师翻译的经典之作。在 C++ 社区有这样一句话:'C++程序员分为读过这本书的和没有读过的'。书中提炼了 55 条高效使用 C++ 的使用准则,建议在学习的中后期再翻阅。工作 1~2 年后重新阅读,结合工作经验,会有额外的收获。

书籍封面展示

三、梦开始的地方:C++ 的第一个程序

最开始学习 C 语言,我们是从 hello world 启程:

#include <stdio.h>
int main() {
    printf("Hello World\n");
    return 0;
}

那么也来试着使用 C++ 输出 hello world 吧。

#include <iostream>
using namespace std;
int main() {
    cout << "Hello World" << endl;
    cout << "Hello World" << endl;
    return 0;
}

C++ Hello World 运行结果

虽然 C++ 兼容 C 语言的大部分语法,C 语言形式的 hello world 仍然可以运行,但是 C++ 作为 C 语言的升级版本,有着自己的一套输入输出体系。

在上面代码中,像 std、cout、namespace 现在肯定是不懂的,但别急,很快学到。

1. '我'作先锋:namespace 的意义

要知道,C/C++ 中存在着大量的变量、函数,当然还有后面要学习的类,这些都是需要进行命名的并且作用在全局作用域中,势必会有一些名称冲突。 关键字 namespace 就是来解决这个问题的:利用命名空间对标识符的名称进行本地化,很好地避免了命名冲突。

提一嘴:命名冲突在 C 语言的程序中非常普遍

#include <stdio.h>
#include <stdlib.h>
// 命名冲突
int rand = 100; // 全局变量
int main() {
    printf("%d\n", rand);
    return 0;
}

报错: 错误 C2365 'rand' : 重定义;以前的定义是'函数'。

这是因为我们包含了头文件 <stdlib.h>,头文件有函数 rand,全局变量 rand 命名就冲突了。

2. namespace 的定义

  • 关键字 namespace 用来定义命名空间,后面跟名称,再加一对 { }。{ } 中放置命名空间的成员,空间可以定义变量、函数、类型……
// 命名空间使用
#include <stdio.h>
#include <stdlib.h>
// ns 是命名空间的名字,一般开发中是用项目名字做命名空间名。
namespace ns {
    // 命名空间中可以定义变量/函数/类型
    int rand = 10;
    int Add(int left, int right) {
        return left + right;
    }
    struct Node {
        struct Node* next;
        int val;
    };
}
int main() {
    // 默认访问的是全局的 rand 函数指针
    printf("%p\n", rand);
    // 指定 ns 命名空间中的 rand
    printf("%d\n", ns::rand);
    return 0;
}

Namespace 示例运行

注意:

  1. 命名空间的 { } 后面没有分号 ;。
  2. 编译器默认查找规则是先局部再全局。
  3. 访问命名空间成员用到了域作用限制符 ::,用来指定作用域。
  • namespace 实质上是定义出一个域,并且与全局作用域各自独立。不同的域可以定义相同的变量,那么命名空间的 rand 就不冲突了。
  • 在 C++,有函数局部域、全局域、命名空间域、类域。作用域确定了编译器如何查找一个标识符(变量、函数、类型)的声明、出处。 经过域的隔离,命名冲突就解决了。局部域、全局域会影响编译查找逻辑,还会影响变量的生命周期,但是命名空间域、类域不会。
namespace ns {
    int a = 1;
}
int a = 2;
int main() {
    int a = 3;
    // 访问局部域
    printf("%d\n", a);
    // 访问全局域,域作用限制符左侧空白表示:全局域
    printf("%d\n", ::a);
    // 访问命名空间域
    printf("%d\n", ns::a);
    return 0;
}

作用域示例

  • namespace 只能定义在全局,可以嵌套定义。
// 命名空间可以嵌套
namespace ns {
    namespace inner {
        int rand = 1;
        int Add(int left, int right) {
            return left + right;
        }
    }
    namespace outer {
        int rand = 2;
        int Add(int left, int right) {
            return (left + right) * 10;
        }
    }
}
int main() {
    printf("%d\n", ns::inner::rand);
    printf("%d\n", ns::outer::rand);
    return 0;
}

嵌套命名空间

  • 工程中多个文件定义的同名 namespace,会默认为一个(合并)。
  • C++ 标准库都放在 std (standard) 的命名空间中。

3. 命名空间的使用

编译查找一个变量的声明/定义,默认在局部或者全局找,不会到命名空间域中查找。所以有 3 种使用命名空间中的成员的方法:

  1. 指定命名空间访问,在大型项目中推荐,虽然有点麻烦。
  2. using 将命名空间的某个成员暴露在全局中,在项目中经常要访问并且不冲突的成员推荐。
  3. 将空间中全部成员暴露在全局中,但是风险大,日常的练习可以,项目中不推荐。
  • 指定命名空间访问:
#include <stdio.h>
namespace my_ns {
    int a = 0;
    int b = 1;
}
// 指定命名空间
using my_ns::a;
int main() {
    int b = 2;
    printf("%d\n", my_ns::b);
    return 0;
}
  • 命名空间中指定成员展开:
#include <stdio.h>
namespace my_ns {
    int a = 0;
    int b = 1;
}
// 命名空间中指定成员展开
using my_ns::a;
int main() {
    printf("%d\n", a);
    return 0;
}
  • 展开全部成员:
#include <stdio.h>
namespace my_ns {
    int a = 0;
    int b = 1;
}
// 展开全部
using namespace my_ns;
int main() {
    printf("%d\n", a);
    printf("%d\n", b);
    return 0;
}

总结

C++ 并非要取代 C 语言,而是在其基础上进行全面升级和扩展。它完整保留了 C 语言的高效性和底层控制能力,同时引入了面向对象编程、泛型编程等现代化特性,让我们能够应对更复杂的软件开发需求。 C++ 的学习是一个循序渐进的过程。建议从基础语法开始,逐步深入理解面向对象思想,最后掌握模板和现代 C++ 特性。多动手实践,结合实际项目,才能真正领略 C++ 的强大威力。

目录

  1. C++ 四十年演进史与核心概念解析
  2. 一、波澜壮阔的 C++“发家”历史
  3. 1. C with Classes (1979-1983) - 起源
  4. 2. 早期发展:C++的"++"从何来 (1983-1989)
  5. 3. 标准化与成熟 (1990-1998)
  6. 4. 现代化浪潮(2011-至今)
  7. 二、推荐学习资源与书籍
  8. 参考网站
  9. 书籍推荐
  10. 三、梦开始的地方:C++ 的第一个程序
  11. 1. “我”作先锋:namespace 的意义
  12. 2. namespace 的定义
  13. 3. 命名空间的使用
  14. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • OpenClaw 安装与飞书机器人接入教程
  • Ubuntu 24.04.3 ROS2 一键安装指南
  • HTML input 类型全解析与实战避坑指南
  • 普通程序员学习大模型(LLM)的学习路线与知识体系
  • HarmonyOS6 RcIcon 组件属性系统与样式定制策略
  • SSM 框架文件上传功能实战:从前端到后端完整流程
  • Codex Multi-Agent 与 Claude Agent Teams 技术对比与选型指南
  • Python 学习后如何找工作及就业方向分析
  • OpenClaw 框架 30+ 真实场景实战解析
  • 2026 年十大 AI 编程工具推荐
  • Git 与 GitHub 入门指南:版本控制与协作实战
  • 前端程序员转行大模型开发指南
  • Go Web 开发必备理论知识
  • 模拟算法详解及 LeetCode 典型题目实践
  • 商汤开源 SenseNova-MARS:多模态搜索推理模型解析
  • Meta AI 战略转向:从 Llama 到 Avocado 的内部阵痛与变革
  • AI 前端技术解析:从概念到实战进阶路线
  • AI 绘画描述关键词逻辑优化:从语义理解到生成效率提升
  • 位运算算法入门详解:常见位运算专题
  • macOS 12.7.6 部署 Ollama 与 Dify 避坑指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online