C++入门:命名空间

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

一.前言 

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++很好地避免了编程中可能出现的命名污染和命名冲突问题。

 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: c++