跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++

C++ 入门基础:历史、首个程序与命名空间详解

综述由AI生成C++ 语言从 C 语言扩展而来,引入面向对象特性。本文梳理了 C++ 发展历史及版本演进,对比了 C 与 C++ 标准库差异,重点解析了命名空间的定义、作用域解析运算符用法及三种访问方式(::、using namespace、using 声明)。同时推荐了《C++ Primer》等经典书籍,并列举了 C++ 在系统开发、游戏引擎等领域的应用场景,适合初学者建立知识框架。

灰度发布发布于 2026/3/21更新于 2026/4/273 浏览
C++ 入门基础:历史、首个程序与命名空间详解

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++ 语言的更新时间线:

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++'的梗图,这恰恰说明了其复杂性。

经典书籍

对于初学者和进阶者,有三本比较推荐的书籍:

  1. 《C++ Primer》:主要讲解语法,经典的语法书籍。前期自学可能略显晦涩,可作为预习;学了相关课程后,中后期作为语法字典非常好用。
  2. 《STL 源码剖析》:侯捷老师的经典之作。主要从底层实现角度结合 STL 源码,庖丁解牛式地剖析 STL 的实现。有助于理解别人如何用语法实现高效简洁的数据结构和算法,如何运用泛型封装。建议课程上一半以后,中后期阅读。
  3. 《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 的命名空间中。

目录

  1. C++ 发展历史
  2. 起源与诞生(1979~1983)
  3. 核心特性
  4. 发展与完善(1980~1989)
  5. 标准化和定型(1989~1998)
  6. C++ 的版本更新
  7. C++ 参考文档
  8. 常用文档
  9. 编译器生态
  10. C++ 的重要性
  11. 行业地位
  12. 应用领域
  13. 学习建议及推荐书籍
  14. 学习难度
  15. 经典书籍
  16. 第一个 C++ 程序
  17. 头文件
  18. 命名空间
  19. 基本定义
  20. 为什么需要命名空间?
  21. 命名空间的使用方式
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Android 陀螺仪开发:从传感器数据到角度积分实现
  • JavaScript 韦恩图绘制指南:venn.js 库使用详解
  • AI 驱动游戏:鸿蒙生态的机会在哪里?
  • CentOS 系统定时执行 Python 邮件发送的五种方案
  • 深度解析 OpenVR、OpenXR、SteamVR 与厂商 SDK 的核心差异
  • Android 面试核心知识点总结:Java、Framework 与性能优化
  • ERNIE-4.5-0.3B 轻量模型部署与性能实测指南
  • llama.cpp 本地部署性能调优:从启动瓶颈到推理效率优化
  • Python常用算法解析:从优雅简洁到高效实战
  • Llama-Factory 环境配置常见问题与解决方案
  • C/C++ 内存分布深度剖析:从代码区到堆栈,new/delete 与 malloc/free 详解
  • OpenAI Whisper 离线部署与本地化语音识别技术
  • 前端静态站点生成(SSG)技术解析
  • Go 语言实现 Natural Sort 自然排序算法源码
  • AI 辅助游戏开发:基于 DeepSeek 构建贪吃蛇实战
  • C++ STL 常用算法实战指南
  • 本地部署 AI 问答知识库:基于 FastGPT 的一站式指南
  • Java synchronized 全面解析:从入门使用到底层原理
  • 飞书 OpenClaw 机器人配置指南与企业级 AI 助手搭建
  • 使用 Python 搭建本地 AI 问答系统及环境避坑指南

相关免费在线工具

  • 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

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online