> 文章列表 > 【C++入门必备知识:命名空间与关键字】

【C++入门必备知识:命名空间与关键字】

【C++入门必备知识:命名空间与关键字】

【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;}}
}

Ⅲ.合并命名空间

在不同的头文件里,最后同名的命名空间会合并成一个。

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

【C++入门必备知识:命名空间与关键字】

//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个关键字。

【C++入门必备知识:命名空间与关键字】