目录
一.前言
C++关键字(C++98)总览:
一.作用域
二.命名冲突
三.命名空间
命名空间定义:
命名空间的嵌套定义:
四.命名空间的使用
五.命名空间的本质
一.前言
C++是从C语言延伸出来的编程语言,C++兼容了C语言百分之九十九的语法和特性,同时对于C语言(尤其是面对规模较大的工程时)中许多设计不合理的地方进行了优化并容纳进去了面向对象编程思想,增加了许多有用的库,以及编程范式等。
C++关键字(C++98)总览:
C++总计63个关键字,C语言32个关键字
红色方框圈出了C++新引入的关键字
一.作用域
程序中的作用域分为全局作用域和局部作用域
全局作用域中声明的标识符在所有作用域中都有效,而且具有跨编译单元(一个.cpp文件就是一个编译单元)的链接属性(即在整个项目工程中可见)。(不考虑static修饰的情况)
二.命名冲突
当局部作用域和全局作用中有标识名重复定义时,遵循局部优先原则,这种情况可以理解为命名污染,此时程序不会报错。
当全局作用域中声明的标识符之间重复定义时,就会发生命名冲突,程序就会报错
面对巨大的项目工程,C语言没办法解决类似这样的命名冲突问题;
三.命名空间
一个项目中,众多变量,函数,类以及结构类型的标识名如果重复出现就会发生冲突,而C语言对此并没有很好的解决方法(尤其是当工程项目特别大的时候),于是C++便引入了命名空间的语法,很好地避免了大工程中命名冲突或命名污染的问题。
命名空间定义:
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
命名空间中可以定义变量/函数/类型;
namespace bit { // 命名空间中可以定义变量/函数/类型 int rand = 10; int Add(int left, int right) { return left + right; } 一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中 }
命名空间不能定义在局部作用域中,其中不存在可执行代码;
命名空间可以嵌套定义;
命名空间的嵌套定义:
namespace N1 { int a; int b; int Add(int left, int right) { return left + right; } namespace N2 { int c; int d; int Sub(int left, int right) { return left - right; } } }
命名空间嵌套定义时,内层命名空间和外层命名空间即使存在相同的标识符,也不会发生命名冲突。
同一个工程中允许存在多个相同名称的命名空间,编译器在执行链接的阶段会将同名的命名空间合成同一个命名空间。命名空间本身的标识名不存在命名冲突的问题。
四.命名空间的使用
作用域限定符 ::
取消命名空间限制的关键字:using
一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
命名空间的使用有三种方式:
(1)在被访问的标识名前加命名空间名称及作用域限定符::
被嵌套命名空间中内容的访问
(2)使用using将命名空间中某个成员引入
(3) 使用using namespace+命名空间名称:解除相应命名空间对其中所有内容的作用域限制
第三种用法相当于是取消相应的命名空间,这种使用方式十分不推荐(尤其是在大项目中),推荐使用的访问命名空间内容的方法是第(1),第(2)种。
五.命名空间的本质
命名空间的本质作用是将全局作用域划分为多个独立的编译区块,各个编译区块在IDE执行链接时是互相不可见的,只有通过作用域限定符:: ,和using关键字才能使编译器执行链接时链接到相应命名空间中的内容.
通过这样语法规则,C++很好地避免了编程中可能出现的命名污染和命名冲突问题。