C++命名空间解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
很多初学C++的人,对于C++中的一些基本的但又不常用的概念感到模糊,命名空间(name space)就是这样一个概念C++中采用的是单一的全局变量命名空间。在这单一的空间中,如果有两个变量或函数的名字完全相同,就会出现冲突。当然,你也可以使用不同的名字,但有时我们并不知道另一个变量也使用完全相同的名字;有时为了程序的方便,必需使用同一名字。比如你定义了一个变量string user_name, 有可能在你调用的某个库文件或另外的程序代码中也定义了相同名字的变量,这就会出现冲突。命名空间就是为解决C++中的变量、函数的命名冲突而服务的。解决的办法就是将你的strTemp变量定义在一个不同名字的命名空间中。就好像张家有电视机,李家也有同样型号的电视机,但我们能区分清楚,就是因为他们分属不同的家庭。例如:
#include
#include
usingnamespace std;
//using namespace编译指示,使在C++标准类库中定义的名字在本程序中可以使用
//否则,iostream,string 等c++标准类就不可见了,编译就会出错。
//两个在不同命名空间中定义的名字相同的变量
namespace myown1{
string user_name="myown1";
}
namespace myown2{
string user_name="myown2";
}
int main()
{
cout<<""
<<"Hello,"
< <<"... and goodbye!"; cout<<"" <<"Hello," < <<"... and goodbye!"; return0; } 当然,我们也可以使用程序开头的预编译指示来使用命名空间中的名字。使用预编译指示的好处在于在程序中不必显式地使用命名空间限制符来访问变量。以上主程序可修改为: #include #include using namespace std; namespace myown1{ string user_name = "myown1"; } namespace myown2{ string user_name = "myown2"; } int main() { using namespace myown1; cout<< " " << "Hello, " << user_name << "... and goodbye! "; // using namespace myown2; cout<< " " << "Hello, " << myown2::user_name //用命名空间限制符myown2访问变量user_name << "... and goodbye! "; return 0; } 但第二个变量必需用命名空间限制符来访问,因为此时myown1空间中的变量已经可见,如果不加限制,编译器就会无法识别是那一个命名空间中的变量。这一点一定要注意。 以上只是初学者不清楚的一个概念,在以后的文章中还将继续讨论其它的一些概念。 ###################################### 有些书说有些头文件不在std里是什么意思? ###################################### 那些书那样说会造成困惑,因为名字空间,就像函数、 结构、类等等,是用代码来表达的一种语言机制。 std(standard的缩写)是标准C++里必须存在的一个 名字空间的名字。所有实现标准C++的编译器都 必须确保这空间的存在。 名字空间声明是这样表达的: namespace x { // 创建新名字 } x是该名字空间的名字。 头文件装代码,代码表达名字空间。 所以应该说“有些头文件的内容不在std里”。 具体的意思就是,在那些头文件里, 没有任何代码是在“namespace std { }”的括号里的。 ###################################### std里包含些什么? ###################################### std里包含标准C++库里的所有名字(类名、 函数名、...)。 ###################################### 为什么不用std就不能使用cout? ###################################### 不是不能使用,只是不能直接写cout,必需用空间名和名字空间限制符作为前缀,写成std::cout。 用某个名字做名字空间声明的时候,若已有同名的 名字空间存在,就是仅仅把括号里的名字加进去, 否则先创建空间,后加入括号里的名字。 加入名字空间后的名字都是对全局空间隐藏的, 但该名字空间的名字却不隐藏(除非该空间在另一个 名字空间里)。 cout隐藏在std里,但std本身不隐藏,所以 你“#include 使用声明便可直接用std,通过它访问cout。 若你做了使用声明,对该使用声明所处的作用域的隐藏便被抵消(作用域的开端到声明之间的那段除外),