命名空间用namespace关键字定义,不占内存,仅编译期逻辑分组;支持嵌套(c++17前需层层书写,c++17起可用namespace a::b简写);::用于指定作用域,如std::vector、math::add;using math::pi为安全的单名引入,using namespace math易引发冲突,头文件中禁用;匿名命名空间替代static实现内部链接,语义更清晰。
命名空间怎么定义和嵌套
命名空间不是类,不占内存,只是编译期的逻辑分组。用 namespace 关键字加名字即可定义,大括号内写类型、函数、变量等声明或定义:
namespace math {
const double PI = 3.14159;
int add(int a, int b) { return a + b; }
namespace detail {
void helper() {}
}
}
嵌套命名空间在 C++17 前要层层写 namespace A { namespace B { ... } };C++17 起支持简写 namespace A::B,但注意这只是语法糖,底层仍是嵌套结构。
作用域限定符 :: 的三种典型用法
:: 是作用域解析运算符,核心作用是“指明某个名字属于哪个作用域”。常见组合有:
-
std::vector:访问标准库命名空间里的类型 -
math::add(2, 3):调用命名空间内的函数 -
::main:显式访问全局作用域的main(极少用,但可解决局部变量遮蔽)
注意:不能用 :: 访问未声明的名字,也不能跨命名空间直接访问私有成员(命名空间没有访问控制,但类有)。
立即学习“C++免费学习笔记(深入)”;