目录
5. 命名空间是开放的,可以随时把新的成员加入到命名空间中:
1. 命名空间的作用:
用来处理不同代码段之间的名称冲突问题。
2. 应用场景:
(1)在一个应用程序的多个文件中可能会存在同名的全局对象,这样会导致应用程序的链接错误,使用命名空间可以消除命名冲突的问题。
(2)在编写代码时,可能你编写了一个名为func()的函数。后面在使用第三方库的时候,其中也有一个func()函数,编译器无法判断你的代码要使用哪个版本的func()函数,库的函数不能修改,而要修改自己的函数函数如果引用的地方比较多的话,修改也会比较麻烦。使用命名空间就可以很好的解决问题。
3. 命名空间的定义:
命名空间的定义格式如下:
namespace 名称
{
//常量,变量,函数等对象的定义
}
命名空间内函数的定义和类内接口定义差不多:
既可以直接在命名空间内直接定义函数,也可以现在命令空间内声明该函数,然后在该命名空间外部进行定义。
namespace mycode{
int intValue = 10;
//void func();
void func(void)
{
std::cout << "func() called in the mycode namespacce" << std::endl;
}
}
定义未命名的命名空间:
尽管为命名空间指定名称是有益的,但是C++中也允许在定义中省略命名空间的名称来简单的定义未命名的命名空间。无名命名空间,意味着命名空间中的标识符只能在本文件内访问,相当于给这个标识符加上了static ,使得其可以作为内部链接。
namespace{
int a = 10;
void func(){
cout<<"hello namespace"<<endl;
}
}
void test(){
//只能在当前源文件直接访问a 或 func
cout<<"a = "<<a<<endl;
func();
}
4. 命名空间可以嵌套:
针对嵌套的命名空间,命名空间可以定义在其他的命名空间中,仅仅通过使用外部的命名空间作为前缀,程序便可以引用在命名空间之外定义的其他标识符,然而,在命名空间内定义的标识符需要作为外部命名空间和内部命名空间的前缀出现。例如:
namespace Output
{
void myshow(void)
{
cout << " call myhshow in the Output " << endl;
}
namespace Myname
{
void MyDemo()
{
cout << "call MyDemo in the Outpu::Myname" << endl;
}
}
}
// 如果需要调用MyDemo() 有两种方式。
// 一种:
Output::Myname::MyDemo();
//另外一种:
using namespacce Output::Myname;
MyDemo();
5. 命名空间是开放的,可以随时把新的成员加入到命名空间中:
在多个文件中定义命名空间,一般是在头文件中声明命名空间中的函数,在.cpp文件中定义命名空间中的函数。命名空间是开发的,同一个命名空间的成员是可以累加的,实际成员为“总和”。
namespace MyValue {
int a = 100;
int b = 200;
}
//将c添加到已有的命名空间A中
namespace MyValue {
int c = 300;
}
void test()
{
cout<<"MyValue中a = "<<MyValue::a<<endl;//100
cout<<"MyValue中c = "<<MyValue::c<<endl;//200
}
6. 命名空间别名的定义:
命名空间别名的使用一定程度上可以简化代码,增加代码的可读性。
namespace veryLongName{
int a = 10;
void func(){ cout << "hello namespace" << endl; }
}
void test(){
namespace shortName = veryLongName;
cout << "veryLongName::a : " << shortName::a << endl;
veryLongName::func();
shortName::func();
}