考虑使用以下C++程序。
// A program to demonstrate need of namespace
int main()
{
int value;
value = 0;
double value; // Error here
value = 0.0;
}
输出 :
Compiler Error:
'value' has a previous declaration as 'int value'
在每个范围中,名称只能代表一个实体。因此,在同一范围内不能有两个具有相同名称的变量。使用名称空间,我们可以创建两个具有相同名称的变量或成员函数。
// Here we can see that more than one variables
// are being used without reporting any error.
// That is because they are declared in the
// different namespaces and scopes.
#include
using namespace std;
// Variable created inside namespace
namespace first
{
int val = 500;
}
// Global variable
int val = 100;
int main()
{
// Local variable
int val = 200;
// These variables can be accessed from
// outside the namespace using the scope
// operator ::
cout << first::val << '\n';
return 0;
}
输出:
500
命名空间使我们能够将命名的实体分组,否则它们将具有全局作用域,成为较窄的作用域,从而为它们提供命名空间作用域。这允许将程序的元素组织到名称所指的不同逻辑范围内。
- 命名空间是C++中添加的功能,在C中不存在。
- 命名空间是一个声明性区域,它为其中的标识符(类型的名称,函数,变量等)提供范围。
- 允许使用多个具有相同名称的名称空间块。这些块中的所有声明都在命名范围中声明。
名称空间定义以关键字名称空间开头,后跟名称空间名称,如下所示:
namespace namespace_name
{
int x, y; // code declarations where
// x and y are declared in
// namespace_name's scope
}
- 命名空间声明仅出现在全局范围内。
- 命名空间声明可以嵌套在另一个命名空间中。
- 命名空间声明没有访问说明符。 (公共或私人)
- 命名空间定义的右花括号后无需给出分号。
- 我们可以将命名空间的定义划分为多个单元。
// Creating namespaces
#include
using namespace std;
namespace ns1
{
int value() { return 5; }
}
namespace ns2
{
const double x = 100;
double value() { return 2*x; }
}
int main()
{
// Access value function within ns1
cout << ns1::value() << '\n';
// Access value function within ns2
cout << ns2::value() << '\n';
// Access variable x directly
cout << ns2::x << '\n';
return 0;
}
输出:
5
200
100
以下是在名称空间中创建类的简单方法
// A C++ program to demonstrate use of class
// in a namespace
#include
using namespace std;
namespace ns
{
// A Class in a namespace
class geek
{
public:
void display()
{
cout << "ns::geek::display()\n";
}
};
}
int main()
{
// Creating Object of geek Class
ns::geek obj;
obj.display();
return 0;
}
输出:
ns::geek::display()
也可以使用以下语法在名称空间内部声明类并在名称空间外部定义类
// A C++ program to demonstrate use of class
// in a namespace
#include
using namespace std;
namespace ns
{
// Only declaring class here
class geek;
}
// Defining class outside
class ns::geek
{
public:
void display()
{
cout << "ns::geek::display()\n";
}
};
int main()
{
//Creating Object of geek Class
ns::geek obj;
obj.display();
return 0;
}
输出:
ns::geek::display()
我们也可以在名称空间之外定义方法。以下是示例代码。
// A C++ code to demonstrate that we can define
// methods outside namespace.
#include
using namespace std;
// Creating a namespace
namespace ns
{
void display();
class geek
{
public:
void display();
};
}
// Defining methods of namespace
void ns::geek::display()
{
cout << "ns::geek::display()\n";
}
void ns::display()
{
cout << "ns::display()\n";
}
// Driver code
int main()
{
ns::geek obj;
ns::display();
obj.display();
return 0;
}
输出:
ns::display()
ns::geek::display()
C++中的名称空间|集合2(扩展名称空间和未命名名称空间)
C++中的命名空间|设置3(访问,创建标题,嵌套和别名)
命名空间可以嵌套在C++中吗?
参考:
http://www.cplusplus.com/doc/tutorial/namespaces/
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。