大家好,这里是彩妙呀~

当你熟练掌握C语言后,你就可以进入C++的世界啦。而C++并非一门全新的语言,他是C语言的自然演进与扩展,它在保留C语言高效、灵活特性的基础上,引入了**面向对象编程(OOP)**的核心思想。所以,C++不仅仅是一门"C语言+面向对象"的语言,它更是一种编程思维的转变------从过程式编程转向面向对象的设计理念。
在C++中,你将接触到诸多C语言中没有的特性:
- 命名空间解决命名冲突问题
- 引用提供更安全的别名机制
- 输入输出流库简化I/O操作
- 函数重载提升代码可读性
- 类、继承、多态等面向对象的核心概念
这些特性使C++成为开发大型、复杂、可维护软件系统的理想选择。
本教程将帮助你从C语言的熟练使用者,顺利过渡到C++的高效开发者。彩妙不会从最基础的语法开始,而是聚焦于C++特有的、能够显著提升编程效率和代码质量的特性,让你能够快速上手并体会到C++带来的编程体验提升。
目录
目录
[1. 大型系统软件开发](#1. 大型系统软件开发)
[2. 音视频处理](#2. 音视频处理)
[3. PC客户端开发](#3. PC客户端开发)
[4. 高性能服务端开发](#4. 高性能服务端开发)
[5. 游戏引擎开发](#5. 游戏引擎开发)
[6. 嵌入式系统开发](#6. 嵌入式系统开发)
[7. 机器学习底层开发](#7. 机器学习底层开发)
[8. 测试与工具开发](#8. 测试与工具开发)
C++发展历史
C++起源于1979年,由Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)在贝尔实验室开发。面对软件开发任务(如模拟和操作系统),他认识到C语言在表达能力、可维护性和可扩展性方面的不足。

1983年,Stroustrup在C语言基础上添加了面向对象特性,包括类、封装和继承等核心概念,并正式命名为C++。该语言为面向对象编程奠定了基础。
随后几年,C++在学术界和工业界应用迅速扩展。大学和研究机构将其作为教学工具,企业也开始在产品开发中采用。同时,C++的标准库和模板等特性得到完善。
1989年,C++标准化工作启动,由ANSI和ISO联合委员会负责。1994年,委员会提出首个标准化草案,并决定纳入STL(Standard Template Library)。STL由惠普实验室开发,扩展了C++的功能,但延缓了标准化进程。
1997年11月14日,委员会通过最终草案。1998年,C++的ANSI/ISO标准正式发布。
C++的版本更新

| 版本 | 年份 | 主要内容 | 
|---|---|---|
| C++98 | 1998 | 作为C++的首个标准化版本,引入了标准模板库(STL),支持容器(如 vector、list)、算法(如sort、find)和迭代器,显著提升了语言的功能性和易用性。 | 
| C++03 | 2003 | 主要对C++98进行错误修正和功能微调,并引入技术报告1(TR1),提供 shared_ptr、unordered_map等实用组件,为后续版本奠定基础。 | 
| C++11 | 2011 | 重大更新版本,新增lambda表达式、自动类型推导( auto)、范围for循环、移动语义、右值引用、标准线程库(<thread>)和智能指针(如unique_ptr、shared_ptr),大幅提升现代化水平和编程效率。 | 
| C++14 | 2014 | 对C++11的增强与优化,引入泛型lambda、返回类型后置、二进制字面量、 std::make_unique等特性,进一步完善核心功能。 | 
| C++17 | 2017 | 新增 if和switch初始化器、结构化绑定、std::variant、std::optional、std::any及文件系统库(<filesystem>),强化语言表达能力和标准库功能。 | 
| C++20 | 2020 | 里程碑式更新,引入协程、概念( concepts)、模块、范围、三路比较等特性,为现代化编程提供强大支持。 | 
| C++23 | 2023 | 进一步完善现有特性,新增 if consteval、std::expected、std::flat_map等,提升编译时表达能力和标准库实用性。 | 
| C++26 | 2026 | 目前处于制定阶段,特性尚未确定,预计在先前版本基础上引入新语言特性和标准库功能,持续优化现代化水平和编程体验。 | 
C++参考⽂档:
早期C++参考网站,内容较陈旧
当前主流选择:
社区维护的最新、最全面的C++参考文档(英文)
社区维护的最新、最全面的C++参考文档 (中文)
C++的重要性
编程语⾔排⾏榜
TIOBE排行榜通过统计互联网上有经验的程序员、课程和第三方厂商的数量,并利用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube和Baidu(百度)等平台的数据,来生成编程语言的排名。该排行榜仅反映编程语言的受欢迎程度,不能用于评价一门语言的优劣,也不能说明其编写的代码总量。


C++在⼯作领域中的应⽤
C++凭借其高性能、内存控制能力和跨平台特性,已成为众多关键领域的核心开发语言,广泛应用于以下场景:
1. 大型系统软件开发
C++是构建底层系统软件的首选语言,包括编译器(如GCC、Clang)、数据库系统(如MySQL、PostgreSQL)、操作系统(如Linux内核部分模块)和浏览器引擎(如Blink、Gecko)等。
2. 音视频处理
C++是音视频处理领域的绝对主力,主流开源库如FFmpeg、WebRTC、Mediasoup和ijkplayer均基于C++开发。音视频编解码、流媒体传输和实时通信等核心技术均依赖C++的高性能特性。
3. PC客户端开发
在Windows桌面应用开发中,C++与QT框架的组合是主流技术栈。QT作为跨平台GUI框架,使开发者能够高效构建高性能桌面应用,如WPS Office等商业软件。
4. 高性能服务端开发
在对性能要求严苛的场景中,C++成为服务端开发的首选,尤其适用于:
- 
游戏后端服务(高并发、低延迟) 
- 
流媒体服务(如视频点播、直播平台) 
- 
量化高频交易系统(毫秒级响应需求) 
5. 游戏引擎开发
几乎所有主流游戏引擎均采用C++开发,如Unreal Engine 4/5、Cocos2d-x和Godot。游戏开发需要扎实的C++基础、数据结构知识,并深入理解图形学和引擎架构。
6. 嵌入式系统开发
C++在嵌入式领域应用广泛,涵盖:
- 
嵌入式应用开发(智能手环、智能音箱、车载系统) 
- 
嵌入式驱动开发(硬件抽象层、设备驱动) 
- 
机器人控制(扫地机器人、无人机等) 
7. 机器学习底层开发
机器学习框架的底层实现(如TensorFlow、PyTorch的核心计算库)主要采用C++编写,上层接口则通过Python封装。若需参与框架开发或性能优化,C++是必备技能。
8. 测试与工具开发
在软件质量保障领域,C++常用于开发高性能测试工具:
- 
自动化测试框架(如基于C++的测试工具) 
- 
性能测试工具(高吞吐量测试场景) 
- 
测试基础设施开发(如测试执行平台) 
C++学习建议和书籍推荐
C++学习难度
C++的学习曲线确实较为陡峭,但通过科学的方法和持续的实践,完全可以掌握这门强大的语言。

学习建议
- 
循序渐进,打好基础:不要急于学习模板元编程等高级特性,前3个月应专注于基础语法、指针和内存管理。C++的"指针"和"内存管理"是两大核心难点,建议通过小项目反复练习。 
- 
实践优先:每天至少编写50行代码,坚持6个月以上。不要只看不写,通过实践才能真正理解概念。从简单的命令行工具开始,逐步过渡到更复杂的项目。 
- 
善用现代C++特性:从C++11开始,C++提供了大量现代化特性(如智能指针、lambda表达式),这些能显著提高代码质量和开发效率。不要被"传统C++"的写法束缚。 
- 
善用调试工具:掌握GDB或IDE内置调试器,学会通过调试器观察程序执行状态,这是排查复杂问题的关键技能。 
- 
加入学习社区:加入C++学习社群(如Stack Overflow的C++标签、GitHub上的C++开源项目),与他人交流能解决很多困惑,也能获得持续学习的动力。 
经典书籍推荐
- 
《C++ Primer》(第5版) - 基础语法和面向对象编程的最佳入门书籍,内容全面,适合系统学习。 
- 
《Effective C++》(第3版) - "C++圣经"之一,提供50个具体建议,帮助你写出更高效、更安全的C++代码。 
- 
《C++标准库》(第2版) - 深入理解STL的实用指南,对使用标准库非常有帮助。 
- 
《C++11/14/17/20新特性》 - 专注于现代C++特性的实用指南,帮助你快速掌握C++的现代化写法。 
- 
《C++并发编程实战》 - 专门讲解多线程和并发编程的权威书籍,对高性能服务端开发至关重要。 
避坑指南
- 避免过早接触高级特性:在掌握基础之前,不要深入模板元编程或复杂的内存管理技巧。
- 不要依赖IDE自动补全:理解语言本质比依赖IDE更关键。
- 重视代码风格:C++的代码风格对可读性和维护性影响巨大,建议遵循Google C++风格指南。
- 选择合适的工具链:统一使用VS2022或CLion等现代IDE,避免环境配置带来的额外困扰。
我们第一个C++程序
C++兼容C语⾔绝⼤多数的语法,所以C语⾔实现的hello world依旧可以运⾏,C++中需要把定义⽂件 代码后缀改为.cpp,vs编译器看到是.cpp就会调⽤C++编译器编译,linux下要⽤g++编译,不再是gcc。
            
            
              cpp
              
              
            
          
          //c语言写法
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
//c++写法
#include<iostream>
using namespace std;
int main()
{
cout << "hello world\n" << endl;
return 0;
}这里我们可以发现:库与输出函数不一样,并且还有 using namespace std 这条新语句。下面,我会带着大家来了解一下学习c++时,对C语言的变化以及新玩意吧。
命名空间:namespace
为什么需要命名空间?
在C语言中,我们通常会把所有的标识符(变量,函数,类型等等)都定义于全局命名空间中,这样就会有一个问题:命名冲突。
            
            
              cpp
              
              
            
          
          #include <iostream>
#include <第一个库>
#include <第二个库>
//  两个库均有fun1()
int main()
{
    fun1();    //在此处调用就会有歧义,
return 0;
}
在c++中,为了避免这个问题,就引入命名空间这个机制:为标识符提供了一个逻辑上的"容器" ,就像给不同的代码**"打包",**避免了名称冲突。
命名空间的基本语法
命名空间,本质上是一个域。而定义一个命名空间,实际上就是定义一个域名:namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量。学习过C语言的都知道,函数,变量都有自己的生命周期,在域中被使用,随着域的消亡而消亡。所以,在C++中域有函数局部域,全局域,命名空间域,类域。
域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
            
            
              cpp
              
              
            
          
          #include <iostream>
// 定义一个名为MyLib的命名空间
namespace MyLib {
    int value = 10;
    
    // 定义一个类
    class MyClass {
    public:
        void print() { 
            std::cout << "Hello from MyLib!" << std::endl; 
        }
    };
    
    // 定义一个函数
    void greet() {
        std::cout << "Welcome to MyLib!" << std::endl;
    }
}
int main()
{
//访问命名空间中的成员
// 1. 完全限定名(推荐在头文件中使用)
MyLib::value = 20;
MyLib::MyClass obj;
obj.print();
// 2. using声明(引入单个标识符)
using MyLib::MyClass;
MyClass obj2;
obj2.print();
// 3. using指令(引入整个命名空间,推荐在.cpp文件中使用)
using namespace MyLib;
greet(); // 不需要MyLib::前缀
}
命名空间的核心用途
避免名称冲突(核心价值)
就如我上述所说:命名空间最主要解决的是相同标识符所引发的问题,使用命名空间就很有效避免这一问题
            
            
              cpp
              
              
            
          
          // 同名函数,但属于不同命名空间
// 文件1:my_math.h
namespace Math {
    int add(int a, int b) { return a + b; }
}
// 文件2:my_string.h
namespace String {
    int add(int a, int b) { return a + b; } 
}
// 文件3:main.cpp
#include "my_math.h"
#include "my_string.h"
int main() {
    Math::add(10, 20);    // 10+20=30
    String::add(5, 15);   // 5+15=20
    return 0;
}组织代码(提高可读性)
将相关功能的代码组织在一起,使代码结构更清晰:
            
            
              cpp
              
              
            
          
          namespace Graphics {
    namespace Rendering {
        void renderScene();
    }
    
    namespace Input {
        void handleInput();
    }
    
    namespace Geometry {
        class Vector3D { /* ... */ };
    }
}在未来工作中,通常情况下会分配组员与组长,那么可能会出现一种需求不同实现的情况。在这里,命名空间就起到非常大的作用:在特定的情况来使用特定的解决方案,即使会出现标识符相同,也可以通过命名空间来让人与编译器识别开。
而是域展开,则需要使用using 来使域扩充为全局域(C++标准库的所有内容都定义在std命名空间中,而为了方便,则使用using namespace std来使这个域展开)。
命名空间的高级特性
嵌套命名空间
            
            
              cpp
              
              
            
          
          namespace Company {
    namespace Product {
        namespace Version {
            const int VERSION = 1;
        }
    }
}
// 使用
int version = Company::Product::Version::VERSION;
//C++17简化了嵌套命名空间的语法
namespace Company::Product::Version {
    const int VERSION = 1;
}未命名命名空间
            
            
              cpp
              
              
            
          
          namespace {
    int secret_value = 42; // 仅在当前文件可见
}
// 在其他文件中无法访问secret_value合并同名命名空间
C++允许在多个文件中声明同一个命名空间,编译器会自动合并它们:
            
            
              cpp
              
              
            
          
          // file1.h
namespace App {
    void init();
}
// file2.h
namespace App {
    void shutdown();
}
// file3.cpp
#include "file1.h"
#include "file2.h"
void App::init() { /* ... */ }
void App::shutdown() { /* ... */ }C++输⼊&输出
在写我们第一个程序时,会注意到:头文件变成了<iostream>,那么,这个库就是C++的标准输入输出流:Input Output Stream 的缩写。他定义了标准的输入与输出对象。
std::cin就是istream类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输
⼊流。 对标C语言的scanf()函数,但与scanf()相比,cin使用更加丝滑:
            
            
              cpp
              
              
            
          
            int i;
  float fl;
  char* str;
  scanf("%d %f %s ", &i ,&fl, &str);
  std::cin >> i >> fl >> str;std::cout就是ostream类的对象,它主要⾯向窄字符的标准输出流。对标C语言的printf()函数,但与printf()相比,cout使用更加顺畅:
            
            
              cpp
              
              
            
          
            int i;
  float fl;
  char* str;
  scanf("%d %f %s ", &i ,&fl, &str);
  std::cin >> i >> fl >> str;
prinft("%d %f %s",i ,fl ,str);
cout << i << fl <<str;std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。
注意:
- C++的输⼊输出可以⾃动识别变量类型
- 使用cin来写入数据时,要使用 >> ,cout要使用 << :<< 是流插⼊运算符,>> 是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)
- cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使⽤⽅式去⽤他们。而在⼀般⽇常练习中我们可以using namespace std,实际项⽬开发中不建议using namespace std。
- 这⾥我们没有包含<stdio.h>,也可以使⽤printf和scanf,在包含<iostream>间接包含了。vs系列编译器是这样的,其他编译器可能会报错。
 IO流涉及类和对象,运算符重载、继承等很多面向对象的知识,这些知识我们还没有讲解,所以这
 ⾥我们只能简单认识⼀下C++ IO流的⽤法,后⾯彩妙会有专⻔的⼀篇博客来细节IO流库。
本篇博客在这里就结束啦,后续彩妙会继续给大家讲解有关C++一些新特性,以及其最重要的使用:面向对象,stl模版的使用以及封装继承多态等。关注彩妙,获取更多优质好文吧~
