C++ 波澜壮阔 40 年:从 C with Classes 到现代 C++ 的进化史诗

作者:雾忱星日期:2025/12/7

在这里插入图片描述
在这里插入图片描述

🔥@晨非辰Tong: 个人主页 👀专栏:《数据结构与算法入门指南》《C++学习之旅》 💪学习阶段:C语言、数据结构与算法初学者 ⏳“人理解迭代,神理解递归。”


文章目录

  • 引言
  • 一、波澜壮阔的C++“发家”历史
    • 1. 1 C with Classes (1979-1983)-起源
    • 1.2 早期发展:C++的"++"从何来(1983-1989)
    • 1.3 标准化与成熟(1990-1998)
    • 1.4 现代化浪潮(2011-至今)
  • 二、推荐C++学习参考网站、好用书籍
  • 三、梦开始的地方:C++的第一个程序
    • 3.1 “我”作先锋:namespace的意义
    • 3.2 namespace的定义
    • 3.3 命名空间的使用
  • 总结

引言

结束了C语言的学习,我们开始探索C++这门更强大的编程语言。C++在C语言的基础上发展而来,既保留了其高性能特性,又增加了面向对象和泛型编程等现代化功能。

经过数十年发展,C++通过命名空间解决了标识符冲突问题,提供了丰富的标准模板库,C++11及后续标准更带来了革命性改进。

本文将介绍C++的发展历程、推荐学习资源,并解析核心概念,帮助大家顺利开启C++学习之旅。


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

纵观C++“发家”史,可谓波澜壮阔,总的可以从以下几个关键发展节点进行概括:

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

  • “C++之父”本贾尼·斯特劳斯特卢普
  • 开创初衷: 在C语言的高效和底层控制能力基础上,通过增加面向对象和泛型编程等机制,来应对大规模软件工程的复杂性。
  • 关键特性: 主要引入了类、基本继承、内联函数和访问控制等核心概念。
    在这里插入图片描述

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

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

1.3 标准化与成熟(1990-1998)

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

1.4 现代化浪潮(2011-至今)

  • 里程碑: C++11,被视为现代C++的开端,是一次翻天覆地的更新。
  • 持续演化:
    • C++14: 对C++11的小幅度增强和缺陷修复,被叫做“完整版的C++11”;
    • C++17: 引入更多的实用特性,如结构化绑定、std::filesystemstd::variant等;
    • C++20: C++的一次飞跃,引进了模板、概念、协程等改变编程范式的强1大特性;
    • 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++学习书籍推荐:
–在这里推荐三本书籍。
在这里插入图片描述

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

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

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

1#include<stdio.h>
2int main()
3{
4	printf("Hello World\n");
5	return 0;
6}
7

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

1#include <iostream>
2using namespace std;
3
4int main()
5{
6	cout << "Hello World" << endl'\n';
7	cout << "Hello World" << endl'\n';
8	return 0;
9}
10

在这里插入图片描述

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

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

3.1 “我”作先锋:namespace的意义

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

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

1#include <stdio.h>
2#include <stdlib.h>
3
4//命名冲突
5int rand = 100;//全局变量
6int main()
7{
8	printf("%d\n", rand);
9	return 0;
10}
11

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

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

3.2 namespace的定义

  • 关键字namespace用来定义命名空间,后面跟名称,再加一对’{ }‘。’{ }'中放置命名空间的成员,空间可以定义变量、函数、类型……
1//命名空间使用
2
3#include <stdio.h>
4#include <stdlib.h>
5
6// bit是命名空间的名字,⼀般开发中是⽤项⽬名字做命名空间名。
7namespace Tong
8{
9	// 命名空间中可以定义变量/函数/类型
10	int rand = 10;
11	
12	int Add(int left, int right)
13	{
14		return left + right;
15	}
16	
17	struct Node
18	{
19		struct Node* next;
20		int val;
21	};
22}
23
24int main()
25{
26	//默认访问的是全局的rand函数指针
27	printf("%p\n", rand);
28
29	//指定bit命名空间中的rand
30	printf("%d\n", Tong::rand);
31	return 0;
32}
33

在这里插入图片描述

注意:

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

在这里插入图片描述

  • namespace只能定义在全局,可以嵌套定义。
1// 命名空间可以嵌套
2namespace Tong
3{
4    namespace Chen
5    {
6        int rand = 1;
7        int Add(int left, int right)
8        {
9            return left + right;
10        }
11    }
12    
13    namespace jia
14    {
15        int rand = 2;
16        int Add(int left, int right)
17        {
18            return (left + right) * 10;
19        }
20    }
21
22    namespace tong
23    {
24        int rand = 3;
25        int Add(int left, int right)
26        {
27            return (left + right) * 10;
28        }
29    }
30}
31
32int main()
33{
34    printf("%d\n", Tong::Chen::rand);
35    printf("%d\n", Tong::jia::rand);
36    printf("%d\n", Tong::tong::rand);
37    return 0;
38}
39

在这里插入图片描述

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

3.3 命名空间的使用

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

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

总结

1🍓 我是晨非辰Tong!若这篇技术干货帮你打通了学习中的卡点:
2👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
3❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
4 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
5💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
6🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
7技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!
8

结语:

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

在这里插入图片描述


C++ 波澜壮阔 40 年:从 C with Classes 到现代 C++ 的进化史诗》 是转载文章,点击查看原文


相关推荐


微服务项目开发环境
努力-坚持2025/11/28

一、微服务项目开发环境 搭建微服务项目开发环境: 注册中心nacos:登录然后查看注册服务 配置中心nacos:登录然后查看配置 消息队列RabbitMQ:管理界面,登陆后查看消息队列 Redis:


基于 Gradio 构建神经网络 GUI 实验平台:感知器 / BP/Hopfield/AlexNet/VGG/ResNet 一站式实现
晞微2025/12/15

引言 神经网络实验往往需要编写大量代码、调试参数、手动可视化结果,对于初学者而言门槛较高。传统的命令行式实验方式不仅操作繁琐,还难以直观展示算法效果。本文基于Gradio框架,构建了一个集经典神经网络(感知器、BP、Hopfield) 和深度学习模型(AlexNet/VGG/ResNet) 于一体的可视化 GUI 实验平台,无需编写代码,仅通过界面交互即可完成各类神经网络实验,大幅降低了实验门槛。 本平台支持以下核心实验: 感知器二分类实验BP 神经网络非线性函数拟合实验Hopfield


OSPF协议
Suchadar2025/12/23

一、OSPF 协议概述         OSPF(Open Shortest Path First,开放式最短路径优先协议)是一种链路状态路由协议,隶属于内部网关协议(IGP,Interior Gateway Protocol)范畴,核心功能是实现自治系统(AS,Autonomous System)内部路由器之间的路由信息交换,为数据传输提供最优路径指引。         分层网络架构:通过 “区域(Area)” 和 “特殊角色路由器” 划分网络层级,有效解决单区域网络中路由信息泛滥、设备资


程序员副业 | 2025年12月复盘
嘟嘟MD2026/1/2

本文首发于公众号:嘟爷创业日记 。 我已经坚持日更600天+,欢迎过来追剧~ 大家好,我是嘟嘟MD,一个10年程序员,现在离职创业,有700天了,我每个月都会写一篇总结复盘,让大家可以近距离看看一个离职程序员都在干什么,今天这篇是十二月份的总结,大概2000字,略长,有空的可以翻翻,希望对大家有一丢丢的借鉴作用! 一、月度大事 今天先把12月的复盘写了, 改天再把25年的复盘整理哈,这一年还是经历了很多事情,需要好好总结复盘 1:公众号运营+B站视频运营 公众号和B站视频运营目前还是最高


Java是当今最优雅的开发语言
richxu202510012026/1/10

我认为Java是当今最优雅的开发语言! 天然成熟的生态 !! 项目内部代码都各种积木化(模块化) (离不开spring boot的加持) 我也曾用过Delphi ,C#,Python 开发 ! 随感而发,不喜勿喷        #嵌入式 #电子信息 #编程 #软件设计与开发 #找工作 #后端开发 #单片机 #小红书#Java


【Python爬虫实战】用 Flet 把爬虫做成手机 App
MoonPointer-Byte2026/1/18

有没有想过,把你写的爬虫装进手机里? 比如: 想听歌时,后台自动爬取音乐的资源并播放; 想搜图时,后台自动爬取 高清图接口并下载; 想看人时,一键聚合搜索社交用户数据。 今天我们将实战一个MoonMusic。它的核心不是 UI,而是强大的异步数据采集层。 🔧 核心技术栈 数据采集 (Crawler): httpx (异步 HTTP 请求), BeautifulSoup4 (HTML 解析) 并发控制 (Concurrency): asyncio (协程调度) 数据可视

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客