✨ 前言
很多开发者提起 C++,第一印象是 "语法庞杂、规则细碎、上手门槛高",尤其从 C 语言转来的程序员,常会被层出不穷的新标准特性搞得眼花缭乱。C++20 作为划时代版本,模块、格式化字符串、作用域枚举等重磅特性彻底革新了传统开发模式。
本文基于《C++20 高级编程(第 5 版)上册》第一章核心知识点,从零梳理现代 C++ 必备底层基础,避开 union、volatile 等冷门语法,只聚焦日常业务高频实用内容。无论你是刚入门的新手、有 C 基础的转行者,还是多年老 C++ 程序员查漏补缺,都能在这里收获清晰、完整的知识脉络,文中附带可直接运行的示例代码,帮你直观理解每一条语法规则。
Bilibili 同步视频
一、开篇:重写 HelloWorld,看懂 C++20 与老式 C++ 的本质区别
提起入门程序,所有人都写过 HelloWorld,但绝大多数人只停留在 "输出一句话" 的表层,忽略了这段代码里藏着的整套编译、输入输出、模块化逻辑。
1. C++20 模块版标准示例
cpp
// C++20 全新模块写法,替代老旧头文件
import <iostream>;
int main()
{
// 传统流输出方式
std::cout << "Hello, World!" << std::endl;
return 0;
}
2. 老编译器兼容方案(无模块支持时)
cpp
#include <iostream>
int main()
{
std::cout << "Hello, World!" << 'n';
return 0;
}
拆解代码里五大核心要素
① 两种注释,按需选用
单行注释 //:本行 // 后方所有内容失效,适合简短备注; 多行注释 /* 内容 */:适合大段说明,编译器会完全忽略注释文本,不会参与编译。
② 模块 VS 传统头文件 #include
这是 C++20 最具里程碑的升级🔥
-
import <iostream>:模块导入,无需拆分声明与实现,编译速度大幅提升,不会出现头文件重复包含、宏污染等陈年痛点; -
#include预处理指令:旧式方案,预处理器会把整个头文件文本原地拷贝进当前文件,多层嵌套时编译效率暴跌。
补充标准库头文件规范: C 语言旧头文件<stdio.h>在 C++ 中分两种版本:
-
推荐写法
<cstdio>:所有类型、函数收纳在std命名空间,类型更安全; -
淘汰写法
<stdio.h>:无命名空间隔离,极易出现名称冲突。
老式头文件防重复包含两种方案:
cpp
// 方案1:传统宏守卫,全编译器兼容
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
// 头文件内容...
#endif
// 方案2:现代简化写法,主流编译器均支持
#pragma once
③ main:程序唯一入口函数
程序运行时系统只会识别main函数,两种合法签名:
cpp
// 无命令行参数
int main() {
return 0; // 省略return时,编译器自动补return 0
}
// 带命令行参数,argc=参数总数,argv存储参数字符串
int main(int argc, char* argv[])
{
// 真实参数从argv[1]开始,argv[0]不保证是程序名
return 0;
}
返回值约定:0 代表程序正常退出,非 0 标识异常终止。
④ 输入输出流:抛弃 printf/scanf,拥抱现代 IO
很多 C 老程序员习惯printf格式化输出,但它存在致命缺陷 ------无类型安全,传参类型不匹配不会直接报错,只会运行时乱码。C++ 提供两套更优雅的输出方案。
方案 1:标准流 std::cout /std::cin
-
std::cout:标准控制台输出;std::cerr:错误信息专用输出流; -
<<输出运算符,支持链式拼接数字、字符串、布尔值等任意基础类型; -
关键性能坑点⚠️:
std::endl= 换行 + 强制刷新缓冲区。如果在循环内高频使用,会频繁 IO 刷新,严重拖慢程序执行速度。日常输出优先用'n'仅换行,按需手动刷新缓冲区。
cpp
import <iostream>
int main()
{
int num = 100;
std::cout << "数字值:" << num << 'n'; // 推荐,无强制刷新
std::cout << "强制刷新输出" << std::endl; // 谨慎使用
return 0;
}
输入读取示例:
cpp
import <iostream>
int main()
{
int value;
std::cout << "请输入数字:" << 'n';
std::cin >> value;
return 0;
}
方案 2:C++20 全新格式化 std::format
定义在<format>模块,兼顾可读性与类型安全,完美替代拼接输出:
cpp
import <iostream>;
import <format>;
int main()
{
int count = 219;
// {} 占位符自动匹配后方参数,无需记忆%占位符
std::cout << std::format("一共有{}种浪漫的表达方式n", count);
return 0;
}
二、命名空间 namespace:根治全局命名冲突的神器
开发中难免同时引入多个第三方库,很容易出现函数、变量重名,编译器分不清调用哪一份实现,命名空间就是用来隔离代码作用域的 "独立隔间"。
1. 基础定义与调用
cpp
import <iostream>;
// 自定义独立命名空间
namespace my_code
{
void foo()
{
std::cout << "调用my_code命名空间内的foo函数n";
}
}
int main()
{
// 作用域解析运算符::,精准定位空间内函数
my_code::foo();
return 0;
}
2. using 简化写法,分两种粒度
① 全局引入整个命名空间(慎用)
cpp
import <iostream>;
using namespace std;
int main()
{
// 无需std::前缀,直接使用
cout << "简化写法输出文本n";
return 0;
}
风险提醒:千万不要在头文件 / 模块接口全局写using namespace xxx,会污染所有引入该文件的代码,再次诱发名称冲突。
② 精准引入单个标识符(推荐)
只导入需要的对象,污染范围极小:
cpp
import <iostream>;
using std::cout;
int main()
{
cout << "仅导入cout,endl仍需要std::限定n" << std::endl;
return 0;
}
3. 嵌套命名空间
多层空间通过::逐层访问,适合大型项目分层管理代码。
三、字面量与变量:强类型 C++ 的基础数据单元
1. 丰富的现代字面量
C++ 支持多种进制、格式字面量,还能用单引号'做数字分隔符,超长数字可读性直接拉满:
cpp
// 进制字面量
int dec = 123; // 十进制
int hex = 0x7B; // 十六进制
int bin = 0b1111011; // 二进制
// 数字分隔符,肉眼快速区分位数
long big_num = 23'456'789;
float float_num = 0.123'456f;
// 浮点、字符、字符串字面量
float f = 3.14f;
double d = 3.14;
char ch = 'm';
char8_t u8_ch = u8'm';
2. 变量声明与统一初始化 {}(C++11 核心推荐)
C++ 允许在代码任意位置声明变量,但未初始化变量会持有内存随机脏数据,是无数隐蔽 bug 的元凶,现代编译器都会抛出警告。
三种初始化写法对比,统一初始化{}是最优解:
cpp
int a; // 未初始化,随机脏值,禁止使用
int b(7); // 老式圆括号初始化
int c = 7; // 赋值初始化
int d{7}; // ✅统一初始化,全书标准写法
// 空花括号=零初始化,自动归零
int zero_int{}; // 初始化为0
float zero_float{}; // 初始化为0.0
int* null_ptr{}; // 初始化为空指针nullptr
3. C++ 内置基础类型一览
C++ 是强类型语言,变量类型固定,无法随意隐式转换:
-
整型系列:
short/int/long/long long,区分signed有符号、unsigned无符号; -
浮点系列:
float单精度、double双精度、long double高精度浮点; -
字符类型:
char独立字符类型,不可等同于signed char/unsigned char;std::byte专门表示单字节,语义清晰;char8_t/char16_t用于 Unicode 字符; -
布尔:
bool,仅取值true/false。
4. 数值极值查询 std::numeric_limits
抛弃 C 老旧INT_MAX宏,用<limits>模板安全获取当前平台类型最大 / 最小值:
cpp
import <iostream>;
import <format>;
import <limits>
int main()
{
std::cout << std::format("int最大值:{}n", std::numeric_limits<int>::max());
std::cout << std::format("int最小值:{}n", std::numeric_limits<int>::min());
std::cout << std::format("int最低值:{}n", std::numeric_limits<int>::lowest());
std::cout << std::format("double最小正数:{}n", std::numeric_limits<double>::min());
std::cout << std::format("double最小负数:{}n", std::numeric_limits<double>::lowest());
return 0;
}
关键区分:整数min()与lowest()结果一致;浮点min()代表最小正数,lowest()代表类型能存储的最小负数。
5. 类型转换三方案,只认 static_cast
cpp
float val = 3.14f;
int v1 = (int)val; // C老式强转,可读性差,禁止新项目使用
int v2 = int(val); // 函数式转换,极少使用
int v3 = static_cast<int>(val); // ✅标准C++显式转换,语义清晰
隐式转换隐患:高精度自动转低精度(浮点→整型)会丢失小数,数值溢出时结果错乱,编译器会主动告警。
6. 浮点避坑指南
浮点计算天生存在精度缺陷:
-
数值量级差距过大、两个近似相等的浮点数相减,精度直接丢失;
-
大量十进制小数无法二进制精准存储;
-
特殊浮点值:
inf无穷大、NaN非数字,<cmath>提供std::isinf、std::isnan用于判断。
四、运算符体系:表达式优先级与书写规范
C++ 运算符分为三类:一元运算符(单操作数++/!)、二元运算符(双操作数+/*/<<)、唯一三元运算符?:。涵盖赋值、算术、自增、位运算、移位、复合赋值等全套操作。
书写优化技巧
运算符自带固定优先级(乘除 > 加减 > 位运算),复杂表达式不写括号极易踩坑,推荐用括号分层,可读性翻倍:
cpp
// 难读懂原始写法
int res = 34 + 8 * 2 + 21 / 7 * 2;
// 分层括号,逻辑一目了然
int res = 34 + (8 * 2) + ((21 / 7) * 2);
所有运算符完整清单、重载规则将在运算符重载章节详细展开。
五、枚举 enum class:类型安全的常量集合
很多新手习惯用一堆 const int 定义固定常量,但存在致命漏洞:整型可以随意赋值、不同类型常量相互比较不会报错,完全无类型约束。enum class 强类型枚举完美解决该痛点。
1. enum class 标准强枚举(新项目唯一推荐)
cpp
// 自定义棋子类型枚举
enum class PieceType : unsigned long // 手动指定底层存储类型
{
King = 1,
Queen, // 自动继承上一个值+1 = 2
Rook = 10,
Pawn // 自动+1 = 11
};
int main()
{
PieceType chess = PieceType::King;
// 错误写法:if (chess == 1) 无法隐式转int,编译报错,杜绝非法比较
return 0;
}
核心优势:
-
强类型隔离,不会隐式转为整型;
-
枚举成员隔离在自身作用域,不同枚举可重名成员;
-
支持自定义底层存储类型,灵活控制内存占用。
2. C++20 using enum 简化书写
作用域内引入全部枚举成员,无需重复书写前缀,建议缩小作用域避免冲突:
cpp
enum class PieceType
{
King, Queen
};
int main()
{
using enum PieceType;
PieceType p = King; // 直接使用,无需PieceType::
return 0;
}
也可单独导入单个枚举成员:using PieceType::King;
3. 旧式 enum(仅遗留代码可见,新项目禁用)
老式枚举成员直接暴露到外层全局作用域,极易和变量重名;无类型安全,可随意与整型、其他枚举对比,缺陷极多,新项目一律摒弃。
结语
以上全部知识点构成现代 C++20 开发的底层地基,没有复杂晦涩的模板、多线程、内存管理内容,全部是日常写代码每时每刻都会接触的基础语法。

掌握模块替代头文件、统一初始化、命名空间隔离、强类型枚举、安全 IO 输出这几大现代特性后,你会彻底摆脱老式 C/C++ 开发的各类隐性 bug,代码可读性、安全性、执行性能都会同步提升。后续进阶内容会基于本章基础,讲解类、指针、模板、标准容器 vector/optional/string 等高阶工具,打好根基再深入,学习效率事半功倍!