初次见面----命名空间
观察下列两种代码,有什么不同?
#include <iostream>
//using namespace std;
int main()
{
std::cout << "HEllow World!" << std::endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
//std::cout << "HEllow World!" << std::endl;
cout << "HEllow World!" << endl;
return 0;
}
显而易见上面的不同点就在于是否包含using namespace std;
So这行代码是干什么的?
什么是命名空间
需要弄清楚上面的问题,就需要知道命名空间的相关知识
简单来说就是将同一作用域的变量、函数、类用一个自定义的空间名字区分。
namespace zxy
{
int x = 0;
int Swap(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
struct LinkList
{
int val;
struct LinkList* next;
};
}
全局变量、函数、类可以放在一个叫做zxy的空间,这个空间的名字由你决定。
命名空间的写法:
namespace+自定义的空间名字
为什么出现命名空间
同一个作用域出现重名变量或者函数
#include <iostream>
using namespace std;
void Swap(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int Swap = 110;
int main()
{
cout << Swap << endl;
return 0;
}
或者变量名称和库中的函数重名
#include <iostream>
#include <stdlib.h>
using namespace std;
int rand = 10;
int main()
{
cout << rand << endl;
return 0;
}
解决方案:
针对上述的情况发生,C++中引入命名空间的概念
#include <iostream>
#include <stdlib.h>
using namespace std;
namespace zxy
{
int x = 0;
int rand = 1;
int Swap(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
struct LinkList
{
int val;
struct LinkList* next;
};
}
int main()
{
cout << rand() << endl;
return 0;
}
这样我们就可以使用重名的变量或者函数
命名空间的三种表达方式
使用 域作用限定符 ::
#include <iostream>
using namespace std;
namespace zxy
{
int x = 3;
void Swap(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
struct LinkList
{
int val;
struct LinkList* next;
};
}
int x = 101;
int main()
{
cout << "zxy::x = " << zxy::x << endl;
return 0;
}
使用部分展开
#include <iostream>
using namespace std;
namespace zxy
{
int x = 3;
void Swap(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
struct LinkList
{
int val;
struct LinkList* next;
};
}
int x = 101;
//部分展开,针对个人需要的变量或者函数展开
using zxy::Swap;
int main()
{
int x = 10;
int y = 20;
Swap(&x, &y);
全部展开
#include <iostream>
using namespace std;
namespace zxy
{
int x = 3;
void Swap(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
struct LinkList
{
int val;
struct LinkList* next;
};
}
int x = 101;
//将命名空间里面定义的内容取消“限制”
using namespace zxy;
int main()
{
int x = 10;
int y = 20;
Swap(&x, &y);
return 0;
}
但是全部展开是由一定风险的,比如上面的全部展开代码,我们发现全部展开之后会出现两个同名变量x
命名空间合并
同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
#include <iostream>
using namespace std;
namespace zxy
{
int x = 3;
void Swap(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
struct LinkList
{
int val;
struct LinkList* next;
};
}
namespace zxy
{
int a = 101010;
}
int main()
{
int a = 101;
cout << zxy::a << endl;
return 0;
}
命名空间的定义可以是不连续的,标准命名空间std也不例外,std的定义被分散在多个头文件里2,比如标准输入/输出头文件 <iostream>
中就定义了一个标准命名空间,<iostream>
里面的函数或类被放在std命名空间中,比如cin和cout这两个函数的名字就放在命名空间std里面,如果我们想使用cout函数,那就必须使用std命名空间引入这个函数