C++入门级教程:我将告诉你有关域的一切

一、域的特性以及区别

同域不能定义同名的变量,但不同的域可以。
域能影响访问,也能影响生命周期。
几种常见的域:类域、命名空间域、局部域、全局域。 

其中局部域和全局域会影响生命周期,类域和命名空间域不会影响生命周期。  
在C++中,如果想访问全局域,则需要使用::(域作用限定符)
注:默认先从局部搜索,若局部没有,则全局搜索,如果两个都存在,则访问全局域时,要使用::(域作用限定符)

#include
#include

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.指定展开(某个命名空间域)




 

你可能感兴趣的:(C++,c++,开发语言)