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

C++ 核心基础概念梳理:命名空间、引用与重载

综述由AI生成C++ 基础涵盖了命名空间解决冲突、标准输入输出流操作、缺省参数规则、函数重载机制、引用与指针区别、const 引用特性、宏与内联函数对比以及 nullptr 空指针表示。重点在于理解作用域查找、内存别名及类型安全,为后续面向对象编程打下坚实基础。

DevStack发布于 2026/3/29更新于 2026/6/824 浏览
C++ 核心基础概念梳理:命名空间、引用与重载

C++ 核心基础概念梳理

C++ 兼容 C 语言,因此可以在 C++ 环境下编写 C 代码。 C++ 之父:本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)

一、命名空间

在 C++ 中,我们常遇到标识符冲突的问题。比如 stdlib.h 中有 rand 函数,如果我们定义同名的变量,编译器可能会报错。

#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main() {
    printf("%d\n", rand); // 全局变量 rand 与 stdlib.h 中的 rand 函数冲突,编译报错
}

但如果 rand 是局部变量,则不会冲突:

#include<stdio.h>
#include<stdlib.h>
int main() {
    int rand = 10;
    printf("%d\n", rand); // 局部变量优先,执行成功
}

1. 标识符查找规则

编译器查找标识符时,遵循从内向外的作用域查找原则。一旦在当前作用域找到匹配项,就不会继续向外层查找。

2. 命名空间的概念

为了解决同一作用域下的命名冲突,C++ 引入了命名空间(Namespace)。你可以把它理解为一个自定义的'域',用来存放标识符。

  • 语法:
    namespace 命名空间名 {
        // 自定义的标识符
    }
    
  • 访问方式:使用 命名空间名::标识符。

示例:

#include<stdio.h>
#include<stdlib.h>
namespace mycode {
    int rand = 10;
}
int main() {
    printf("%d\n", mycode::rand); // 正常打印出 10
}

3. 命名空间的嵌套

当父域下仍有冲突时,可以使用嵌套命名空间来进一步隔离。

#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
}

4. 命名空间的使用技巧

除了显式指定,还有两种常用方式简化访问:

  1. 展开某个成员:只引入特定标识符。
    using name::a;
    
  2. 展开整个命名空间:一次性引入所有成员。
    using namespace name;
    

注意:多个文件中可以定义同名命名空间,编译器会自动将它们合并。标准库都存放在 std 命名空间中。

二、C++ 的输入输出

C++ 推荐使用 <iostream> 头文件进行控制台输入输出,它提供了 cin、cout 以及流操作符。

1. cin 和 cout

  • std::cin:控制台输入(Console Input)。
  • std::cout:控制台输出(Console Output)。

由于它们位于 std 命名空间,使用前需加上 std:: 或使用 using namespace std;。

2. 流操作符

  • <<:流插入运算符,配合 cout 使用。
  • >>:流提取运算符,配合 cin 使用。

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

#include<iostream>
using namespace std;
int main() {
    cout << "Hello World" << endl;
    cout << "学习 C++ 很有趣" << endl << "加油!" << endl;
}
#include<iostream>
using namespace std;
int main() {
    int a, b;
    cout << "请输入两个整数:";
    cin >> a >> b;
    cout << "两个数之和为:" << a + b << endl;
}

3. endl

endl 表示换行并刷新缓冲区。

三、缺省参数

定义函数时,可以为参数指定默认值。调用时若不传该参数,则使用默认值;若传入,则覆盖默认值。

1. 全缺省与半缺省

  • 全缺省:所有参数都有默认值。
  • 半缺省:部分参数有默认值。关键规则:缺省值必须从右向左连续设置。调用时必须先传完没有缺省值的参数。
#include<iostream>
using namespace std;
void Print(int a, int b = 1, int c = 2) {
    cout << a << "," << b << "," << c << endl;
}
int main() {
    Print(0);     // 打印 0,1,2
    Print(6, 6);  // 打印 6,6,2
    Print(5, 5, 5); // 打印 5,5,5
}

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

四、函数重载

在同一作用域内,允许存在多个同名函数,但它们的参数列表必须不同(个数、类型或顺序不同)。

#include<iostream>
using namespace std;
// 参数个数不同
int Add(int a, int b, int c) { return a + b + c; }
int Add(int a, int b) { return a + b; }

// 参数类型不同
double Calc(int a, double b) { return a + b; }
double Calc(double a, int b) { return a - b; }

int main() {
    cout << Add(1, 1, 1) << endl; // 调用三参数版本
    cout << Add(1, 1) << endl;    // 调用两参数版本
    cout << Calc(2, 2.2) << endl; // 第一个参数是 int
    cout << Calc(2.2, 2) << endl; // 第一个参数是 double
}

五、引用(Reference)

引用是给已有变量起的一个别名,直接操作原内存地址,不产生额外拷贝。

1. 基本语法

类型& 引用别名 = 引用对象;

2. 引用 vs 指针

特性引用指针
初始化必须初始化建议初始化
绑定后不可更改指向可重新赋值
空值不存在空引用可为 nullptr
大小取决于对象取决于系统位数

3. 引用要求

  • 初始化:定义时必须绑定有效对象。
  • 别名唯一性:同一作用域下,引用名不能与原变量名相同。
  • 多引用:一个变量可以有多个引用,修改任一引用都会影响原变量及其他引用。
#include<iostream>
using namespace std;
int main() {
    int a = 2;
    int& b = a;
    int& c = a;
    c++; // 修改 c,a 和 b 也会变
    cout << a << "," << b << "," << c << endl;
}

六、const 引用

被 const 修饰的引用称为常量引用。它限制了通过引用修改变量的权限,常用于保护数据不被意外修改。

1. 权限控制

  • 原变量可读可写,const 引用后变为只读。
  • 原变量只读,const 引用后仍只读。
  • 禁止权限放大:不能用普通引用绑定 const 变量。

2. 修饰临时变量

普通引用不能绑定临时变量(如字面量),因为临时变量生命周期短且不安全。但 const 引用 可以延长临时变量的生命周期,直到引用销毁为止。

int main() {
    const int& ra = 20; // 安全,延长了字面量 20 的生命周期
    // int& rra = 20;   // 错误,权限放大
}

七、宏与内联函数

1. 宏(Macro)

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

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

缺点:无类型检查,易受优先级影响,无法调试。

2. 内联函数(Inline Function)

inline 关键字建议编译器将函数体展开到调用处,避免栈帧开销,提高效率。

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

对比:

  • 内联函数是真正的函数,支持类型检查和调试。
  • 宏是文本替换,编译器无法拒绝宏替换。

八、nullptr

C++11 引入了 nullptr 关键字表示空指针。

为什么需要 nullptr?

在 C++ 中,NULL 通常定义为 0。在函数重载场景下,Print(NULL) 可能无法区分是指针还是整型,导致歧义。

#include<iostream>
using namespace std;
void Print(int* x) { cout << "int*" << endl; }
void Print(int x) { cout << "int" << endl; }

int main() {
    Print(NULL);    // 可能被解析为 int
    Print(nullptr); // 明确解析为 int*
}

使用 nullptr 可以避免这种二义性,提升代码安全性。

目录

  1. C++ 核心基础概念梳理
  2. 一、命名空间
  3. 1. 标识符查找规则
  4. 2. 命名空间的概念
  5. 3. 命名空间的嵌套
  6. 4. 命名空间的使用技巧
  7. 二、C++ 的输入输出
  8. 1. cin 和 cout
  9. 2. 流操作符
  10. 3. endl
  11. 三、缺省参数
  12. 1. 全缺省与半缺省
  13. 四、函数重载
  14. 五、引用(Reference)
  15. 1. 基本语法
  16. 2. 引用 vs 指针
  17. 3. 引用要求
  18. 六、const 引用
  19. 1. 权限控制
  20. 2. 修饰临时变量
  21. 七、宏与内联函数
  22. 1. 宏(Macro)
  23. 2. 内联函数(Inline Function)
  24. 八、nullptr
  25. 为什么需要 nullptr?
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 自然语言处理在社交媒体分析中的应用与实战
  • Stable Diffusion WebUI终极指南:7步快速掌握AI图像生成
  • A2UI 技术原理:AI Agent 如何安全生成富交互 UI
  • 腾讯云轻量应用服务器部署 OpenClaw 接入 QQ 飞书指南
  • Java 单例模式与线程安全实现
  • 2024 年主流大模型开源工具与框架精选
  • C++ 特殊类设计:拷贝控制、内存分配与单例模式
  • 从 Webhook 到 OpenClaw:钉钉周报提醒机器人进化史
  • A2UI 技术原理深度解析:AI Agent 如何安全生成富交互 UI
  • Windows 11 下 Java 17 升级至 Java 21 操作指南
  • 女兽医转行互联网后端与 AI 大模型的职业经历复盘
  • 使用 OpenClaw 与飞书搭建专属 AI 机器人
  • FPGA 实现 IIC 通信原理与 Verilog 代码详解
  • Qwen 3.5 MoE 本地部署指南:Ollama 快速运行与 API 调用
  • 现代移动应用开发:Flutter 框架优势与学习指南
  • 物联网数据采集与可视化:使用 Python 和 MQTT 构建实时监控系统
  • 从零开始学 AI 绘画:麦橘超然部署与实战指南
  • Office 365 Copilot:智能文档生成与邮件撰写
  • 宇树 G1 人形机器人 VR 遥操作及 LeRobot 集成开发指南
  • 零样本分类 WebUI 操作指南与结果可视化

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • 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