C++ 命名空间是一种用于组织代码的机制,可以帮助避免命名冲突,提高代码的可读性和可维护性。命名空间将代码分组到逻辑单元中,允许在不同的代码单元中使用相同的名称而不会产生冲突。 命名空间通过将代码放置在一个命名空间内部来实现。在 C++ 中,命名空间由关键字 namespace 开始,后面跟着命名空间的名称以及一对大括号,大括号中包含了命名空间内部的代码。
命名空间的使用
首先,在C++项目中进行头文件创建(.h文件)。
接着在头文件中使用namesapce关键字进行命名空间声明,声明格式如下:
#pragma once
#include<iostream>
namespace wve1 {
int print();
}
namespace wve2 {
int print();
}
此时声明了两个命名空间wve1和wve2;且两个命名空间中都含有print()函数,此时我们可以以直接在头文件中定义命名空间中的函数;因为会用到cout输出流,所以我们在头文件中包含iostream头文件。
右击函数名-->选择快速操作和重构-->创建声明/定义
这个时候函数的具体定义会被写入与头文件相同名称的.cpp文件中。
调用wve1中的print()输出“wve1:”;
int wve1::print()
{
std::cout << "wve1:" << std::endl;
return 0;
}
调用wve1中的print()输出“wve2:”;
int wve1::print()
{
std::cout << "wve2:" << std::endl;
return 0;
}
至此定义函数的文件内容为:
#include "NameTest.h"
int wve1::print()
{
std::cout << "wve1:" << std::endl;
return 0;
}
int wve2::print()
{
std::cout << "wve2" << std::endl;
return 0;
}
在命名空间声明完成,且函数定义完成之后,这个时候如果需要在程序中调用该命名空间中的函数则需要先在程序中包含带有命名空间声明的头文件,如果我们要调用wve1命名空间中的函数,按照以下方式进行调用。
#include "NameTest.h"
int main() {
wve1::print();
system("pause");
return 0;
}
::
是作用域解析操作符(Scope Resolution Operator)
在命名空间中,::
可以用来限定访问命名空间内的成员。
如果不想每次在调用函数的时候都指定命名空间,那么可以使用using namespace 命名空间;
指定使用的命名空间。
#include "NameTest.h"
using namespace wve1;
int main() {
print();
system("pause");
return 0;
}
在这个情况下如果想要调用wve2命名空间中的函数则还是需要使用::
进行调用。
#include "NameTest.h"
using namespace wve1;
int main() {
print();
wve2::print();
system("pause");
return 0;
}
如果使用using namespace
同时指定了wve1,wve2命名空间,那么因为此时两个空间中都有print函数,所以程序会报错。所以使用using namespace
在一些开发人员看来也是比较危险的使用。
并且在命名空间中还是可以继续进行命名空间的声明;如这个时候如果想在wve2中继续声明一个命名空间wve3,且wve3中也有一个print()函数,则头文件中(.h)可以这样写:
namespace wve2 {
int print();
namespace wve3 {
int print();
}
}
函数的定义:
int wve2::wve3::print()
{
std::cout << "wve3" << std::endl;
return 0;
}
这个时候在程序中就可以使用wve2::wve3::print()
进行wve3命名空间中的函数调用;
#include "NameTest.h"
int main() {
wve2::wve3::print();
system("pause");
return 0;
}
再回到Hello World;
std::cout<<"Hello World!"<<std::endl;
cout、endl其实就是std这个标准命名空间中的元素,且使用::
进行调用。