1,命名空间简介
命名空间随标准C++而引入,相当于一个灵活的文件域(全局域),以关键字namespace开头给其起个名字,并用大括号把定义区域括起来(声明块)。
在域外使用域内成员时,需要加上命名空间名作为前缀,再加上域操作符“::”,可以使用嵌套定义。
如果在关键字namespace之前使用using,就不必使用限定修饰名,即可以一次性使命名空间中所有成员都可以直接被使用。
标准C++库中所有组件都在std的命名空间中声明和定义的,在标准C++平台调用如下语句:
using namespace std;
便可直接使用标准C++库中所有成员,注意:如果使用命名空间std,则#include编译预处理命令包含头文件时,必须去掉扩展名(.h)。
2,常见问题分析
2.1 使用标准C++命名空间std时,加载头文件:
错误代码:
#include<iostream.h>
using namespace std;
void main()
{cout<<"Hello,world!"<<endl;getchar();
}
错误 1 error C1083: 无法打开包括文件:“iostream.h”: No such file or directory c:\users\dell\documents\visual studio 2012\projects\project\project\code1.cpp 1 1 Project
分析:
在标准C++命名空间std,<iostream.h>和不同,C++标准明确提出不支持后缀为(.h)的头文件(为了与C区别和正确使用命名空间)。
正确代码:
#include<iostream.h>
using namespace std;
void main()
{cout<<"Hello,world!"<<endl;getchar();
}
2.2 命名冲突:
错误代码:
#include"class1.h"
#include"class2.h"
#include<iostream>
using namespace std;
void main()
{MyClass x;MyClass y;x.Info();y.Info();getchar();
}//class1.h
#include<iostream>
using namespace std;
class MyClass
{
public:void Info(){cout<<"头文件class1.h"<<endl;}
};//class2.h
#include<iostream>
using namespace std;
class MyClass
{
public:void Info(){cout<<"头文件class2.h"<<endl;}
};
错误 1 error C2011: “MyClass”:“class”类型重定义 c:\users\dell\documents\visual studio 2012\projects\project\project\class2.h 4 1 Project
分析:
class1.h和class2.h头文件都定义了类MyClass,导致名字冲突,编译器认为MyClass被重复定义。解决办法之一改动其中一个类名,之二在class1.h和class2.h头文件中都引入namespace。
正确代码:
#include"class1.h"
#include"class2.h"
#include<iostream>
using namespace std;
void main()
{MyNamespace1::MyClass x;MyNamespace2::MyClass y;x.Info();y.Info();getchar();
}//class1.h
#include<iostream>
using namespace std;
namespace MyNamespace1
{
class MyClass
{
public:void Info(){cout<<"头文件class1.h"<<endl;}
};
};//class2.h
#include<iostream>
using namespace std;
namespace MyNamespace2
{
class MyClass
{
public:void Info(){cout<<"头文件class2.h"<<endl;}
};
};