@Author:Runsen
任何C++程序都有声明namespace,比如下面的C++程序没有声明namespace
int main() { int value; value = 0; double value; value = 0.0; }
编译器错误:'value' 先前声明为 'int value'
在每个作用域中,一个名称只能代表一个实体。因此,在同一个作用域中不能有两个同名的变量。使用命名空间namespace,我们可以创建两个具有相同名称的变量或成员函数。
#include <iostream> using namespace std; // Variable created inside first namespace namespace first { int val = 500; } // Global variable int val = 100; int main() { // Local variable int val = 200; // operator :: cout << val << '\n'; // 200 cout << first::val << '\n'; // 500 return 0; }
命名空间允许我们将具有全局作用域的命名实体分组为更窄的作用域,赋予它们命名空间作用域。这允许将程序的元素组织到由名称引用的不同逻辑范围中。
命名空间namespace是 C++ 中添加的一项功能,C 中不存在。
命名空间是一个声明性区域,为其中的标识符(类型、函数、变量等的名称)提供范围。
允许多个具有相同名称的命名空间块。这些块中的所有声明都在命名范围内声明。
命名空间定义以关键字命名空间开头,后跟命名空间名称,如下所示:
namespace namespace_name { int x, y; }
#include <iostream> using namespace std; namespace ns1 { int value() { return 5; } } namespace ns2 { const double x = 100; double value() { return 2*x; } } int main() { cout << ns1::value() << '\n'; //5 cout << ns2::value() << '\n'; //200 cout << ns2::x << '\n'; //100 return 0; }
在类中,创建命名空间:
以下是在命名空间中创建类的简单方法
#include <iostream> using namespace std; namespace ns { class geek { public: void display() { cout << "ns::geek::display()\n"; } }; } int main() { ns::geek obj; obj.display(); return 0; }
在 C++ 中,有两种访问命名空间变量和函数的方法。
正常方式
#include <iostream> using namespace std; namespace geek { int rel = 300; } int main() { cout << geek::rel << "\n"; // prints 300 return 0;
“using ”指令
#include <iostream> using namespace std; namespace geek { int rel = 300; } // use of ‘using’ directive using namespace geek; int main() { cout << rel << "\n"; //prints 300 return 0; }
在头文件中使用命名空间
我们可以在一个文件中创建命名空间并使用另一个程序访问内容。这是通过以下方式完成的。
// file1.h namespace foo { int value() { return 5; } } // file2.cpp - #include <iostream> #include “file1.h” // Including file1 using namespace std; int main () { cout << foo::value(); return 0; }
在这里我们可以看到命名空间是在file1.h
中创建的,并且在file2.cpp
中调用了该命名空间的value()
方法。
在 C++ 中,命名空间也可以嵌套,即一个命名空间嵌套在另一个命名空间中。命名空间变量的解析是分层的。
#include <iostream> using namespace std; // Nested namespace namespace out { int val = 5; namespace in { int val2 = val; } } // Driver code int main() { cout << out::in::val2; // prints 5 return 0; }
在 C++ 中,可以为命名空间名称使用别名,以方便使用。现有命名空间可以使用新名称作为别名,具体示例如下:
#include <iostream> namespace name1 { namespace name2 { namespace name3 { int var = 42; } } } // Aliasing namespace alias = name1::name2::name3; int main() { std::cout << alias::var << '\n'; }