C++ 入门知识 — 完整知识点
一、C++ 简介
1.1 什么是 C++
- C++ 是一种通用的、编译型的、大小写敏感的编程语言
- 支持过程式编程、面向对象编程、泛型编程、函数式编程四种编程范式
- 由 Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)于 1979 年在贝尔实验室开发
- 最初名为 “C with Classes”(带类的 C),1983 年更名为 C++
- 名称中的
++是 C 语言的自增运算符,寓意"C 的增强版"
1.2 C++ 的特点
| 特点 | 说明 |
|---|---|
| 高性能 | 接近 C 语言的执行效率,适用于系统级开发 |
| 面向对象 | 支持类、继承、多态、封装 |
| 泛型编程 | 通过模板实现通用算法和数据结构 |
| 可移植性 | 源代码可在不同平台编译运行 |
| 标准库丰富 | STL(标准模板库)提供容器、算法、迭代器 |
| 向后兼容 | 兼容大部分 C 语言代码 |
二、C++ 简史
2.1 C 语言
| 时间 | 事件 |
|---|---|
| 1972 年 | Dennis Ritchie 在贝尔实验室发明 C 语言 |
| 1978 年 | 《The C Programming Language》出版(K&R C) |
| 1989 年 | ANSI C 标准发布(C89/C90) |
| 1999 年 | C99 标准发布 |
| 2011 年 | C11 标准发布 |
| 2018 年 | C17 标准发布 |
C 语言的核心特点:
- 结构化编程语言
- 提供底层内存访问能力(指针)
- 语法简洁、执行高效
- 广泛用于操作系统、嵌入式系统开发
2.2 C 语言编程原理(结构化编程)
核心思想:
- 自顶向下、逐步细化:将大问题分解为小问题
- 函数模块化:每个函数完成一个特定任务
- 三种基本结构:顺序、选择、循环
// C 语言结构化编程示例
#include <stdio.h>
int main(void) {
printf("Hello, C!\n");
return 0;
}
C 语言编程流程:
源代码(.c) → 预处理器 → 编译器 → 汇编器 → 目标文件(.o/.obj) → 链接器 → 可执行文件
2.3 面向对象编程(OOP)
OOP 的四大核心概念:
| 概念 | 说明 | 关键字 |
|---|---|---|
| 封装 | 将数据和操作数据的方法绑定,隐藏内部实现 | class、private、public、protected |
| 继承 | 子类继承父类的属性和方法,实现代码复用 | :、virtual |
| 多态 | 同一接口可以有不同的实现方式 | virtual、override |
| 抽象 | 提取事物的共同特征,形成抽象类或接口 | 纯虚函数 = 0 |
// C++ OOP 示例
class Animal { // 抽象基类
public:
virtual void speak() = 0; // 纯虚函数
};
class Dog : public Animal { // 继承
public:
void speak() override { // 多态
std::cout << "Woof!" << std::endl;
}
};
int main() {
Animal* pet = new Dog(); // 基类指针指向派生类
pet->speak(); // 输出: Woof!
delete pet;
return 0;
}
2.4 C++ 和泛型编程
泛型编程:编写与类型无关的通用代码,通过模板实现。
// 函数模板
template <typename T>
T getMax(T a, T b) {
return (a > b) ? a : b;
}
// 类模板
template <typename T>
class Container {
T element;
public:
void set(T val) { element = val; }
T get() { return element; }
};
int main() {
std::cout << getMax(10, 20) << std::endl; // int
std::cout << getMax(3.14, 2.72) << std::endl; // double
return 0;
}
三、C++ 的起源
3.1 发展时间线
| 时间 | 里程碑 |
|---|---|
| 1979 年 | Bjarne Stroustrup 开始 “C with Classes” 项目 |
| 1983 年 | 正式更名为 C++ |
| 1985 年 | C++ 2.0 发布;《The C++ Programming Language》出版 |
| 1989 年 | C++ 3.0 发布,引入多重继承 |
| 1998 年 | C++98 标准发布(ISO/IEC 14882:1998) |
| 2003 年 | C++03 标准发布(缺陷修复版本) |
| 2011 年 | C++11 标准发布(重大更新,现代 C++ 起点) |
| 2014 年 | C++14 标准发布 |
| 2017 年 | C++17 标准发布 |
| 2020 年 | C++20 标准发布 |
| 2023 年 | C++23 标准发布 |
四、可移植性和标准
4.1 可移植性问题
源代码级可移植:同一份源代码可在不同平台编译运行
二进制级可移植:编译后的可执行文件可直接在不同平台运行(C++ 一般不支持)
影响可移植性的因素:
- 硬件架构差异(x86、ARM、RISC-V)
- 操作系统差异(Windows、Linux、macOS)
- 编译器差异(GCC、Clang、MSVC)
- 系统 API 差异
提高可移植性的方法:
- 遵循 C++ 标准编写代码
- 避免使用平台特有的 API
- 使用条件编译处理平台差异
- 使用跨平台的第三方库(如 Qt、Boost)
4.2 C++ 标准
ISO C++ 标准演进:
| 标准 | 代号 | 关键特性 |
|---|---|---|
| C++98 | ISO/IEC 14882:1998 | STL、模板、异常处理、命名空间 |
| C++03 | ISO/IEC 14882:2003 | 小幅缺陷修复 |
| C++11 | ISO/IEC 14882:2011 | auto、lambda、智能指针、右值引用、范围for、nullptr、线程库 |
| C++14 | ISO/IEC 14882:2014 | 泛型 lambda、变量模板、二进制字面量 |
| C++17 | ISO/IEC 14882:2017 | std::optional、std::variant、结构化绑定、文件系统库 |
| C++20 | ISO/IEC 14882:2020 | Concepts、Ranges、协程、Modules、格式化库 |
| C++23 | ISO/IEC 14882:2023 | std::expected、std::print、import std |
4.3 C++11 核心新特性详解
// 1. auto 类型推导
auto x = 42; // int
auto y = 3.14; // double
// 2. nullptr(替代 NULL)
int* p = nullptr;
// 3. 范围 for 循环
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto& v : vec) {
std::cout << v << " ";
}
// 4. Lambda 表达式
auto add = [](int a, int b) { return a + b; };
std::cout << add(3, 4); // 7
// 5. 智能指针
std::unique_ptr<int> up = std::make_unique<int>(42);
std::shared_ptr<int> sp = std::make_shared<int>(100);
// 6. 右值引用和移动语义
std::string a = "hello";
std::string b = std::move(a); // 移动而非拷贝
// 7. 初始化列表
std::vector<int> v = {1, 2, 3};
// 8. enum class(强类型枚举)
enum class Color { Red, Green, Blue };
Color c = Color::Red;
4.4 本书遵循的 C++ 标准
- 本书以 C++11 为基础标准
- 适当介绍 C++14/C++17 的新增特性
- 代码示例在主流编译器(GCC 9+、Clang 10+、MSVC 2019+)上均能编译通过
- 建议读者安装支持 C++17 的编译器版本
五、程序创建的技巧
5.1 创建源代码文件
C++ 源文件命名约定:
| 文件类型 | 扩展名 | 说明 |
|---|---|---|
| 源文件 | .cpp、.cc、.cxx | 包含函数实现(最常用 .cpp) |
| 头文件 | .h、.hpp | 包含声明和宏定义 |
| 源文件(C) | .c | C 语言源文件 |
源代码文件的结构:
// ========== 1. 头文件包含 ==========
#include <iostream> // 系统头文件
#include "myheader.h" // 用户自定义头文件
// ========== 2. 宏定义 ==========
#define PI 3.14159
// ========== 3. 命名空间 ==========
using namespace std;
// ========== 4. 全局变量声明 ==========
int globalVar = 100;
// ========== 5. 函数声明(原型) ==========
int add(int a, int b);
// ========== 6. 主函数 ==========
int main() {
cout << add(3, 4) << endl;
return 0;
}
// ========== 7. 函数定义 ==========
int add(int a, int b) {
return a + b;
}
5.2 编译和链接
完整流程:
源代码 (.cpp)
│
▼
【预处理】(展开宏、处理#include、条件编译)
│
▼
【编译】(语法分析 → 语义分析 → 生成汇编代码)
│
▼
【汇编】(汇编代码 → 机器码 → 目标文件 .o / .obj)
│
▼
【链接】(合并目标文件 + 库文件 → 可执行文件 .exe / .out)
各阶段详解:
阶段一:预处理(Preprocessing)
g++ -E main.cpp -o main.i # 生成预处理后的文件
处理内容:
#include:将头文件内容插入到源文件中#define:进行宏替换#ifdef/#ifndef:条件编译- 删除注释
阶段二:编译(Compilation)
g++ -S main.i -o main.s # 生成汇编代码文件
处理内容:
- 词法分析、语法分析、语义分析
- 类型检查
- 代码优化
- 生成汇编代码
阶段三:汇编(Assembly)
g++ -c main.cpp -o main.o # 生成目标文件(跳过以上步骤直接到汇编)
处理内容:
- 将汇编代码转换为机器指令
- 生成目标文件(ELF 格式 / COFF 格式)
阶段四:链接(Linking)
g++ main.o utils.o -o myapp # 链接多个目标文件
处理内容:
- 符号解析:找到函数和变量的定义地址
- 地址重定位:修正函数调用和变量引用的地址
- 合并标准库代码
两种链接方式:
| 方式 | 命令示例 | 说明 |
|---|---|---|
| 静态链接 | g++ main.cpp -static -o app | 将库代码打包进可执行文件,文件大但不依赖外部库 |
| 动态链接 | g++ main.cpp -o app(默认) | 运行时加载共享库,文件小但需要动态库存在 |
5.3 一步编译(实际开发常用)
# 直接从源代码生成可执行文件(编译器自动完成全部步骤)
g++ main.cpp -o myapp
# 编译多个源文件
g++ main.cpp utils.cpp -o myapp
# 指定 C++ 标准版本
g++ -std=c++11 main.cpp -o myapp
g++ -std=c++17 main.cpp -o myapp
# 开启所有警告
g++ -Wall -Wextra main.cpp -o myapp
# 开启调试信息
g++ -g main.cpp -o myapp
# 开启优化
g++ -O2 main.cpp -o myapp
六、C++ 主流开发工具介绍
6.1 工具对比总览
| 工具 | 类型 | 平台 | 难度 | 适用场景 |
|---|---|---|---|---|
| Visual Studio 2022 | IDE | Windows | 初级 | Windows 应用开发、学习入门 |
| VS Code + GCC/Clang | 编辑器 + 编译器 | 跨平台 | 中级 | 轻量开发、跨平台项目 |
| Code::Blocks | IDE | 跨平台 | 初级 | C/C++ 学习入门 |
| CLion | IDE | 跨平台 | 中级 | 专业 C++ 开发 |
| Dev-C++ | IDE | Windows | 初级 | C/C++ 学习入门(轻量) |
| GCC (g++) | 编译器 | 跨平台 | 中级 | 命令行编译 |
| Clang | 编译器 | 跨平台 | 中级 | 命令行编译、更友好的错误提示 |
| MSVC | 编译器 | Windows | 初级 | Windows 平台原生编译 |
七、开发工具的安装
7.1 方案一:Visual Studio 2022(推荐初学者,Windows 平台)
7.1.1 下载
- 打开浏览器,访问官网:
https://visualstudio.microsoft.com/zh-hans/ - 点击 “下载 Visual Studio” 按钮
- 选择 “Community 2022”(社区版,免费)
7.1.2 安装步骤
-
运行安装程序
- 双击下载的
VisualStudioSetup.exe - 等待安装程序初始化完成
- 双击下载的
-
选择工作负载
- 勾选 “使用 C++ 的桌面开发”
- 右侧确认以下组件已被勾选:
- ✅ MSVC v143 - VS 2022 C++ x64/x86 生成工具
- ✅ Windows 11 SDK(或 Windows 10 SDK)
- ✅ C++ CMake 工具
- ✅ C++ ATL(可选)
- ✅ IntelliCode
-
选择安装位置
- 可修改安装路径(建议安装到 SSD 磁盘)
- 安装需要约 8~15 GB 空间
-
开始安装
- 点击 “安装” 按钮
- 等待下载和安装完成(约 20~40 分钟,取决于网速)
- 安装完成后可能提示重启
-
首次启动配置
- 登录 Microsoft 账号(可跳过)
- 选择开发设置:“Visual C++”
- 选择颜色主题(深色/浅色)
7.1.3 创建第一个项目
- 点击 “创建新项目”
- 选择 “控制台应用”(语言:C++,平台:Windows)
- 输入项目名称(如
HelloWorld),选择保存位置 - 点击 “创建”
- 在生成的
HelloWorld.cpp中编写代码:
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World!" << endl;
return 0;
}
- 按 Ctrl + F5(开始执行不调试)运行程序
7.2 方案二:VS Code + MinGW-w64(推荐,跨平台轻量方案)
7.2.1 安装 MinGW-w64(GCC 编译器,Windows 平台)
方法 A:通过 MSYS2 安装(推荐)
-
下载 MSYS2
- 访问:
https://www.msys2.org/ - 下载安装程序
msys2-x86_64-xxxxxx.exe
- 访问:
-
安装 MSYS2
- 运行安装程序,选择安装目录(如
C:\msys64) - 完成后勾选"立即运行 MSYS2",点击完成
- 运行安装程序,选择安装目录(如
-
安装 MinGW-w64 工具链
- 在打开的 MSYS2 UCRT64 终端中输入:
# 更新包数据库 pacman -Syu # (可能提示关闭窗口,关闭后重新打开 MSYS2 UCRT64 终端继续) # 安装 MinGW-w64 GCC 工具链 pacman -S mingw-w64-ucrt-x86_64-gcc- 输入
Y确认安装
-
配置环境变量
- 按
Win + S搜索 “环境变量” - 点击 “编辑系统环境变量”
- 点击 “环境变量” 按钮
- 在 “系统变量” 中找到
Path,双击编辑 - 点击 “新建”,添加:
C:\msys64\ucrt64\bin - 一路点击"确定"保存
- 按
-
验证安装
- 打开 新的 命令提示符或 PowerShell:
g++ --version- 显示类似
g++ (Rev1, Built by MSYS2 project) 14.x.x即为成功
7.2.2 安装 VS Code
-
下载 VS Code
- 访问:
https://code.visualstudio.com/ - 下载 Windows 版(.exe 安装程序)
- 访问:
-
安装 VS Code
- 运行安装程序
- 勾选以下选项:
- ✅ 将"通过 Code 打开"操作添加到文件上下文菜单
- ✅ 将"通过 Code 打开"操作添加到目录上下文菜单
- ✅ 将 Code 注册为受支持的文件类型的编辑器
- ✅ 将 Code 添加到 PATH
- 完成安装
-
安装 C/C++ 扩展
- 打开 VS Code
- 按
Ctrl + Shift + X打开扩展面板 - 搜索并安装以下扩展:
- C/C++(Microsoft 出品,提供 IntelliSense、调试支持)
- Code Runner(可选,一键运行代码)
- Chinese (Simplified) Language Pack(可选,中文语言包)
7.2.3 配置 VS Code 的 C++ 开发环境
-
创建工作文件夹
mkdir D:\cpp_projects cd D:\cpp_projects code . -
创建源文件
- 在 VS Code 中新建
main.cpp
- 在 VS Code 中新建
-
配置 tasks.json(编译任务)
- 按
Ctrl + Shift + P,输入Tasks: Configure Task - 选择
Create tasks.json file from template - 选择
Others - 将内容替换为:
{ "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "g++", "args": [ "-g", "-std=c++17", "-Wall", "-Wextra", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe" ], "group": { "kind": "build", "isDefault": true }, "problemMatcher": ["$gcc"] } ] } - 按
-
配置 launch.json(调试配置)
- 按
Ctrl + Shift + P,输入Debug: Open launch.json - 选择
C++ (GDB/LLDB) - 将内容替换为:
{ "version": "0.2.0", "configurations": [ { "name": "Debug C++", "type": "cppdbg", "request": "launch", "program": "${fileDirname}\\${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "build" } ] } - 按
-
编写并运行
- 编写 Hello World 程序
- 按
Ctrl + F5运行,或按F5调试
7.3 方案三:MinGW-w64(独立安装方式,Windows)
7.3.1 下载
- 访问:
https://github.com/niXman/mingw-builds-binaries/releases - 下载适合的版本(如
x86_64-13.2.0-release-posix-seh-ucrt-rt_v11-rev1.7z)
7.3.2 安装
-
将下载的压缩包解压到无中文路径的目录(如
C:\mingw64) -
配置环境变量:
- 将
C:\mingw64\bin添加到系统Path变量中
- 将
-
验证安装:
g++ --version
7.4 方案四:GCC(Linux 平台)
7.4.1 Ubuntu / Debian
# 更新包管理器
sudo apt update
# 安装 build-essential(包含 g++、make 等)
sudo apt install build-essential
# 验证安装
g++ --version
# 可选:安装 GDB 调试器
sudo apt install gdb
# 可选:安装最新版 GCC(如 GCC 13)
sudo apt install software-properties-common
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install g++-13
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100
7.4.2 Fedora / CentOS / RHEL
# Fedora
sudo dnf install gcc-c++ make
# CentOS / RHEL
sudo yum install gcc-c++ make
# 验证
g++ --version
7.4.3 Arch Linux
sudo pacman -S gcc
g++ --version
7.5 方案五:Clang/LLVM(macOS 平台)
7.5.1 macOS 安装
# 安装 Xcode Command Line Tools(包含 Clang 编译器)
xcode-select --install
# 验证
clang++ --version
# 可选:通过 Homebrew 安装最新版 LLVM
brew install llvm
# 添加到 PATH
echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
7.5.2 Ubuntu 安装 Clang
sudo apt update
sudo apt install clang
clang++ --version
7.6 方案六:Code::Blocks(跨平台免费 IDE)
7.6.1 下载与安装
- 访问:
http://www.codeblocks.org/downloads/ - 下载带 MinGW 的版本(如
codeblocks-20.03mingw-setup.exe) - 运行安装程序:
- 选择安装组件:确保勾选 MinGW Compiler
- 选择安装目录
- 完成安装
7.6.2 配置与使用
- 打开 Code::Blocks
- 菜单 →
File→New→Project→Console application - 选择语言:C++
- 输入项目名称和保存位置
- 编写代码,按 F9 编译运行
7.7 方案七:Dev-C++(Windows 轻量级 IDE)
7.7.1 下载与安装
- 访问:
https://sourceforge.net/projects/orwelldevcpp/ - 下载最新版本安装程序
- 运行安装程序:
- 选择语言(Chinese Simplified)
- 选择安装目录
- 完成安装
7.7.2 使用
- 打开 Dev-C++
文件→新建→源代码- 编写代码
运行→编译运行(或按F11)
八、第一个 Hello World 入门程序
8.1 Hello World 程序代码
#include <iostream> // 预处理指令:包含输入输出流头文件
int main() { // 主函数,程序入口
std::cout << "Hello, World!" << std::endl; // 输出字符串
return 0; // 返回 0 表示程序正常退出
}
8.2 逐行详解
| 行 | 代码 | 作用 |
|---|---|---|
| 1 | #include <iostream> | 预处理指令,将 iostream 头文件内容插入源代码,提供输入输出功能 |
| 2 | (空行) | 提高可读性 |
| 3 | int main() | 主函数声明,int 表示返回整数类型,() 内可无参数 |
| 4 | { | 函数体开始 |
| 5 | std::cout << "Hello, World!" << std::endl; | 使用标准输出流打印字符串,endl 换行并刷新缓冲区 |
| 6 | return 0; | 返回 0 给操作系统,表示程序成功执行 |
| 7 | } | 函数体结束 |
8.3 关键概念解析
#include 预处理指令
#include <iostream>:包含标准输入输出流头文件< >表示在系统目录中查找头文件" "表示在当前项目目录中查找头文件
main() 函数
- 每个 C++ 程序必须有且仅有一个
main()函数 main()是程序的入口点,操作系统调用它来启动程序- 返回类型为
int,返回0通常表示成功
std::cout 和 std::endl
std::cout:标准输出流对象(console output)<<:插入运算符,将右侧内容发送到左侧的流std::endl:输出换行符并刷新缓冲区std:::命名空间限定符,cout和endl在std命名空间中
return 0;
- 向操作系统返回状态码
0 0表示程序正常结束- 非零值通常表示异常或错误
8.4 使用 using namespace std 的简化写法
#include <iostream>
using namespace std; // 引入 std 命名空间(不推荐在大型项目中使用)
int main() {
cout << "Hello, World!" << endl; // 不需要写 std::
return 0;
}
更推荐的写法(按需引入):
#include <iostream>
using std::cout; // 只引入需要的名称
using std::endl;
int main() {
cout << "Hello, World!" << endl;
return 0;
}
8.5 编译和运行 Hello World
# 使用 g++ 编译
g++ main.cpp -o hello
# 运行(Linux / macOS)
./hello
# 运行(Windows)
hello.exe
# 输出
Hello, World!
8.6 多文件编译示例
// ===== hello.h(头文件) =====
#ifndef HELLO_H
#define HELLO_H
void sayHello();
#endif
// ===== hello.cpp(实现文件) =====
#include <iostream>
#include "hello.h"
void sayHello() {
std::cout << "Hello, World!" << std::endl;
}
// ===== main.cpp(主文件) =====
#include "hello.h"
int main() {
sayHello();
return 0;
}
# 编译多个源文件
g++ main.cpp hello.cpp -o hello
# 运行
./hello
九、常见问题与排错
9.1 编译错误速查
| 错误信息 | 原因 | 解决方法 |
|---|---|---|
'g++' is not recognized | 未安装 GCC 或未配置 PATH 环境变量 | 安装 MinGW-w64 并配置 PATH |
fatal error: iostream: No such file | 编译器安装不完整 | 重新安装完整的 C++ 工具链 |
error: expected ';' before | 缺少分号 | 检查上一行末尾是否缺少 ; |
error: 'cout' is not a member of 'std' | 未包含 iostream 头文件 | 添加 #include <iostream> |
undefined reference to 'main' | 缺少 main 函数 | 确保有 int main() 函数 |
warning: unused variable 'x' | 变量声明但未使用 | 删除未使用的变量或使用它 |
9.2 调试技巧
#include <iostream>
using namespace std;
int main() {
int x = 10;
// 方法1:使用 cout 输出调试信息
cout << "Debug: x = " << x << endl;
// 方法2:使用 assert 宏
#include <cassert>
assert(x > 0); // 如果 x <= 0 则程序终止并报错
// 方法3:使用条件编译
#ifdef DEBUG
cout << "Debug mode: x = " << x << endl;
#endif
return 0;
}
十、总结
本章核心知识点清单
| 编号 | 知识点 | 重要程度 |
|---|---|---|
| 1 | C++ 支持的四种编程范式 | ★★★☆☆ |
| 2 | C 语言的历史和结构化编程原理 | ★★★☆☆ |
| 3 | OOP 的四大特性:封装、继承、多态、抽象 | ★★★★★ |
| 4 | 泛型编程和模板的基本概念 | ★★★★☆ |
| 5 | C++ 标准演进(C++98 → C++11 → C++20) | ★★★☆☆ |
| 6 | C++11 核心新特性(auto、lambda、智能指针等) | ★★★★★ |
| 7 | 编译链接的完整流程(预处理→编译→汇编→链接) | ★★★★☆ |
| 8 | 至少熟练使用一种开发工具 | ★★★★★ |
| 9 | Hello World 程序的每一行含义 | ★★★★☆ |
| 10 | #include、main()、cout、return 0 的作用 | ★★★★★ |
学习建议
- 动手实践:每学一个知识点,立即编写代码验证
- 理解编译过程:知道代码从源文件到可执行文件经历了什么
- 养成好习惯:代码缩进规范、注释清晰、变量命名有意义
- 逐步进阶:先掌握基础语法,再学习面向对象和泛型编程
- 善用文档:查阅 cppreference.com 获取权威参考
&spm=1001.2101.3001.5002&articleId=166010250&d=1&t=3&u=75a6f1c65ed7490285fd603eef8036a8)
476

被折叠的 条评论
为什么被折叠?



