一、域的特性以及区别
同域不能定义同名的变量,但不同的域可以。
域能影响访问,也能影响生命周期。
几种常见的域:类域、命名空间域、局部域、全局域。
其中局部域和全局域会影响生命周期,类域和命名空间域不会影响生命周期。
在C++中,如果想访问全局域,则需要使用::(域作用限定符)
注:默认先从局部搜索,若局部没有,则全局搜索,如果两个都存在,则访问全局域时,要使用::(域作用限定符)
#include<stdio.h>
#include<stdlib.h>
int a = 1; //全局域
namespace Galaxy
{
int a1 = 3;
}
using namespace Galaxy; //展开命名空间域(默认向上查找)
namespace Star
{
int a = 2; //命名空间域
}
int main()
{
int a = 0; //局部域
printf("%d\n",a); //访问局部域
printf("%d\n",::a); //访问全局域
printf("%d\n",Star::a); //指定访问命名空间域
printf("%d\n",a1);
return 0;
}
二、域的优先级
1、局部域—>全局域—>展开命名空间域or指定访问命名空间域(默认:不指定是不会去命名空间域搜索的)
注:若展开了命名空间域,则该命名空间域暴露于全局,若与原全局域中变量同名,则不能同时存在。直接展开会有风险,我们定义如果跟库重名就报错,建议项目里面不要展开。项目建议指定访问,不要轻易展开命名空间。
2、常见误区:展开命名空间域≠include
include指在预处理阶段将include中的内容展开(类似拷贝)
而展开命名空间域是指,编译时去命名空间中搜索(相当于把墙拆了)
三、命名空间域
1、命名空间可以定义变量/函数/类型。
2、命名空间可以嵌套。
3、不同头文件中的相同命名空间可以合并。
4、调用命名空间的三种方式:
a.全部展开命名空间域
b.指定访问
c.指定展开(某个命名空间域)