跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

C++ 核心基础概念梳理

本文梳理了 C++ 的核心基础概念,涵盖命名空间机制以解决标识符冲突,输入输出流 cin/cout 的使用规范,缺省参数的语法规则及限制条件,函数重载的判定依据,引用的本质及其与指针的区别,const 引用对临时变量的保护作用,宏与内联函数的特性对比,以及 nullptr 关键字在空指针处理上的优势。内容侧重于实际编码中的注意事项与底层原理,帮助开发者建立扎实的 C++ 基础认知。

无尘发布于 2026/3/22更新于 2026/9/1273 浏览
C++ 核心基础概念梳理

C++ 核心基础概念梳理

C++ 兼容 C,这意味着你可以在 C++ 环境下编写 C 代码。

C++之父:本贾尼・斯特劳斯特卢普。

一、命名空间

在 C++ 中,标识符(变量、函数、类、常量、命名空间)的查找遵循特定的规则。理解这些规则有助于避免命名冲突。

1. 标识符查找规则

编译器查找标识符时,会从当前最内层的作用域开始查找;一旦找到,就不会再去外层作用域查找。

2. 命名冲突的本质

同一作用域下不能存在同名的标识符。

来看一个例子:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int rand = 10;
    printf("%d\n", rand); // 代码可以正确执行
}

这里 rand 是局部变量,遮蔽了 stdlib.h 中的全局函数 rand。但如果写成全局变量呢?

#include <stdio.h>
#include <stdlib.h>

int rand = 10; // 全局变量

int main() {
    printf("%d\n", rand); // 会编译报错
}

当 rand 是全局变量时,它与 stdlib.h 中的函数名冲突,导致编译错误。这就是为什么我们需要命名空间来隔离不同的标识符。

3. 命名空间的使用

① 概念与语法

命名空间就像是一个自定义的'域',用来存放标识符,解决同一个域下的命名冲突问题。访问时使用 命名空间名::标识符。

namespace mycode {
    int rand = 10;
}

int main() {
    printf("%d\n", mycode::rand); // 正常打印出 10
}
② 命名空间的嵌套

如果父域下仍有冲突,可以使用嵌套命名空间。

#include <stdio.h>

namespace code {
    namespace codeA {
        int a = 10;
    }
    namespace codeB {
        int a = 20;
    }
}

int main() {
    printf("%d\n", code::codeA::a); // 打印 10
    printf("%d\n", code::codeB::a); // 打印 20
}
③ 访问方式
  • 指定访问:使用 :: 运算符。
  • 展开某个成员:使用 using 命名空间名::成员;。
  • 展开全部成员:使用 using namespace 命名空间名;。

注意:在多个文件中使用命名空间时,C++ 允许同一个命名空间被写在不同的文件中,编译器会自动把它们合并成一个。标准库就存放在名为 std 的命名空间中。

二、C++ 的输入输出

1. <iostream> 头文件

这是 Input Output Stream 的缩写,提供了 cin、cout 以及流操作符 <<、>>。

2. std::cin 和 std::cout

由于标准库都在 std 命名空间中,使用前需加上 std:: 前缀,或者使用 using namespace std;。

  • cin (console input):控制台输入。
  • cout (console output):控制台输出。

3. 流操作符

  • <<:流插入运算符,配合 cout 使用。
  • >>:流提取运算符,配合 cin 使用。
#include <iostream>
using namespace std;

int main() {
    cout << "hello world" << endl;
    cout << "Hello C++" << endl << "Welcome" << endl;
}

C++ 能自动识别变量类型,不需要像 C 语言那样手动指定占位符。

4. endl

表示换行并刷新缓冲区。

三、缺省参数

定义函数时,可以给参数指定默认值。调用时如果不传该参数,则使用默认值。

1. 全缺省

所有参数都有默认值。

void Print(int a = 3, int b = 2) {
    cout << a << "," << b << endl;
}
// Print(); // 打印 3,2

2. 半缺省

部分参数有默认值。规定缺省值必须从右向左连续设置。调用时必须传够没有缺省值的参数。

void Print(int a, int b = 1, int c = 2) {
    cout << a << "," << b << "," << c << endl;
}
// Print(0); // 打印 0,1,2

注意:函数声明和定义分离时,缺省参数只能出现在声明部分。

四、函数重载

在同一作用域内,可以存在多个同名函数,但必须满足以下条件之一:

  • 参数个数不同
  • 参数类型不同
  • 参数顺序不同
int Add(int a, int b) { return a + b; }
int Add(int a, int b, int c) { return a + b + c; }

double Calc(int a, double b) { return a + b; }
double Calc(double a, int b) { return a - b; }

五、引用(reference)

1. 基本概念

引用是给已有变量起的一个别名,直接在原内存上操作,不产生副本。

2. 引用 vs 指针

用 Swap 函数对比一下引用和指针的区别:

指针写法:

void Swap(int* a, int* b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
// 调用:Swap(&a, &b);

引用写法:

void Swap(int& a, int& b) {
    int tmp = a;
    a = b;
    b = tmp;
}
// 调用:Swap(a, b);

引用写法更简洁,且避免了野指针的风险。

3. 引用要求

  • 初始化:定义引用时必须初始化。
  • 不可重绑定:引用一旦绑定某个实体,就不能再指向其他对象。
  • 多引用:一个变量可以有多个引用,修改任意一个都会影响原变量。

4. const 引用

被 const 修饰的引用,权限只能不变或变小(只读)。这常用于修饰临时变量,延长其生命周期。

int main() {
    const int& ra = 20; // 安全,临时变量被保护
    // int& rra = 20;  // 不安全,权限放大
}

六、宏

宏是在预处理阶段进行的文本替换,分为无参宏和有参宏。

#define val 18
#define Add(a,b) ((a) + (b))

注意:有参宏建议给参数加括号,避免运算符优先级问题。宏无法调试,且强制替换,不如函数安全。

七、内联函数

被 inline 修饰的函数,编译器会在调用处展开代码,无需建立栈帧,提高效率。

inline int Add(int a, int b) {
    return a + b;
}

区别:内联函数是真正的函数,支持调试,而宏只是文本替换。

八、nullptr

C++11 引入的关键字,用于表示空指针。

void Print(int* x) { cout << "int*" << endl; }
void Print(int x) { cout << "int" << endl; }

int main() {
    Print(NULL);   // 可能误判为 int
    Print(nullptr); // 明确匹配 int*
}

使用 nullptr 可以避免因 NULL 定义为 0 而在函数重载时产生的歧义。

目录

  1. C++ 核心基础概念梳理
  2. 一、命名空间
  3. 1. 标识符查找规则
  4. 2. 命名冲突的本质
  5. 3. 命名空间的使用
  6. ① 概念与语法
  7. ② 命名空间的嵌套
  8. ③ 访问方式
  9. 二、C++ 的输入输出
  10. 1. <iostream> 头文件
  11. 2. std::cin 和 std::cout
  12. 3. 流操作符
  13. 4. endl
  14. 三、缺省参数
  15. 1. 全缺省
  16. 2. 半缺省
  17. 四、函数重载
  18. 五、引用(reference)
  19. 1. 基本概念
  20. 2. 引用 vs 指针
  21. 3. 引用要求
  22. 4. const 引用
  23. 六、宏
  24. 七、内联函数
  25. 八、nullptr

更多推荐文章

查看全部
  • FileSaver.js 前端文件下载实战解析
  • Xilinx SRIO IP 核详解与 FPGA 实现仿真流程
  • STM32 上运行 AI 大模型的四种方案及案例
  • 19 个合法的黑客技术在线练习平台推荐
  • 2025 中国 AI 开源生态报告发布:核心发现与趋势解读
  • 前端文件下载实战:从原理到最佳实践
  • Java String 类详解与常用方法
  • Pi0 机器人 VLA 大模型在昇腾 A2 平台测评
  • 5 款值得收藏的 AI 绘画辅助开源工具
  • Docker 部署 iptvnator 构建家庭 IPTV 媒体中心
  • AI 时代前端设计稿生成实战:三种高效工作流
  • 多模态大模型垂直微调实战:Qwen3-VL-4B-Thinking 与 Llama Factory
  • 互联网大厂 Java 与 Android 开发核心面试题整理
  • 基于 AutoGen 框架构建 AI Agent 实现自动化编程任务
  • Microsoft Edge WebView2 Runtime 快速部署与调试指南
  • Docker 运行 hello-world 镜像失败或超时问题排查
  • Java 最新版本详细安装与配置教程
  • SpringBoot + Vue 前后端分离实战:权限、工作流与报表
  • Flutter 三方库 bavard 的鸿蒙化适配指南:语义化聊天协议与机器人逻辑
  • AI 绘画技术演进:从 DALL·E 系列到 Stable Diffusion 解析

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online