【C++入门必备知识:命名空间与关键字】
- 【命名空间】
- ①.命名空间定义
- Ⅰ.正常定义命名空间
- Ⅱ.嵌套定义命名空间
- Ⅲ.合并命名空间
- ②.命名空间的使用
- Ⅰ.+命名空间名称及域作用限定符
- Ⅱ.using成员引入
- Ⅲ.using namespace名称全部引入
- ③.注意事项
- 【C++关键字(C++98)】
【命名空间】
在C/C++中,变量,函数和类都是大量存在的,而这些变量,函数,和类的名称都将存在全局作用域中,这样可能就回引起很多冲突:比如命名冲突。
- 命名冲突
1.我们跟库冲突
2.我们互相之间冲突
而我们使用命名空间的目的就是为了解决C语言大多缺陷<命名冲突>。
使用命名空间可以对标识符的名称进行本地化,从而避免命名冲突或名字污染。
1.编译器访问域顺序 --局部域>全局域–>展开命名空间域or指令访问命名空间域。
2.命名空间展开就是展开到全局里来,是编译器是否会到命名空间域中访问搜索。
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
printf("%d\n", rand);
return 0;
}
//比如我们在这里定义一个全局变量rand,想要打印rand。
//但是编译器会报错,因为显示重定义。
为什么呢?因为引用了头文件后,头文件里就有rand函数的定义,在头文件里rand定义为函数,而在这里又被定义为全局变量,所以产生了命名冲突。
由于在C语言中该类问题无法解决,所以在C++中提出了使用namespace
来解决
①.命名空间定义
库里的名称我们无法改变,那我们可以将自己定义的名称放在命名空间里,当需要时指令访问即可。
那怎么定义命名空间呢?
定义命名空间,需要使用关键字
namespace
,后面跟着命名空间名子,然后再接着一个{}即可。
{}里即为命名空间的成员,可以是变量,函数,类。
namespace定义的命名空间就相当于定义一个域–可以与其他域隔离。也就是将自己定义的变量,函数,类,划到一个新的域中,让全局域找不到自己。
常见域:
1.类域
2.命名空间域
3.局部域
4.全局域
Ⅰ.正常定义命名空间
namespace wei
{
int a = 10;//可以定义变量
int Add(int x, int y)//可以定义函数
{
return x + y;
}
struct Node//可以定义类
{
int data;
struct Node* next;
};
}
Ⅱ.嵌套定义命名空间
命名空间是可以嵌套的
比如C++库名字就叫std里面就嵌套着许多命名空间。
namespace tao1
{
int a = 10;
int b = 20;
namespace tao2
{
int a = 1;
int b = 2;
namespace tao3
{
int a = 3;
int b = 4;
}
}
}
Ⅲ.合并命名空间
在不同的头文件里,最后同名的命名空间会合并成一个。
也就是在同一个工程中允许多个相同名称的命名空间,编译器最后会合成同一个命名空间中的
//test.cpp文件
namespace tao1
{
int a = 10;
int b = 20;
namespace tao2
{
int a = 1;
int b = 2;
namespace tao3
{
int a = 3;
int b = 4;
}
}
}
//test.h文件
namespace tao1
{
int max;
int min;
int a = 10;
int b=30;
}
②.命名空间的使用
定义好命名空间后,我们可以在命名空间里定义我们想要定义的变量,函数,类,并且不需要担心和库里函数发生命名冲突。
不过当我们要使用这些命名空间里的成员时,该如何使用呢?
::域作用限定符
Ⅰ.+命名空间名称及域作用限定符
namespace wei
{
int a = 10;//可以定义变量
int Add(int x, int y)//可以定义函数
{
return x + y;
}
struct Node//可以定义类
{
int data;
struct Node* next;
};
}
int main()
{
printf("%d", wei::a);//加命名空间名称与域作用限定符
return 0;
}
Ⅱ.using成员引入
namespace wei
{
int a = 10;//可以定义变量
int Add(int x, int y)//可以定义函数
{
return x + y;
}
struct Node//可以定义类
{
int data;
struct Node* next;
};
}
using wei::Add;//使用using将命名空间中某个成员引入。
int main()
{
printf("%d\n", wei::a);
printf("%d\n", Add(2, 5));
return 0;
}
Ⅲ.using namespace名称全部引入
namespace wei
{
int a = 10;//可以定义变量
int Add(int x, int y)//可以定义函数
{
return x + y;
}
struct Node//可以定义类
{
int data;
struct Node* next;
};
}
using namespace wei;//使用using namespace命名空间名称将命名空间内容全部展开。
int main()
{
printf("%d\n", wei::a);
printf("%d\n", Add(2, 5));
struct Node n;
return 0;
}
但这种做法是有风险的。
③.注意事项
当我们使用第三种方法来访问命名空间里的成员时,会存在风险,因为命名空间全部展开到全局域中,就又会出现命名冲突的风险。比如如果全部展开C++标准库就会存在风险。
using namespace std;
1.直接展开会有风险:当我们定义如果和库重名那就会报错
2.建议项目里面不要直接展开,建议日常练习可以直接展开
3.项目中建议指定展开,不要轻易展开命名空间。
不过我们还可以这样:
如果有重复多使用的可以【部分展开】:【指定展开】:【把常用的展开】
using std::cout;//将常用的成员展开使用
using std::end1;//将常用的成员展开使用
【C++关键字(C++98)】
C++关键字总计为63个,C语言总计32个关键字。