命名空间详解

目录

命名空间

1.命名空间的定义

1.1命名空间的正常定义

1.2.命名空间可以嵌套

1.3同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

2.命名空间的使用有三种方式

2.1.加命名空间名称及作用域限定符

2.2使用using将命名空间中某个成员引入(指定访问命名空间)

2.3使用using manespace命名空间名称引入(展开了命名空间域)


命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题
#include 
#include 
int rand = 10;
int main()
{
	printf("%d\n", rand);//报错:以前的定义是函数
	return 0;
}

1.命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名 空间的成员。

1.1命名空间的正常定义

//1.命名空间的正常定义
namespace OneShaw
{
	//命名空间中可以定义:变量/函数/类型
	int a = 1;
	
	int Add(int left, int right)
	{
		return left + right;
	}

	struct node
	{
		struct node* next;
		int val;
	};
}
//注意末尾没有 ;

1.2.命名空间可以嵌套

//2.命名空间可以嵌套
namespace N1
{
    int a = 0;
    int b = 2;
    int Add(int left, int right)
    {
        return left + right;
    }

    namespace N2
    {
        int a = 1;
        int c;
        int d;
        int Sub(int left, int right)
        {
            return left + right;
        }
    }
}

1.3同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
 printf("%d\n", N1::a);
 printf("%d\n", N1::b);
 printf("%d\n", N1::c);//在text.h头文件里的,但合并在了一个命名空间中

命名空间详解_第1张图片

 

2.命名空间的使用有三种方式

2.1.加命名空间名称及作用域限定符

int main()
{
    printf("%d\n",N1::a);
    return 0;
}

2.2使用using将命名空间中某个成员引入(指定访问命名空间)

using N1::b;
int main()
{
    printf(%d\n",N1::a);
    printf(%d\n",b);
    return 0;
}

2.3使用using manespace命名空间名称引入(展开了命名空间域)

using namespace N1;
int main()
{
    printf("%d\n",a);
    printf("%d\n",b);
    return 0;
}

展开的本意是暴露到全局

命名空间详解_第2张图片

 

访问顺序:局部域--->全局域---->展开的命名空间域or指定访问的命名空间域

int a = 0;

namespace os
{
	int a = 1;
}

// 局部域->全局域 -> 展开了命名空间域 or 指定访问命名空间域
int main()
{
	int a = 2;

	printf("%d\n", a);
	printf("%d\n", ::a);//空白代表全局域
	printf("%d\n", os::a);


	return 0;
}

命名空间详解_第3张图片

注意事项:

命名空间详解_第4张图片

 命名空间详解_第5张图片

 

你可能感兴趣的:(C++修习之路,c++,c语言,数据结构)