文章目录
1、什么是命名空间
命名空间是一种用来避免命名冲突的机制,它可以将一段代码的名称隔离开,使其与其他代码的名称不冲突;
命名空间的原理是将一个全局的作用域分成一个个命名空间,每个命名空间是个单独的作用域,同时若是在同一个作用域内可能出现的命名冲突也不会造成影响,有效避免了命名空间的污染;
2、命名空间的作用
在学习C语言的过程中我们知道有一个函数叫做rand函数,该函数用于生成伪随机整数;
#include<stdio.h>
int rand = 10;
int main()
{
printf("%d\n", rand);
return 0;
}
但若是在包含rand函数所在的头文件为前提的结果是什么?
#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main()
{
printf("%d\n", rand);
return 0;
}
此时编译器报错。
原因是,在程序运行时,计算机先会在局部寻找变量,当局部内未找到时则回去全局找;
在全局找时找到了两个 rand (一个为头文件内的rand函数,一个为所创建的变量rand);
此时也不知该打印哪一个rand,这就叫命名冲突;
但在C++中,出现了一个新的概念叫做命名空间,一般来说,rand这类的函数都存放于C++中标准库类型对象的命名空间std中;
#include<iostream>//标准输入输出流头文件
using namespace std;//展开标准库命名空间std
namespace Sweet{//设置命名空间且名为Sweet
int rand = 10;
}
int main()
{
cout << rand << endl;//打印rand
cout << Sweet::rand << endl;//打印Sweet中的rand(::符号为作用域限定符)
return 0;
}
这里的cout是指打印输出; cin 是输入;endl是换行
3、如何定义命名空间
从上面可知命名空间的作用,既然命名空间能够有效防止命名冲突,那该如何定义命名空间?
在定义命名空间时,应该使用 namespace 修饰且在该修饰词后定义名字并在其后跟 **{ }**在{ }内的元素即为该命名空间的成员;
#include<iostream>
using namespace std;//展开std命名空间
namespace A1 {//定义一个名为A1的命名空间
int a = 0;
int b = 20;//变量
void Add()//函数
{
cout << "IsAddFunc1" << endl;
}
struct TestNode//结构体
{
int test1;
double test2;
};
}
namespace A2 {//定义一个名为A2的命名空间
int a = 10;
int b = 21;
void Add()
{
cout << "IsAddFunc2" << endl;
}
struct TestNode
{
int test3;
double test4;
};
}
int main()
{
cout << "A1::b = " << A1::b << endl;//打印A1中的b
cout << "A2::b = " << A2::b << endl;//打印A2中的b
A1::Add();//调用A1中的Add函数
A2::Add();//调用A2中的Add函数
struct A1::TestNode AT1;//声明结构体变量
struct A2::TestNode AT2;
cout << &AT1 << endl;//打印结构体变量地址
cout << &AT2 << endl;
return 0;
}
从该段代码可知命名空间内不仅可以声明(定义)变量,还可以包含函数、类、typedef以及#define宏等等;
3、使用命名空间的三种方式
加命名空间名称及作用域限定符
yan::a
yan::Add(1, 2)
使用using将命名空间中某个成员引入
这种方式也叫做命名空间部分展开
using yan::a
using yan::Add
使用using namespzce命名空间名称引入
这种方式也叫做命名空间全部展开
using namespace std;
using namespace yan;