C++ 命名空间 (namespace)
Posted 我是小白呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 命名空间 (namespace)相关的知识,希望对你有一定的参考价值。
概述
命名空间 (namespace) 可以帮助我们区分不同库中相同名称的函数, 类, 变量等. 使用了命名空间即定义了上下文. 命名空间就是定义了一个范围.
命名空间
为了解决 C++ 标准库中的标识符与程序中的全局标识符之间以及不同库中的所有标识符之间的命名冲突. 标准 C++ 库的所有标识符都定义在一个名为 std 的命名空间中. 在程序中用到 C++ 标准库时, 使用 std 作为限定.
我们在写 “Hello World” 的时候就曾用到过命名空间 (namespace):
命名空间的作用
命名空间是 ANSI C++ 引入可以由用户命名的作用域, 用来处理程序中常见的同名冲突. 在 C++ 程序中, 有大量的变量, 函数和类名. 如果他们都存在于同一个全局命名空间中, 会导致很多冲突.
- 自定义函数与标准库函数重名
- 程序中使用的名字与第三方库中名称相同
- 同一项目不同模块中名字的冲突
命名空间的机制, 对于声明于其中的名称都进行了本地化:
- 相同的名称可以在不同的上下文中使用, 而不会引起名称的冲突
- C++ 中的标准库被定义到 std 命名空间中, 减少了与用户自定义名称的冲突
- 在自己的程序中创建自己的命名空间, 避免本地化名称与外界冲突
自定义命名空间
我们可以自己定义命名空间. 我们把一些全局分别放在各个名字空间, 从而与其他全局实体分隔开来.
格式:
namespace 命名空间名 {
声明;
}
- 变量 (可以带有初始化) 及常量
- 函数 (可以是定义或声明)
- 结构体
- 类
- 模板
- 命名空间 (在一个命名空间中又定义一个命名空间, 即嵌套的命名空间)
命名空间的作用是建立一些互相分隔的作用域. 把一些全局实体分隔开来, 以免产生名字冲突.
命名空间成员的方法
一般方法: 引用命名空间成员时, 用命名空间名对名命名空间成员进行限定, 以区别同名标识符. (命名空间::命名空间成员名)
简化使用命名空间成员的机制:
- 使用命名空间别名: namespace TV = Television; // TV等同Television
- 使用格式: using 命名空间成员名 using ns1::Student; // Student等同ns1::Student
- 使用: using namespace 命名空间名
案例
h1.h:
#ifndef PROJECT8_H1_H
#define PROJECT8_H1_H
namespace kitchen {
class Table {
private:
int legs;
int price;
public:
Table(int l, int p){
legs = l;
price = p;
}
};
}
#endif //PROJECT8_H1_H
h2.h:
#ifndef PROJECT8_H2_H
#define PROJECT8_H2_H
namespace office {
class Table {
private:
int rows;
int cols;
public:
Table(int r, int c){
rows = r;
cols = c;
}
};
}
#endif //PROJECT8_H2_H
mian.cpp:
#include <iostream>
#include "h1.h"
#include "h2.h"
using namespace std;
int main() {
kitchen::Table t1(6, 300);
office::Table t2(6, 2);
return 0;
}
以上是关于C++ 命名空间 (namespace)的主要内容,如果未能解决你的问题,请参考以下文章