C++ 简介
C++ 是一种通用编程语言,由 Bjarne Stroustrup 在 C 语言基础上改进而来,旨在引入面向对象编程范式。C++ 的主要特点如下:
- 简洁:程序可拆分为逻辑单元与模块,配套丰富的标准库和多样的数据类型。
- 机器无关:只要有合适的编译器,同一份 C++ 代码可在任意机器上运行。
- 底层访问:可直接操作系统资源,非常适合系统级编程与高效代码编写。
- 执行速度快:几乎没有额外运行时开销,是运行最快的高级语言之一。
- 面向对象:相对 C 的最大优势,支持封装、继承、多态,使程序更易维护、扩展,适合构建大型应用。
C++ 程序结构
基本结构规定了代码的书写顺序,否则会导致编译错误。一个标准 C++ 程序通常包含: 
C++ 的历史
C++ 是一种面向对象的中间层编程语言,由 Bjarne Stroustrup 于 1979 年在贝尔实验室开发。最初命名为 "C with Classes",1983 年更名为 C++。它在 C 语言的基础上扩展了类、继承和类型检查等特性,以支持面向对象编程。随着时间推移,C++ 经历了多个标准版本的演进,包括 C++98(c++03)、C++11、C++17、C++20,以及最新的 C++23,不断引入现代特性以提升性能与安全性。如今,C++ 仍广泛应用于系统软件、游戏引擎、竞赛编程和高性能应用程序中。
C++ 变量类型

C++ 变量声明 与 初始化
变量的内存管理
当我们"创建"或"声明 "一个变量时,编译器会替它划出一块固定大小的内存,但这块内存的初始内容通常是"垃圾值"(随机数据)。
初始化 (使用赋值号 = 或其它方式)才会把有意义的数据写进这块空间。
变量名本质上就是这块内存的"人话入口",我们通过名字去读写对应地址里的数据。
c++
int num; //声明 或 创建
num = 3; //初始化变量
float fnum = 6.57; //一步到位,声明+初始化
C++ 关键字的分类
下面给出一张"一体化速查表"------把 C++98/03 → C++23 出现的所有保留关键字,按「功能类别→出现标准」两级分组,并在同一格内给出「作用一句话」。
(空白格表示该关键字在该标准尚未出现;● 表示首次出现;○ 表示已存在。)
| 功能类别 | 关键字 | C++98 | C++11 | C++14 | C++17 | C++20 | C++23 | |||
|---|---|---|---|---|---|---|---|---|---|---|
| 基础类型 | void |
无类型/无返回值 | ○ | ○ | ○ | ○ | ○ | |||
bool |
布尔类型,取 true/false |
○ | ○ | ○ | ○ | ○ | ||||
char |
单字节字符 | ○ | ○ | ○ | ○ | ○ | ||||
wchar_t |
宽字符 | ○ | ○ | ○ | ○ | ○ | ||||
char16_t |
UTF-16 字符 | ● | ○ | ○ | ○ | ○ | ||||
char8_t |
UTF-8 字符 | ● | ○ | |||||||
char32_t |
UTF-32 字符 | ● | ○ | ○ | ○ | ○ | ||||
short |
短整型 | ○ | ○ | ○ | ○ | ○ | ||||
int |
整型 | ○ | ○ | ○ | ○ | ○ | ||||
long |
长整型 | ○ | ○ | ○ | ○ | ○ | ||||
signed |
有符号修饰 | ○ | ○ | ○ | ○ | ○ | ||||
unsigned |
无符号修饰 | ○ | ○ | ○ | ○ | ○ | ||||
float |
单精度浮点 | ○ | ○ | ○ | ○ | ○ | ||||
double |
双精度浮点 | ○ | ○ | ○ | ○ | ○ | ||||
| 类型推导/别名 | auto |
让编译器推导类型(C++11 起彻底改变语义) | ● | ○ | ○ | ○ | ○ | |||
decltype |
取表达式类型 | ● | ○ | ○ | ○ | ○ | ||||
typedef |
给类型起"旧式"别名 | ○ | ○ | ○ | ○ | ○ | ||||
using |
起别名/引入命名空间 | ○ | ○ | ○ | ○ | ○ | ||||
| 常量/编译期 | const |
只读常量 | ○ | ○ | ○ | ○ | ○ | |||
constexpr |
编译期可计算 | ● | ○ | ○ | ○ | ○ | ||||
consteval |
必为编译期求值的"立即函数" | ● | ○ | |||||||
constinit |
强制"静态初始化"用常量表达式 | ● | ○ | |||||||
nullptr |
类型安全的空指针字面量 | ● | ○ | ○ | ○ | ○ | ||||
true/false |
布尔字面量 | ○ | ○ | ○ | ○ | ○ | ||||
| 存储期/链接 | static |
静态存储/内部链接 | ○ | ○ | ○ | ○ | ○ | |||
extern |
外部链接声明 | ○ | ○ | ○ | ○ | ○ | ||||
register |
建议放寄存器(已废弃语义) | ○ | ○ | ○ | ○ | ○ | ||||
thread_local |
每线程一份独立存储 | ● | ○ | ○ | ○ | ○ | ||||
volatile |
禁止优化,每次真正读写内存 | ○ | ○ | ○ | ○ | ○ | ||||
| 对齐/大小 | alignas |
指定对齐要求 | ● | ○ | ○ | ○ | ○ | |||
alignof |
查询对齐值 | ● | ○ | ○ | ○ | ○ | ||||
sizeof |
查询字节大小 | ○ | ○ | ○ | ○ | ○ | ||||
| 控制流 | if/else |
条件分支 | ○ | ○ | ○ | ○ | ○ | |||
switch/case/default |
多路分支 | ○ | ○ | ○ | ○ | ○ | ||||
for/while/do |
循环 | ○ | ○ | ○ | ○ | ○ | ||||
break/continue |
跳出/下次循环 | ○ | ○ | ○ | ○ | ○ | ||||
goto |
无条件跳转 | ○ | ○ | ○ | ○ | ○ | ||||
| 编译期 if | if constexpr |
编译期条件丢弃分支 | ● | ○ | ○ | |||||
| 返回/跳转 | return |
函数返回 | ○ | ○ | ○ | ○ | ○ | |||
| 协程 | co_await |
挂起协程等待可等待对象 | ● | ○ | ||||||
co_yield |
协程"生成"一个值并挂起 | ● | ○ | |||||||
co_return |
协程返回并终止 | ● | ○ | |||||||
| 异常 | try/catch/throw |
捕获/抛出异常 | ○ | ○ | ○ | ○ | ○ | |||
noexcept |
标记函数是否可能抛异常 | ● | ○ | ○ | ○ | ○ | ||||
| 转换/RTTI | static_cast |
编译期安全转换 | ○ | ○ | ○ | ○ | ○ | |||
dynamic_cast |
运行时多态转换 | ○ | ○ | ○ | ○ | ○ | ||||
const_cast |
增删 const 限定 | ○ | ○ | ○ | ○ | ○ | ||||
reinterpret_cast |
低级别重解释转换 | ○ | ○ | ○ | ○ | ○ | ||||
typeid |
获取运行时类型信息 | ○ | ○ | ○ | ○ | ○ | ||||
| 内存管理 | new/delete |
动态分配/释放 | ○ | ○ | ○ | ○ | ○ | |||
| 类/结构/联合 | class |
定义类(默认私有) | ○ | ○ | ○ | ○ | ○ | |||
struct |
定义结构体(默认公有) | ○ | ○ | ○ | ○ | ○ | ||||
union |
定义联合(成员重叠存储) | ○ | ○ | ○ | ○ | ○ | ||||
enum |
定义枚举 | ○ | ○ | ○ | ○ | ○ | ||||
| 访问限定 | public/protected/private |
访问级别 | ○ | ○ | ○ | ○ | ○ | |||
| 友元 | friend |
授权外部函数/类访问私有成员 | ○ | ○ | ○ | ○ | ○ | |||
| this | this |
指向当前对象的指针 | ○ | ○ | ○ | ○ | ○ | |||
| 虚函数/多态 | virtual |
声明虚函数 | ○ | ○ | ○ | ○ | ○ | |||
override |
显式标记"重写"虚函数 | ● | ○ | ○ | ○ | |||||
final |
禁止派生或进一步重写 | ● | ○ | ○ | ○ | |||||
| 函数修饰 | inline |
建议内联展开;C++17 起允许多定义 | ○ | ○ | ● | ○ | ○ | |||
explicit |
禁止单参构造函数隐式转换 | ○ | ○ | ○ | ○ | ○ | ||||
| 运算符重载 | operator |
重载运算符函数名 | ○ | ○ | ○ | ○ | ○ | |||
| 模板/泛型 | template |
定义函数/类模板 | ○ | ○ | ○ | ○ | ○ | |||
typename |
模板中声明类型参数 | ○ | ○ | ○ | ○ | ○ | ||||
| 概念 | concept |
具名模板约束 | ● | ○ | ||||||
requires |
匿名/局部约束表达式 | ● | ○ | |||||||
| 断言 | static_assert |
编译期断言 | ● | ○ | ○ | ○ | ○ | |||
| 命名空间 | namespace |
定义/打开命名空间 | ○ | ○ | ○ | ○ | ○ | |||
| 模块 | module |
声明当前翻译单元为模块 | ● | |||||||
import |
导入模块或模块分区 | ● | ||||||||
| 反射 | reflexpr |
编译期获取程序元素元数据(TS 实验) | ● | |||||||
| 同步 | sync |
暂定关键字,用于并发同步语义(尚未最终定案) | (保留位) | |||||||
| 内联汇编 | asm |
直接插入汇编指令 | ○ | ○ | ○ | ○ | ○ | |||
| 位运算符拼写 | and/or/not/bitand/bitor/xor... |
可读性替代 && ` |
! & |
^` 等 |
○ | ○ | ○ | ○ | ○ |
C++ 基本输入/输出
在 C++ 中,数据的读写通过"流"(stream)完成,流就是字节序列。
- 输入流:数据从设备(如键盘)流向计算机内存。
- 输出流:数据从内存流向输出设备(如cmd控制台,打印机,手机屏幕,电脑屏幕等)。
这些流由头文件 <iostream> 提供。
最常用的流对象:
cin:用于输入cout:用于输出
标准输出流 - cout
cout 是 ostream 类的实例,负责把结果显示到屏幕。
数据通过"插入运算符" << 送给 cout。
示例代码:
cpp
#include <iostream>
using namespace std;
int main(){
// 用 cout 打印指定文本
cout << "GeeksforGeeks";
return 0;
}
运行结果:
GeeksforGeeks
标准输入流 - cin
cin 是 istream 类的实例,用于从键盘读取输入。
通过提取运算符 >> 把数据从输入流读进变量。
示例代码:
cpp
#include <iostream>
using namespace std;
int main()
{
int age;
// 从用户获取输入并保存到变量
cin >> age;
// 输出刚才输入的年龄
cout << "Your age is: " << age;
return 0;
}
运行结果(用户键入 18 后按回车):
csharp
18
Your age is: 18
无缓冲标准错误流 --- cerr
cerr 是用于输出错误信息的标准错误流,也是 ostream 类的实例。
它会立即 把消息显示出来,不等待缓冲区刷新 (即无缓冲输出 )。
适合把错误或警告与正常程序输出(cout)分开展示。
与 cout 的区别:
cout可能会因缓冲而延迟显示;cerr保证错误信息瞬间可见;- 如果把程序输出重定向到文件,
cerr的内容不会进入该文件,而是直接打印到屏幕------这就是"无缓冲"的含义。
示例代码:
cpp
#include <iostream>
using namespace std;
int main()
{
cerr << "An error occurred";
return 0;
}
运行结果(立即出现在屏幕):
go
An error occurred
带缓冲的标准错误流 --- clog
clog 是用于记录日志信息的标准日志流,同样属于 ostream 类。
与 cerr 不同,clog 先把消息存进缓冲区 ,等到缓冲区满或手动 flush() 时才真正输出------这就是**"带缓冲"的含义。
适合用来记录运行日志,这些信息不需要立刻**出现在屏幕上。
与 cerr 对比:
cerr无缓冲,立即可见;clog有缓冲,可能延迟显示,性能略好。
示例代码:
cpp
#include <iostream>
using namespace std;
int main()
{
clog << "An error occurred";
return 0;
}
运行结果(可能稍后才出现或需手动刷新):
go
An error occurred