C++ 命名空间

欢迎访问我的博客首页


1. 定义命名空间


  定义命名空间的方式是 namespace 命名空间名{};,大括号后面的分号可有可无。下面定义一个名称为 n1 的命名空间。

namespace n1 {
};

2. 命名空间作用域


  在命名空间内部可以直接访问该命名空间中的成员(子命名空间、变量、函数等),也可以加上该命名空间。

namespace n1 {
	std::string x = "n1";
	void print1() { std::cout << x << std::endl; }
	void print2() { std::cout << n1::x << std::endl; }
};

  命名空间由内向外匹配,且只匹配一次。比如,在 n1::n2 中访问 n2::x,会从 n1::n2 中找 x,找不到则报错,不会再向更外层查找命名空间 n2。

namespace n2 {
	std::string x = "n2";
}
namespace n1 {
	namespace n2 {
		void print() { std::cout << n2::x << std::endl; }
	}
}

  在内层命名空间中可以直接访问外层命名空间,无须加任何命名空间名,比如,n1::n2::print() 可以输出 “n1”。在外层命名空间中不可直接访问内层命名空间,除非加上内层命名空间名,比如,n1::print1() 输出的是 “n1”,n1::print2() 输出的才是 “n12”。

namespace n1 {
	std::string x = "n1";
	namespace n2 {
		void print() { std::cout << x << std::endl; }
		std::string x = "n12";
	}
	void print1() { std::cout << x << std::endl; }
	void print2() { std::cout << n2::x << std::endl; }
}

  以上三个例子很好理解:把 namespace 换成 class,并把所有成员设置为 public static,则 namespace 和 class 成员的作用域完全一样。

3. 全局命名空间和变量


  使用 ::命名空间名或变量名 访问全局定义的命名空间或变量,即访问最外层的命名空间或变量。

#include <iostream>
#include <string>

std::string x = "n0";

namespace n2 {
	std::string x = "n2";
}

namespace n1 {
	std::string x = "n1";
	namespace n2 {
		std::string x = "n12";
	}
	void print1() { std::cout << n2::x << std::endl; }
	void print2() { std::cout << ::n2::x << std::endl; }
}

int main() {
    std::cout << ::x << std::endl;     // n0
    std::cout << ::n1::x << std::endl; // n1
    n1::print1();                      // n12
    n1::print2();                      // n2
}

4. using 指示与声明


  命名空间限制了其成员的作用范围,因此不同命名空间内名称相同的成员不会冲突。每次使用命名空间的成员都要加上命名空间的名字,可能会显得麻烦,因此可以使用 using 指示与声明。

using namespace std;
using std::cout;

  上面两行代码分别是 using 指示和声明。使用 using 指示了命名空间 std,接下来就能在当前文件中不加 std:: 地使用其所有成员;使用 using 声明了命名空间的成员 std::cout,接下来只能在当前文件中不加 std:: 地使用其 cout 成员。

5. 参考


  1. C++ 命名空间,腾讯云,2021。
### C++ 命名空间的使用方法 #### 什么是命名空间命名空间是一种用于组织代码的方式,它能够防止全局范围内的名字冲突。通过定义不同的命名空间,可以在同一个程序中安全地重用相同的标识符名称。 #### 定义命名空间 可以通过 `namespace` 关键字来创建一个新的命名空间。例如: ```cpp namespace MyNamespace { int value = 42; } ``` 在此例子中,`MyNamespace` 是一个自定义命名空间,其中包含了一个整型变量 `value`[^1]。 #### 访问命名空间中的成员 要访问命名空间中的成员,可以使用作用域解析运算符 `::`。例如: ```cpp #include <iostream> namespace N { int a = 10; } int main() { std::cout << N::a << std::endl; // 输出 10 return 0; } ``` 上述代码展示了如何通过 `N::a` 来访问命名空间 `N` 中的变量 `a`[^2]。 #### 使用 `using` 指令简化访问 当频繁使用某命名空间的内容时,可以利用 `using namespace` 将整个命名空间引入当前作用域。这样就不必每次都显式指定命名空间前缀。例如: ```cpp #include <iostream> using namespace std; int main() { cout << "Hello, world!" << endl; // 不需要写成 std::cout return 0; } ``` 这里通过 `using namespace std;` 的声明省去了每次调用标准库函数或对象时都需要加上 `std::` 的麻烦。 #### 局部导入特定成员 除了将整个命名空间引入外,还可以仅导入某些特定的成员到当前作用域。这有助于减少潜在的名字污染风险。例如: ```cpp #include <iostream> using std::cout; using std::endl; int main() { cout << "Only specific members are imported." << endl; return 0; } ``` 此方式只把 `std::cout` 和 `std::endl` 导入到了当前文件的作用域里。 #### 嵌套命名空间 C++ 支持嵌套命名空间的概念,允许在一个命名空间内部再定义另一个命名空间。这种结构可以帮助进一步分类和管理复杂的项目逻辑。如下所示: ```cpp namespace Outer { int outerValue = 1; namespace Inner { int innerValue = 2; } } int main() { std::cout << Outer::outerValue << ", " << Outer::Inner::innerValue << std::endl; return 0; } ``` 这段代码演示了如何处理多层嵌套的情况以及如何逐级访问这些深层嵌套的对象属性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值