C++编程中的命名空间基本知识讲解编程中的命名空间基本知识讲解
主要介绍了C++编程中的命名空间基本知识讲解,包括对C++11中内联命名空间新特性的介绍,需要的朋友可以参
考下
命名空间是一个声明性区域,为其内部的标识符(类型、函数和变量等的名称)提供一个范围。命名空间用于将代码组织到逻
辑组中,还可用于避免名称冲突,尤其是在基本代码包括多个库时。命名空间范围内的所有标识符彼此可见,而没有任何限
制。命名空间之外的标识符可通过使用每个标识符的完全限定名(例如 std::vector<std::string> vec;)来访问成员,也可通过
单个标识符的 using 声明 (using std::string) 或命名空间中所有标识符的 using 指令 (C++) (using namespace std;) 来访问成
员。头文件中的代码应始终使用完全限定的命名空间名称。
下面的示例演示了一个命名空间声明和命名空间之外的代码可访问其成员的三种方法。
namespace ContosoData
{
class ObjectManager
{
public:
void DoSomething() {}
};
void Func(ObjectManager) {}
}
使用完全限定名:
ContosoData::ObjectManager mgr;
mgr.DoSomething();
ContosoData::Func(mgr);
使用 using 声明,以将一个标识符引入范围:
using WidgetsUnlimited::ObjectManager;
ObjectManager mgr;
mgr.DoSomething();
使用 using 指令,以将命名空间中的所有内容引入范围:
using namespace WidgetsUnlimited;
ObjectManager mgr;
mgr.DoSomething();
Func(mgr);
using 指令指令
通过 using 指令,可使用命名空间中的所有名称,而不需要命名空间名称为显式限定符。如果在一个命名空间中使用多个不同
的标识符,则在实现文件中使用 using 指令(即*.cpp);如果仅使用一个或两个标识符,则考虑使用声明,以仅将这些标识
符而不是命名空间中的所有标识符引入范围。如果本地变量的名称与命名空间变量的名称相同,则隐藏命名空间变量。使命名
空间变量具有与全局变量相同的名称是错误的。
注意注意
using 指令可以放置在 .cpp 文件的顶部(在文件范围内),或放置在类或函数定义内。
一般情况下,避免将 using 指令放置在头文件 (*.h) 中,因为任何包含该标头的文件都会将命名空间中的所有内容引入范围,
这将导致非常难以调试的名称隐藏和名称冲突问题。在头文件中,始终使用完全限定名。如果这些名称太长,可以使用命名空
间别名将其缩短。(请参阅下文。)
声明命名空间和命名空间成员声明命名空间和命名空间成员
通常情况下,在头文件中声明一个命名空间。如果函数实现位于一个单独的文件中,则限定函数名称,如本示例所示。
//contosoData.h
#pragma once
namespace ContosoDataServer
{
void Foo();
int Bar();
}
contosodata.cpp 中的函数实现应使用完全限定名,即使将一个 using 指令放置于文件的顶部也是如此:
#include "contosodata.h"
using namespace ContosoDataServer;
void ContosoDataServer::Foo()
{
//no qualification because using directive above
Bar();
}
int ContosoDataServer::Bar(){return 0;}