目录
一、命名空间的作用
二、命名空间的定义
三、命名空间的镶嵌定义
四、命名空间的使用方法
一、命名空间的作用
一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过,没有问题时,将它们结合到一起就有可能会出现命名冲突。例如:小李和小韩都参与了一个文件管理系统的开发,它们都定义了一个全局变量 fp,用来指明当前打开的文件,将他们的代码整合在一起编译时,很明显编译器会提示 fp 重复定错误。
为了解决合作开发时的命名冲突问题,C++ 引入了命名空间(Namespace)的概念。
使用【命名空间】解决名字冲突
#include<stdio.h>
#include<iostream>
using namespace std;
namespace Te{
class Student{
public:
char *name;
int age;
double hight;
public:
void speak(){
cout<<name<<"的年龄和身高是"<<age<<"岁和"<<hight<<"米";
}
};
}
int main(){
Te::Student stu1;
stu1.name="李小狼";
stu1.age=9;
stu1.hight=1.65;
stu1.speak();
return 0;
}
二、命名空间的定义
namespace Name
{
int a;//命名空间可以包含变量
double b=0.7;//变量可以初始化
int sum(int x,int y,int z){//命名空间可以包含函数
return x+y+z;
}
struct N{//命名空间包含类
int name;
double heigh;
};
}
namespace是定义命名空间的关键字,Name是命名空间的名字。
如果在程序中要使用a和b,必须加上命名空间名和作用域分辨符::,如Name::a,这种用法称为命名空间限定。
命名空间的作用是建立一些互相分隔的作用域,把一些全局实体分隔开来,以免产生名字冲突。
- 不允许在局部空间中(函数内)定义命名空间,命名空间具有全局属性。
- 在命名空间中只能进行定义操作,不能进行赋值加减调用函数等运算操作(初始化除外)。
- 命名空间中可以定义变量、函数、类、typedef、#define等。
(1)命名空间不可以定义在局部空间:
三、命名空间的镶嵌定义
// 命名空间可以嵌套
namespace T1
{
int m;
int n;
int Add(int left, int right)
{
return left + right;
}
namespace T2
{
int n;//同名变量,在T2命名空间中优先作用,T2的n
int c = m;//父空间中定义的变量(非同名变量)可以在子空间中直接作用
int d;
int Sub(int left, int right)
{
return left - right;
}
}
//int e = d;//编译出错,子空间中定义的变量不能在父空间中直接作用需要使用T2::d
int e = T2::d;//需要引用对应的命名空间
}
- 允许父子空间定义同名变量,变量在各自定义的空间中起作用。
- 父空间中定义的变量(非同名变量)可以在子空间中直接作用,但子空间中定义的变量不能在父空间中直接作用。父空间使用子空间中定义的变量需要引用对应的子命名空间,(但可以不再带父空间名)。
四、命名空间的使用方法
使用using引用命名空间
1 、加命名空间名称及作用域限定符
int main()
{
printf("%d\n", N::a);
printf("%d\n", N::b);
return 0;
}
- 该方式只对当前变量的作用域有效
- 域名限定符前为空表示忽略局部优先,指定全局域变量。
2、 使用using将命名空间中某个成员引入
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
return 0;
}
- using N::b;可以写在源文件的任意位置,函数内外、前后都可以。但一般写在文件头。
- 引入后的成员从引入位置开始向下具有全局作用域,可以跨函数使用。
3、 使用using namespace 将整个命名空间引入
using namespce N;
int main()
{
printf("%d\n", a);
printf("%d\n", b);
Add(10, 20);
return 0;
}
- using namespce N;可以写在源文件的任意位置,函数内外、前后都可以。但一般写在文件头。
- 引入后的命名空间从引入位置开始向下具有全局作用域,可以跨函数使用。
- 将整个命名空间引入会使得命名隔离失效,慎用!