虽然很多程序员都熟悉名字空间的概念,但他们常常都是被动地使用名字空间。也就是说他们使用的是第三方定义的成员(如标准库的类和函数),而不是在名字空间中声明自己的类和函数。本文拟讨论如何在名字空间中声明自己的类和函数,以及如何在程序中使用它们。
名字空间是一个范畴,它包含类声明,函数声明,常量声明和模板声明等名字空间成员。例如:
namespace proj_alpha
{
//下面是名字空间 proj_alpha 的成员
class Spy {/*..*/};
void encrypt (char *msg);
const int MAX_SPIES = 8;
}
在上面的例子中,类Spy在一个单独的文件中实现。通常,你是在一个专门的头文件中声明一个类并在不同的源文件中独立地定义其成员函数。那么如何将名字空间成员类分离成多个源文件呢?
下面是名为 Foo.hpp 的头文件,其中定义了一个名为NS的名字空间,它包含类Foo的声明:
//Foo.hpp
namespace NS
{
class Foo
{
public:
void f();
void g();
};
}//close NS
另外,在一个单独的源文件Foo.cpp中,首先包含头文件Foo.hpp以便实现类Foo的成员函数f()和g():
//Foo.cpp
#include "Foo.hpp"
void NS::Foo::f()
{ /*..*/ }
void NS::Foo::g()
{ /*..*/ }
为了使用名字空间成员,必须使用成员的全路径名,它由名字空间后跟::合成原名组成。因此,类Foo的全路径名是NS::Foo。这样编译器便可以知道NS是一个名字空间名,头文件Foo.hpp必须在引用NS之前被包含。
名字空间是可以扩展的。也就是说可以声明类,而且所声明的类在其它的.cpp文件中是相同的名字空间成员:
//Bar.hpp
namespace NS //扩展 NS
{
class Bar
{
public:
void a();
void b();
};
}
在Bar.cpp文件中:
#include "Bar.hpp"
void NS::Bar::a()
{/*..*/}
void NS::Bar::b()
{/*..*/}
可以看出,虽然Foo和Bar这两个类在不同的头文件中声明,但它们都是名字空间NS的成员。并且编译器和链接器将这两个类看成是同一名字空间的成员。那么,如何在应用程序中使用这些类呢?
在文件main.cpp中,必须要包含声明类Foo和Bar的头文件并加上相应的名字空间引用声明-using:
#include "Bar.hpp"
#include "Foo.hpp"
int main()
{
using NS::Bar; //使用名字空间
using NS::Foo; //同上
Bar b;
Foo f;
f.f();
//...
}
using声明由关键字using后跟名字空间成员的全路径。这样就使你在using声明范围内使用成员时不用再加路径。上面的例子中,可以直接使用Foo和Bar,因为在main()的开始使用了using声明。如果没有using声明就必须使用全路径成员名。
int main()
{
NS::Bar b; //全路径名
NS::Foo f; //同上
//?
}
另外,还有一种引用名字空间成员的方法是使用using指令:
#include "Bar.hpp"
#include "Foo.hpp"
int main()
{
using namespace NS; // using 指令
Bar b;
Foo f;
f.f();
//...
}
using指令由关键字“using namespace”后跟名字空间名构成。在访问名字空间成员时它是使用最少的一种方法,原因是这种方法将所有名字空间成员注入当前的范围,从而增加了潜在的名字冲突。 <
- 浏览: 108902 次
- 性别:
- 来自: 北京
相关推荐
C++命名空间理解及小结,命名空间的使用方法。
### C++ 命名空间详解 #### 一、命名空间概述 在C++中,命名空间(`namespace`)是一种用于组织标识符的方式,它能够有效地解决标识符的命名冲突问题。C++标准库中的所有标识符均被定义在一个名为`std`的命名空间...
标题提到的"C++命名空间"主要涉及到以下知识点: 1. **命名空间的作用**:命名空间的主要目的是解决标识符的可见性和重名问题。通过将相关的函数、类和变量分组到一个命名空间内,可以确保每个标识符在其自身的命名...
### C++:C++命名空间与预处理器教程 #### 一、C++命名空间 **1.1 命名空间的概念与作用** 在C++编程语言中,命名空间(Namespace)是一种重要的机制,用于组织和封装代码。它主要用于解决全局命名冲突的问题,...
本教程将深入探讨C++命名空间的自定义与使用,并提供一个完整的程序示例。 首先,让我们理解什么是命名空间。命名空间是C++的一个特性,它为标识符创建了一个独立的作用域,使得相同的标识符可以在不同的命名空间中...
超详细讲C++命名空间
C++ 命名空间实例讲解 C++ 命名空间是 C++ 编程语言中的一种机制,用于解决函数、类、变量等命名冲突的问题。它可以作为附加信息来区分不同库中相同名称的函数、类、变量等。 定义命名空间的语法使用关键字 ...
在C++编程语言中,命名空间(namespace)是一种组织代码的方式,它可以帮助避免全局作用域中的名字冲突。本文将深入探讨C++中的命名空间,并通过C++ Builder的代码实例进行演示。 命名空间的主要目的是隔离作用域,...
在C++编程中,protobuf提供了一种类似C++命名空间的机制,被称为“包”(package),用于组织和管理.proto文件中的消息类型和其他定义,避免了全局命名冲突的问题。 在protobuf中,命名空间主要通过在.proto文件中...
C++的命名空间(namespace)是为了解决标识符命名冲突的问题而引入的关键字,它允许程序员在不同的命名空间中定义相同名称的标识符,而不会互相干扰。在C++标准程序库中,所有的标识符都被定义在一个名为`std`的命名...
在C++编程语言中,命名空间(namespace)是一个重要的概念,它主要用于组织代码,避免标识符之间的命名冲突。C++标准库中的所有函数、类和其他标识符都被定义在一个名为`std`的命名空间内。这使得我们可以明确地知道...
在C++编程中,命名空间(namespace)是一个重要的特性,它的设计目的是为了克服全局命名冲突的问题,使得在大型项目中可以有效地组织代码和避免命名冲突。C++标准库中的大部分内容都位于`std`命名空间内,比如示例中...
### C++命名空间(namespace)详解 #### 命名空间概览 在C++编程语言中,`namespace`(命名空间)是一个关键的概念,用于管理标识符的作用域,避免命名冲突,尤其是在大型项目和库使用场景下。命名空间提供了一种...
C++命名空间5种常见用法实例解析 C++命名空间是一种避免名称冲突的方法,它提供了一种新的作用域,通常用于避免命名冲突。在C++中,命名空间的使用可以带来很多好处,例如模块化应用程序、匿名命名空间、解决枚举...
C++的命名空间是什么?刚开始学习C++,一文清晰明了的分清楚命名空间的概念。后续持续更新自己的C++笔记
C++命名空间是编程语言中一个关键的组织和管理代码的工具,它的主要目标是解决在大型项目中可能出现的命名冲突问题。通过将相关的函数、类、对象等封装到各自的命名空间内,可以确保不同部分的代码使用相同名字时...
C++命名空间(namespace)是C++编程语言中一个重要的特性,它的主要目的是为了帮助解决在大型项目中可能出现的名称冲突问题。当多个模块或库使用相同的标识符时,命名空间提供了一种方法,使得相同名称的标识符可以...
C++NamespaceTool是一个用于的简单 C++ 命名空间重构包。安装可以使用带有安装包选项的来安装C++NamespaceTool 。描述在 C++ 编程中, using namespace std编写被认为是一种不好的做法。 首选方法是在顶部某处显式...