[C.C++] 【初阶C++】入门基础

414 0
Honkers 2026-6-4 23:37:46 来自手机 | 显示全部楼层 |阅读模式

前言

C++ 作为一门兼具面向对象特性底层高性能的经典编程语言,至今仍是工业界核心开发语言之一,深耕游戏引擎、音视频、嵌入式、服务器、操作系统等高端技术领域。很多初学者觉得 C++ 晦涩难学、学习曲线陡峭,其实只要理清发展脉络、找准学习方向、吃透基础语法,就能稳步入门。

本文基于 C++ 入门基础学习资料,系统梳理 C++ 发展历史、标准版本迭代、行业地位、就业应用、学习规划,并详解命名空间、IO 流、缺省参数、函数重载、引用、内联函数、nullptr 等入门核心知识点,适合零基础小白收藏学习。

一、C++ 整体架构与学习体量

整套 C++ 学习内容分为三大核心板块:

  1. C++ 基础语法:兼容 C 语言并扩展面向对象新语法,是入门基石;
  2. STL 标准模板库:封装好的容器、算法、迭代器,开发必备利器;
  3. 高阶数据结构:在基础数据结构之上,适配工程级复杂业务场景。

二、C++ 发展历史溯源

1. 诞生背景

1979 年,本贾尼・斯特劳斯特卢普(Bjarne Stroustrup) 在贝尔实验室开展研发工作,在模拟系统、操作系统开发场景中,发现 C 语言在表达能力、可维护性、可扩展性上存在明显短板,于是萌生了改造 C 语言的想法。

2. 正式诞生

1983 年,在 C 语言基础上新增类、封装、继承等面向对象核心特性,语言雏形落地,同年正式命名为 C++

3. 标准化历程

  1. 1989 年:启动 C++ 标准化工作,成立 ANSI/ISO 联合标准化委员会;
  2. 1994 年:发布首个标准化草案,同时惠普实验室开发的 STL 被提议纳入 C++ 标准,也因此延缓了标准化进程;
  3. 1997 年:标准最终草案通过;
  4. 1998 年:C++98 正式成为 ANSI/ISO 国际标准,也是 C++ 第一个官方正式版本。

4. 趣味小知识:C++23 网络库跳票

C++ 长期被诟病缺少官方网络库,原本网络库 Networking 计划纳入 C++23 标准。但标准化过程中因技术路线分歧(Asio 方案与 senders/receivers 方案博弈),最终网络库推迟到 C++26 版本,被网友戏称堪比宫斗剧的标准制定过程。目前开发中仍可使用 Asio 第三方网络库替代。

三、C++ 标准版本迭代大全

C++ 从 1998 年正式标准化后,保持每 3 年左右一次版本更新,每次迭代都带来大量实用新特性:

表格

版本发布时间核心亮点
C++981998首个官方标准,引入 STL 标准模板库,以模板重构标准库
C++032003漏洞修复、稳定性优化,新增 TR1 扩展库
C++112011革命性大更新:lambda 表达式、范围 for、右值引用、移动语义、智能指针、标准线程库
C++142014C++11 补丁版:泛型 lambda、返回值类型推导、二进制字面常量
C++172017新增 if constexpr、折叠表达式、结构化绑定、文件系统库、string_view
C++202020里程碑更新:协程、概念 Concepts、模块化 Modules、范围库
C++232023小版本完善:if consteval、flat_map、标准库模块化导入
C++26制定中待定,将落地延迟的网络库等特性

四、C++ 行业地位与就业应用

1. 编程语言排行榜

以 2024 年 6 月 TIOBE 榜单为例:

  • Python 稳居第一,C++ 位列第二,占有率 10.03%;
  • 远超 Java、C#、Go、Rust 等语言,常年稳居主流编程语言第一梯队;
  • TIOBE 榜单反映语言市场热门程度,侧面体现企业招聘需求体量。

2. 核心就业应用领域

C++ 主打高性能、底层可控、跨平台,核心应用场景覆盖:

  1. 大型系统开发:操作系统、编译器、数据库、浏览器内核;
  2. 音视频开发:FFmpeg、WebRTC、直播 / 点播 SDK 底层均基于 C++;
  3. PC 客户端开发:基于 Qt 开发桌面软件(如 WPS、会议客户端);
  4. 高性能服务端:游戏服务器、流媒体服务、量化高频交易系统;
  5. 游戏引擎开发:UE4、Cocos2d-x 等主流游戏引擎底层均为 C++;
  6. 嵌入式开发:智能硬件、车载系统、扫地机器人、门禁、摄像头等;
  7. 机器学习底层:AI 算法底层由 C++ 实现,Python 仅做上层封装;
  8. 测试开发 / 基础架构:底层测试工具、性能分析、编译器优化岗位。

3. 招聘岗位特点

企业 C++ 岗位普遍要求:熟练 C/C++、掌握数据结构与算法、熟悉 Linux、网络协议,有 Qt / 音视频 / 嵌入式 / 游戏引擎经验优先,薪资集中在 18-30K 校招起步,高端架构岗薪资天花板极高。

五、C++ 学习难度与学习规划

1. 学习难度认知

C++ 是难学难精的语言,学习曲线陡峭,原因在于:历史语法包袱重、兼容 C 语言、面向对象 + 泛型编程多重范式、版本迭代特性繁多。网上流传趣味梗:21 天自学精通 C++ 纯属玩笑,真正精通需要长期项目沉淀,跟着系统课程循序渐进是最高效方式。

2. 实用学习建议

  1. 必练示例代码,吃透知识点;
  2. 重点章节整理笔记 / 博客,梳理知识体系;
  3. 先掌握基础语法,再攻克 STL、数据结构,最后学习 C++11 及后续新特性。

3. 经典书籍推荐

  1. 《C++ Primer》:语法圣经,前期预习、中后期当做语法字典常备;
  2. 《STL 源码剖析》(侯捷):剖析 STL 底层实现,理解泛型与容器原理;
  3. 《Effective C++》:55 条 C++ 高效编程准则,进阶必看,工作后重读仍有新收获。

4. 官方参考文档

  1. 入门友好版:https://legacy.cplusplus.com/reference/(更新至 C++11,头文件形式易读);
  2. 中文官方文档:https://zh.cppreference.com/w/cpp;
  3. 英文最新文档:https://en.cppreference.com/w/。

六、C++ 入门核心语法详解

1. 第一个 C++ 程序

C++ 兼容 C 语言语法,文件后缀为 .cpp,Linux 使用 g++ 编译,Windows VS 自动调用 C++ 编译器。

兼容 C 语言写法

cpp

运行

  1. #include<stdio.h>
  2. int main()
  3. {
  4. printf("hello world\n");
  5. return 0;
  6. }
复制代码
C++ 标准 IO 写法

cpp

运行

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. cout << "hello world\n" << endl;
  6. return 0;
  7. }
复制代码

2. 命名空间 namespace

作用

解决全局命名冲突、名字污染问题,将变量、函数、类隔离在独立作用域中。C 语言无命名空间,极易出现同名标识符编译报错。

核心特性
  1. 只能定义在全局,支持嵌套定义;
  2. 多文件中同名 namespace 会自动合并;
  3. C++ 标准库所有接口都在 std 命名空间中。
三种使用方式
  1. 指定访问(项目推荐):csx::rand
  2. 单个成员展开:using csx::rand;
  3. 全局展开(练习可用,项目不推荐):using namespace std;
    1. namespace csx
    2. {
    3. // 命名空间中可以定义变量/函数/类型
    4. int rand = 10;
    5. int Add(int left, int right)
    6. {
    7. return left + right;
    8. }
    9. struct Node
    10. {
    11. struct Node* next;
    12. int val;
    13. };
    14. }
    15. int main()
    16. {
    17. // 这⾥默认是访问的是全局的rand函数指针
    18. printf("%p\n", rand);
    19. // 这⾥指定csx命名空间中的rand
    20. printf("%d\n", csx::rand);
    21. return 0;
    22. }
    复制代码

3. C++ 输入输出 cin/cout

  1. 头文件 为标准输入输出流库;
  2. cout 标准输出、cin 标准输入、endl 换行并刷新缓冲区;
  3. 优势:自动识别变量类型,无需像 printf/scanf 手动指定格式;
  4. 竞赛高速 IO 优化:

cpp

运行

  1. ios_base::sync_with_stdio(false);
  2. cin.tie(nullptr);
  3. cout.tie(nullptr);
复制代码

4. 缺省参数(默认参数)

定义函数时给形参设置默认值,无实参调用时使用默认值。

  1. 全缺省:所有参数都有默认值;
  2. 半缺省:部分参数有默认值,必须从右往左连续设置,不能间隔;
  3. 规则:缺省参数只能在函数声明中设置,声明和定义不能同时给;调用时必须从左往右传参。

cpp

运行

  1. // 半缺省
  2. void Func2(int a, int b = 10, int c = 20);
复制代码

5. 函数重载

同一作用域下同名函数,参数列表必须不同,满足以下任一即可:

  • 参数个数不同;
  • 参数类型不同;
  • 参数类型顺序不同。

⚠️ 注意:返回值不同不能作为重载依据,编译器无法区分调用;缺省参数和重载混用容易产生调用歧义。

  1. #include<iostream>
  2. using namespace std;
  3. // 1、参数类型不同
  4. int Add(int left, int right)
  5. {
  6. cout << "int Add(int left, int right)" << endl;
  7. return left + right;
  8. }
  9. double Add(double left, double right)
  10. {
  11. cout << "double Add(double left, double right)" << endl;
  12. return left + right;
  13. }
  14. // 2、参数个数不同
  15. void f()
  16. {
  17. cout << "f()" << endl;
  18. }
  19. void f(int a)
  20. {
  21. cout << "f(int a)" << endl;
  22. }
  23. // 3、参数类型顺序不同
  24. void f(int a, char b)
  25. {
  26. cout << "f(int a,char b)" << endl;
  27. }
  28. void f(char b, int a)
  29. {
  30. cout << "f(char b, int a)" << endl;
  31. }
  32. // 返回值不同不能作为重载条件,因为调⽤时也⽆法区分
  33. //void fxx()
  34. //{}
  35. //
  36. //int fxx()
  37. //{
  38. // return 0;
  39. //}
  40. // 下⾯两个函数构成重载
  41. // f()但是调⽤时,会报错,存在歧义,编译器不知道调⽤谁
  42. void f1()
  43. {
  44. cout << "f()" << endl;
  45. }
  46. void f1(int a = 10)
  47. {
  48. cout << "f(int a)" << endl;
  49. }
  50. int main()
  51. {
  52. Add(10, 20);
  53. Add(10.1, 20.2);
  54. f();
  55. f(10);
  56. f(10, 'a');
  57. f('a', 10);
  58. return 0;
  59. }
复制代码

6. 引用

概念

引用是已存在变量的别名,不开辟新内存,和原变量共用同一块空间,符号 & 复用取地址符。

  1. //类型& 引⽤别名 = 引⽤对象
  2. int main()
  3. {
  4. int a = 0;
  5. // 引⽤:b和c是a的别名
  6. int& b = a;
  7. int& c = a;
  8. // 也可以给别名b取别名,d相当于还是a的别名
  9. int& d = b;
  10. ++d;
  11. cout << &a << endl;
  12. cout << &b << endl;
  13. cout << &c << endl;
  14. cout << &d << endl;
  15. cout << a << endl;
  16. cout << b << endl;
  17. cout << c << endl;
  18. cout << d << endl;
  19. return 0;
  20. }
复制代码

核心特性
  1. 定义时必须初始化;
  2. 一个变量可拥有多个引用;
  3. 引用一旦绑定实体,不能更改指向
  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a = 10;
  6. // 编译报错:“ra”: 必须初始化引⽤
  7. //int& ra;
  8. int& b = a;
  9. int c = 20;
  10. // 这⾥并⾮让b引⽤c,因为C++引⽤不能改变指向,
  11. // 这⾥是⼀个赋值
  12. b = c;
  13. cout << &a << endl;
  14. cout << &b << endl;
  15. cout << &c << endl;
  16. return 0;
  17. }
复制代码

核心用途
  1. 引用传参:替代二级指针,减少拷贝、简化代码;
  2. 引用做返回值:可修改返回值对应的原变量;
  3. const 引用:保护常量对象,适配临时对象引用(临时对象具有常性,只能用 const 引用接收)。
  1. #include <iostream>
  2. int main()
  3. {
  4. //const引用本身的时候权限可以缩小,但是不能放大
  5. const int a = 10;
  6. //int& ra = a; //权限放大error
  7. const int& ra = a;
  8. int b = 20;
  9. //引用rb为只读属性
  10. const int& rb = b;
  11. b++;
  12. //rb++ //权限放大error
  13. //const可以给常量取别名
  14. const int& rc = 30;
  15. //引用临时对象
  16. const int& rd = (a+b);
  17. //隐式类型转换
  18. double d = 12.34;
  19. double& d1 = d;
  20. int i = d;//简单的赋值
  21. //int& i = d;//error
  22. const int& i1 = d;//引用临时对象,具有常性
  23. //间接空引用
  24. int* ptr = NULL;
  25. int& rp = *ptr;
  26. //rp++;//error
  27. const int& rk = a + 2;
  28. return 0;
  29. }
复制代码
引用 vs 指针

表格

特性引用指针
内存占用不开辟空间占用地址字节(32 位 4 字节 / 64 位 8 字节)
初始化必须初始化可暂不初始化
指向修改不可改绑定可随意改变指向
安全系数无空引用、野引用易出现空指针、野指针

7. 内联函数 inline

  1. 作用:编译时在调用处直接展开代码,不建立函数栈帧,提升执行效率;
  2. 定位:替代 C 语言宏函数,支持调试、类型安全;
  3. 限制:只是给编译器的建议,递归、代码冗长的函数会被忽略;
  4. 注意:内联函数不要声明和定义分离,否则会链接报错。

  1. #include<iostream>
  2. using namespace std;
  3. inline int Add(int x, int y)
  4. {
  5. int ret = x + y;
  6. ret += 1;
  7. ret += 1;
  8. ret += 1;
  9. return ret;
  10. }
  11. int main()
  12. {
  13. // 可以通过汇编观察程序是否展开
  14. // 有call Add语句就是没有展开,没有就是展开了
  15. int ret = Add(1, 2);
  16. cout << Add(1, 2) * 5 << endl;
  17. return 0;
  18. }
  19. #include<iostream>
  20. using namespace std;
  21. // 实现⼀个ADD宏函数的常⻅问题
  22. //#define ADD(int a, int b) return a + b;
  23. //#define ADD(a, b) a + b;
  24. //#define ADD(a, b) (a + b)
  25. // 正确的宏实现
  26. #define ADD(a, b) ((a)+(b))
  27. // 为什么不能加分号?
  28. // 为什么要加外⾯的括号?
  29. // 为什么要加⾥⾯的括号?
  30. int main()
  31. {
  32. 17 int ret = ADD(1, 2);
  33. 18
  34. 19 cout << ADD(1, 2) << endl;
  35. 20
  36. 21 cout << ADD(1, 2) * 5 << endl;
  37. 22
  38. 23 int x = 1, y = 2;
  39. 24 ADD(x & y, x | y); // -> (x&y+x|y)
  40. 25
  41. 26 return 0;
  42. 27 }
  43. // F.h
  44. #include <iostream>
  45. using namespace std;
  46. inline void f(int i);
  47. // F.cpp
  48. #include "F.h"
  49. void f(int i)
  50. {
  51. 1 cout << i << endl;
  52. 2 }
  53. // main.cpp
  54. #include "F.h"
  55. int main()
  56. {
  57. // 链接错误:⽆法解析的外部符号 "void __cdecl f(int)" (?f@@YAXH@Z)
  58. f(10);
  59. return 0;
  60. }
复制代码

总结:需要频繁调用并且空间比较小的函数,建议使用inline内敛函数。

8. nullptr 空指针

  1. C 语言 NULL 本质是宏,可能被定义为 0 或 (void*)0,函数重载时容易出现调用歧义;
  2. C++11 引入 nullptr 关键字,专门表示空指针;
  3. 特性:只能隐式转换为各类指针类型,不能转为整型,彻底解决 NULL 类型歧义问题。
  1. #include <iostream>
  2. using namespace std;
  3. void f(int x)
  4. {
  5. cout << "f(int x)" << endl;
  6. }
  7. void f(int* x)
  8. {
  9. cout << "f(int* ptr)" << endl;
  10. }
  11. int main()
  12. {
  13. f(0);
  14. // 本想通过f(NULL)调⽤指针版本的f(int*)函数,但是由于NULL被定义成0,调⽤了f(intx),因此与程序的初衷相悖。
  15. f(NULL);
  16. f((int*)NULL);
  17. // 编译报错:error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型
  18. // f((void*)NULL);
  19. f(nullptr);
  20. return 0;
  21. }
复制代码

七、总结

C++ 历经四十余年发展,从贝尔实验室诞生到如今 C++23/26 持续迭代,始终牢牢占据高性能底层开发核心地位。它虽然入门门槛高于 Python、Java,但就业薪资、技术天花板、职业生命周期都极具优势。

入门阶段无需急于啃高深特性,先吃透命名空间、IO 流、缺省参数、函数重载、引用、inline、nullptr 七大基础语法,再循序渐进学习面向对象、STL、数据结构,就能平稳迈入 C++ 开发大门。后续深耕游戏、音视频、嵌入式、服务端任一赛道,都能成为稀缺高端技术人才。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行