前言
C++ 在 C 上扩展了不少东西,初学时常被命名空间、输入输出、重载这些概念绕晕。这篇笔记梳理几个最基础的特性和背后的思路,方便速查,也适合正在从 C 转 C++ 的朋友。
命名空间:为什么需要它
在 C 程序里,如果你在全局域定义一个 rand 变量,而 <stdlib.h> 中早就有 rand() 函数,链接阶段就会因为符号冲突报错。C++ 用 namespace 来解决这个问题——你可以把它当成一个有名称的代码块,块内的变量、函数和外界同名的东西互不干扰。
定义一个命名空间:
namespace Bucai {
int rand = 10;
int k = 20;
}
里面的成员不能直接访问,需要借助以下三种方式之一。
访问命名空间成员
-
作用域限定符
:::直接指定命名空间。printf("%d\n", Bucai::k); -
using引入单个名称:把某个成员'拉'到当前作用域。using Bucai::k; printf("%d\n", k); -
using namespace整个展开:所有成员暴露。using namespace Bucai; printf("%d\n", k);
第三种方式要小心:如果此时直接写 rand,编译器会提示'不明确的符号',而不是重定义。因为全局的 rand 和命名空间里的 rand 是两个不同的实体,但由于全展开了,产生歧义。
一些细节
- 命名空间内可以放变量、函数、类等任意东西。
- 可以嵌套,比如
namespace Bucai { namespace bbbb { ... } }。 - 同一个工程里允许多个同名的命名空间,编译器会自动合并。
C++ 的输入输出
C 的 printf/scanf 需要手动指定格式,C++ 引入流式 IO,自动识别类型,写起来更顺手。
#include <iostream>
using namespace std;
int {
cout << << endl;
;
}


