🔷 C++基础
照着《零基础学C++》做的完整自学笔记 —— 从第一个 Hello World 到控制台编程的地基(变量/运算符/分支/循环/函数/指针/结构体/类与对象/继承/模板/STL/RTTI 与异常/文件操作),最后一章用 Windows API + GDI+ 手搓一个「坦克动荡」小游戏把全书串起来。大白话、不跳步骤、必带生活比喻、常见误区、可折叠自测题。前十章环境用教材同款 Dev-C++,第十六章换 Visual Studio。
前置课程:Java 基础(第一次学编程)、服务器工作原理(后台怎么运转)。
内容来自我的 Obsidian 自学笔记 · 全 16 章 287 节完结 ✅(含坦克游戏项目)
第一章 初识C++
C++概述
C++ 是什么(编译型·静态类型·C 的…
C++的发展历程
1979 贝尔实验室给 C 加"类"→1…
C++中的杰出人物
Bjarne Stroustrup(C+…
C++的特点
优点=高效贴近硬件·面向对象·泛型与 S…
搭建C++开发环境
写 C++ 需要三件套(编辑器+编译器+…
认识Dev-C++
Dev-C++ 是什么(开源免费·自带…
Dev-C++的下载与安装
官方下载渠道(SourceForge 的…
使用Dev-C++创建C++文件
新建源文件 → 保存为 .cpp(路径无…
C++代码结构
两个视角:工程管"一堆文件",代码管"文…
C++工程项目文件
一个工程文件夹里的四种角色:.dev 工…
认识C++代码结构
逐行拆解 Hello World:#in…
小结
第一章知识地图:C++ 是什么·怎么来的…
第二章 C++语言基础
第一个C++程序
一个程序的四段料(预处理→名字空间→ma…
#include 指令
预处理:编译前把目标文件内容原样插入;不…
iostream 标准库
i + o + stream;四个对象…
命名空间
名字冲突的由来;std 是标准库抽屉;:…
main 函数
唯一入口;四部件 int/main/()…
函数体
花括号里的语句序列;从上到下执行;花括号…
函数返回值
return 两件事:交回值 + 立即结…
注释
// 与 /* */(不可嵌套);写"为…
常量及符号
五类常量(整型/实型/字符/字符串/其他…
整型常量
四种进制写法;010 是八进制=8 的经…
实型常量
小数形式与指数形式;默认 double…
字符常量
单引号一个字符;'A' 就是 65;转义…
字符串常量
双引号;末尾自动补 '0'("A" 占…
其他常量
const(有类型·推荐)vs #def…
变量
变量=带标签的空间;三要素(类型/名字/…
标识符
硬规则四条(字母数字下划线·不能数字开头…
变量的声明及赋值
声明/赋值/初始化;= 是从右到左;未初…
整型变量
家族与范围(short 2/int 4/…
实型变量
float 4 字节 7 位 vs do…
字符变量
含实例01、02:char 存的是 AS…
数据类型
类型决定三件事(占多大/怎么解读/能算什…
数值类型
选型四条;混算的隐式提升;5/2 得 2…
字符类型
char 家族的符号性(由编译器决定)…
布尔类型
bool 两个值、占 1 字节;非 0…
数据的输入与输出
三条通道与数据流向(>> 指向变量、<<…
控制台屏幕
控制台=黑窗口;三条标准通道;重定向 >…
C++语言中的流
流与缓冲区;cin 三条解析规则(跳空白…
流输出格式控制
含实例03、04:fixed + set…
小结
第二章知识地图;六个必记结论;两关自测(…
第三章 运算符与表达式
运算符
九类运算符总览(算/比/管/问/选/排…
算术运算符
五兄弟 + - * / %;整数除法丢小…
关系运算符
六个比较符出 bool;== 与 = 手…
逻辑运算符
含实例01:&& 串联 /
赋值运算符
= 从右往左装盒子;复合赋值 += -=…
位运算符
含实例02:& 串联
移位运算符
含实例03:<<n=×2ⁿ、>>n=÷2…
sizeof运算符
量字节尺子三种用法;不是函数、编译期出结…
条件运算符
唯一三目 ? :;整个式子是值(能塞 c…
逗号运算符
排队挨个算、取最后一个;副作用不白算;f…
结合性和优先级
金字塔:算术>移位>关系>逻辑>赋值>逗…
表达式
表达式 = 运算符+操作数;必有值和类型…
认识表达式
表达式(面粉)加分号成语句(面包);嵌套…
表达式中的类型转换
含实例04、05:算术看最高(楼梯只上不…
判断左值与右值
左值=有地址的盒子(能赋值能取地址)、右…
小结
第三章知识地图;五个必记结论;两关自测(…
第四章 条件判断语句
决策分支
程序三大结构(顺序/分支/循环);决策…
判断语句
if 家族总览(单分支做不做/双分支二选…
第一种形式的判断语句
含实例01:光杆 if 真/跳流程;判奇…
第二种形式的判断语句
含实例02:if-else 两路必走其一…
第三种形式的判断语句
含实例03:阶梯逐级查、命中即走;隐含条…
使用条件运算符进行判断
含实例04:三目 = 挑值版 if-el…
switch语句
含实例05:case 常量跳板 + br…
判断语句的嵌套
含实例06、07:嵌套先过外层关;闰年三…
小结
第四章知识地图;五个必记结论;两关自测(…
第五章 循环语句
while 和 do...while 循环
循环三要素(初始化/继续条件/更新);w…
while 循环
含实例01:while 流程与纸面演算(…
do...while 循环
含实例02:先跑后验、末尾分号必须有;"…
for循环语句
for 不是新循环:三要素收进一行;与…
for循环语句的一般形式
含实例03:①只一次 ②③每圈;i 的寿…
for循环的变体
三段都能省、分号不能丢;for(;;)…
循环控制
四条路:控制变量(方向盘)/ break…
控制循环的变量
控制变量三种身份(计数器/累加器/哨兵)…
break 语句
含实例04:找到就停;跳过剩余语句与更新…
continue 语句
含实例05:跳过本轮、回更新继续下一圈…
goto 语句
含实例06:goto 手搓循环(能算出…
循环的嵌套
含实例07:外圈一格 = 内圈一整圈,总…
小结
第五章知识地图;五个必记结论;两关自测(…
第六章 函数
函数概述
函数=给一段代码起的名字(打包成一台带按…
函数的定义
四部件:返回类型·函数名·参数表(合称函…
函数的声明
含实例01:声明=函数头+分号(只打招呼…
函数参数及返回值
两个口:入口是参数(可多)、出口是返回值…
空函数
返回类型写 void(只干活不交结果)…
形参与实参
形参=函数新开的盒子,实参=调用方的原件…
默认参数
含实例02:形参预设兜底值,调用可少传…
可变参数
含实例03:... 省略号+<cstda…
返回值
return 两件事:交回值+立即结束(…
函数调用
调用五步:记位置→复制实参→跳进去→交结…
传值调用
含实例04:经典翻车现场 swap 换不…
嵌套调用
A 调 B、B 调 C;先进后出(一摞便…
递归调用
含实例05:两要素=出口+向出口靠近;"…
变量作用域
三层地盘(全局/局部/块内);就近遮蔽…
重载函数
含实例06:同名多套参数表;靠个数/类型…
内联函数
inline 把函数体就地铺到调用点;用…
变量的存储类别
两个维度:住哪儿+活多久;四兄弟 aut…
auto变量
默认的局部变量,住栈上、随函数生灭;每次…
static变量
含实例07:初始化只做一次、活到程序结束…
register变量
老式优化建议(放进 CPU 寄存器);现…
extern变量
声明"别处有",不分配空间;跨文件共享全…
小结
第六章知识地图(五块拼图);六个必记结论…
第七章 数组、指针和引用
一维数组
数组=一排连号柜子(同类型·连续·下标从…
一维数组的声明
类型 名[长度];长度必须是编译期常量…
一维数组的引用
a[i] 是左值(能读能写);越界不报错…
一维数组的初始化
全填 / 填一部分(其余补 0)/ {}…
二维数组
一张有行有列的表格;内存里仍是行优先的一…
二维数组的声明
类型 名[行数][列数];行在前列在后…
二维数组元素的引用
a[i][j] 两对方括号;a[i, j…
二维数组的初始化
分行 / 不分行(按行优先)/ 分别补…
字符数组
字符串=末尾带结束哨兵的字符数组;四大函…
指针
指针=存地址的变量;变量的值与地址;三个…
变量与指针
int *p = &a;;int *p…
指针运算符和取地址运算符
& 取地址 / * 解引用;* 的三重身…
指针运算
p+1 跳一个元素而不是一个字节;指针相…
指向空的指针与空类型指针
NULL / nullptr 与判空;v…
指向常量的指针与指针常量
const int *p(锁值)对 in…
指针与数组
数组名=首元素地址;a[i] 等价于 *…
指针与一维数组
四种等价写法;*p++ 与 (*p)++…
指针与二维数组
a 行指针跳行、a[0] 元素指针跳格…
指针与字符数组
while (*p) 靠结束哨兵自动停…
指针在函数中的应用
三种玩法:传递地址(改原件)/ 函数指针…
传递地址
void swap(int *a, in…
指向函数的指针
int (*fp)(int, int)…
从函数中返回指针
int *f(...);绝不能返回局部变…
指针数组
int *p[5](指针数组)对 int…
引用
引用=给变量起的别名;比指针更安全更好写…
引用概述
int &r = a;;三条铁律:必须初…
使用引用传递参数
void swap(int &a, in…
使用数组作为函数参数
数组传参退化成指针 → 改原件、size…
小结
知识地图(八块拼图);六个必记结论;两关…
第八章 结构体与共用体
结构体
结构体=把不同类型的数据打包成一条记录…
结构体定义
struct 名 { 成员 };;末尾分…
结构体变量
Student s1;;点号访问成员;同…
结构体成员及初始化
含实例01:按成员顺序初始化/填不满补…
结构体的嵌套
成员本身是结构体,一层层点 s.birt…
结构体的大小
大小 ≠ 成员相加;两条对齐规则;按大小…
重命名数据类型
typedef 原类型 新名字;(新名在…
结构体与函数
三种交法:传值/传指针/传引用;结构体越…
使用结构体变量做函数参数
含实例02:传值=整块复制,函数里改不动…
使用结构体指针变量做函数参数
含实例03:Student *p 配 &…
结构体数组
一排结构体=一张表格;比"几个平行数组"…
结构体数组的声明与引用
Student cls[n];每条记录一…
使用指针访问结构体数组
含实例04:数组名=首地址;(p+i)-…
共用体
共用体=成员共用同一块内存;并排 vs…
共用体的定义与声明
union 名 { 成员 };;语法同…
共用体的大小
含实例05:大小取最大成员(再对齐);一…
共用体的特点
三条特点+与结构体的完整对比表;典型用途…
枚举类型
枚举=给一串整数起名字;可读性+类型检查…
枚举类型的声明
enum 名 { 名字列表 };;默认…
枚举类型变量
Weekday today = WED;…
枚举类型的运算
含实例06:比较/算术(结果转 int)…
小结
知识地图(六块拼图)+七个必记结论+两关…
第九章 面向对象编程基础
面向对象概述
面向对象=看程序的新角度(不是新语法)…
面向对象编程与面向过程编程
按步骤组织 vs 按角色组织;不是新打败…
面向过程编程
数据与函数两分离;软肋=改动扩散、"不报…
面向对象编程
类=图纸、对象=实物;对象间靠"消息"配…
面向对象的特点
封装(藏数据·只留门)/继承(is-a…
统一建模语言
UML=画设计蓝图的通用图形语言;不写代…
统一建模语言概述
Booch+OMT+OOSE 三套画法合…
统一建模语言的结构
类图三格框;可见性 + - # ~;五种…
面向对象的建模
四步法:找对象→定属性→定行为→定关系…
小结
知识地图(六块)+七个必记结论+两关自测…
第十章 类和对象
C++类
类=把数据和方法打包成自定义类型;cla…
类概述
成员变量(私有)+成员函数(公有);三档…
类的声明与定义
class 名 { 成员 }; 末尾分号…
类的实现
.h 放声明、.cpp 放实现;头文件卫…
对象的声明
含实例01:类名 对象名;;对象数组/指…
构造函数
构造函数=对象出生时自动跑;名字=类名…
构造函数概述
初始化列表(const/引用成员只能用它…
复制构造函数
含实例02:复制构造=浅拷贝;有指针成员…
析构函数
含实例03:~类名()、不能重载;离开作…
类成员
类成员地图:普通/静态、const 成员…
访问类成员
三种访问视角(对象点/指针箭头/类内直写…
内联成员函数
类内定义自动内联;类外要写 inline…
静态类成员
静态成员全类一份;类外定义一次(漏了 u…
隐藏的this指针
this=当前对象地址(p.show()…
嵌套类
类里定义的类;外面要写 Outer::I…
局部类
函数里定义的类;成员函数必须就地写完、不…
友元
友元=点名放行(不是拆墙);三种给法;单…
友元概述
四种格式;friend 声明写在哪个区都…
友元类
friend class X; 整队放行…
友元函数
含实例04:友元函数不是成员(不写 ::…
命名空间
命名空间=给名字加姓氏;回收 using…
使用命名空间
三种用法(全名/using 声明/usi…
定义命名空间
namespace 名 { } 末尾不加…
在多个文件中定义命名空间
命名空间跨文件:.h 放声明、.cpp…
定义嵌套的命名空间
嵌套命名空间(公司→部门→小组);C++…
定义未命名的命名空间
未命名命名空间=本文件私有;static…
小结
知识地图(六块)+八个必记结论+两关自测…
第十一章 继承与派生
继承
继承=站在已有类的肩膀上;语法 clas…
类的继承
语法拆解(class 默认 privat…
继承后的可访问性
3×3 权限表;取小原则(越继承越封闭)…
构造函数的调用顺序
含实例01:构造先父后子、析构先子后父…
子类显式调用父类的构造函数
含实例02:子类(参数) : 父类(参数…
子类隐藏父类的成员函数
含实例03:同名就全藏(与参数是否相同无…
重载运算符
运算符本来就是函数(a + b ≡ op…
重载运算符的必要性
不用重载:add(mul(a,b),c)…
重载运算符的形式与规则
含实例04:成员 vs 非成员(对称的建…
重载运算符的运算
返回值对照表:改自己返回 T&、产生新值…
转换运算符
operator 目标类型():没有返回…
多重继承
class C : public A…
多重继承的定义
一列父类、每个都要写 public;对象…
二义性
同名成员报 ambiguous;菱形继承…
多重继承的构造顺序
含实例05:按继承声明顺序依次构造,与初…
多态
同一句话,不同反应;编译期多态(重载)v…
虚函数概述
动态绑定三条件(指针/引用+虚函数+签名…
利用虚函数实现动态绑定
含实例06:父类指针数组装各种子类,一次…
虚继承
含实例07:virtual 继承让祖先只…
抽象类
含实例08:virtual ... =…
小结
知识地图(六块)+八个必记结论+两关自测…
第十二章 模板
函数模板
模板=把类型也变成参数的一份函数图纸;写…
函数模板的定义
template <typename T…
函数模板的作用
含实例01:三个作用=① 消灭重复 ②…
重载函数模板
含实例02:通用模板对 const ch…
类模板
类模板=类的模具;类模板不是类型(Box…
类模板的定义与声明
定义模具时类名后不写 <T>;成员函数类…
简单类模板
Pair<T1, T2> 完整实现(两个…
默认模板参数
template <typename T…
为具体类型的参数提供默认值
把最常用的那一种配置设为默认(templ…
有界数组模板
本章结业作品:T data[size](…
模板的使用
用模板的三个层次=用现成的 / 自己写…
定制类模板
全特化:template <> clas…
定制类模板成员函数
成员特化:template <> voi…
小结
知识地图 + 八个必记结论 + 两关自测…
第十三章 STL
序列容器
STL 三件套=容器 + 算法 + 迭代…
向量类模板
含实例01:vector = 会自己长大…
双端队列类模板
deque = 两头都能 O(1) 进出…
链表类模板
list = 双向链表;任意已知位置插删…
关联式容器
关联式容器=按键存(元素始终自动排序、查…
set类模板
含实例02:set = 自动去重 + 自…
multiset 类模板
multiset = set + 允许重…
map类模板
map = 字典(键 + 值,按键 O(…
multimap 类模板
multimap = 一个键对应多个值…
算法
算法总览:统一姿势 算法名(first…
非修正序列算法
含实例03、04:只看不改的那一票——f…
修正序列算法
含实例05、06:会改数据的那一票——c…
排序算法
含实例07:sort(不稳)与 stab…
数值算法
含实例08:在 <numeric>(不在…
迭代器
迭代器=容器与算法之间的通用插头(指针是…
输出迭代器
含实例09:输出迭代器=只能写、只能前进…
输入迭代器
输入迭代器=只能读、只能前进、只能走一遍…
前向迭代器
前向迭代器=输入迭代器 + 能写 + 能…
双向迭代器
双向迭代器=前向 + --;解锁 rev…
随机访问迭代器
随机访问迭代器=能跳(+n / -n /…
小结
知识地图(14 块)+ 十个必记结论 +…
第十四章 RTTI与异常处理
RTTI
RTTI = 运行期类型信息(typei…
什么是RTTI
静态类型(写出来的)vs 动态类型(实际…
RTTI与引用
引用上照样能 typeid / dyna…
RTTI与多重继承
多重继承下一个对象有好几个合法地址(基类…
RTTI转换语法
四把转换扳手:static_cast(编…
异常处理
try / throw / catch…
抛出异常
抛出去的是一份拷贝;惯例抛类对象(别抛裸…
异常捕获
按书写顺序匹配、先到先得(不是最精确胜出…
异常匹配
只允许四种转换:精确匹配 / cv 限定…
标准异常
std::exception 是根(只提…
小结
知识地图(10 块)+ 十个必记结论 +…
第十五章 文件操作
流简介
流=数据传输通道(抽象:只管进出,不管两…
C++中的流类库
四个头文件各管一段(iostream 人…
类库的使用
用文件流永远五步(包含头文件 → 建对象…
ios类中的枚举常量
三组常量:① 打开方式(in out a…
流的输入-输出
<< 与 >> 是重载的函数(cout…
文件的打开
两种打开时机(构造时顺手打开 / 先建对…
打开方式
六个常量的选择与组合;三对最容易混:ap…
默认打开方式
ifstream 默认 in;ofstr…
在打开文件的同时创建文件
含 out(或 app、trunc)就会…
文件的读-写
两条路:文本(人能读、可手工改、跨平台…
文件流
三个文件流类的分工(只读 / 只写 /…
写文本文件
<< 自动把各类型转成文字(bool 默…
读取文本文件
三种读法(>> 逐词跳过空白 / get…
二进制文件的读-写
write 与 read + (char…
实现文件复制
三种方案:逐字符 / 逐行 / 二进制块…
文件指针移动操作
两个位置:读位置(seekg/tellg…
文件错误与状态
四盏灯:good / eof / fai…
文件的追加
三种打开方式的写位置命运;app 是强制…
文件结尾的判断
eof() 是事后报告,不是事前预告…
在指定位置读-写文件
随机访问的核心公式:第 i 条记录的偏移…
文件和流的关联与分离
open 是关联、close 是分离;一…
删除文件
C++ 标准库没有删文件的成员函数 →…
小结
知识地图(22 块)+ 十个必记结论 +…