服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++名称空间介绍

C++名称空间介绍

2022-08-04 10:03梁唐 C/C++

这篇文章主要介绍了C++名称空间,这是一个很重要的概念——名称空间,有些书本里翻译成了命名空间,对应的英文是namespace。下面来看文章对此的详细介绍吧,需要的小伙伴可以参考一下

1.名称空间

在C++当中,名称可以是变量、函数、结构体、枚举、类以及结构体和类的成员。这本身并没有问题,但随着项目的增大,名称之间相互冲突的可能性也会大大增加。

比如我们使用了多个厂商的代码,它们都定义了List,TreeNode类,但定义的方式不同,也就没办法互相兼容。这个时候当我们希望使用一个库的List类,而使用另外一个的Tree类,就会非常麻烦。这类冲突被称为名称空间(namespace)问题。

1.1传统C++名称空间

我们先来复习一下几个术语。

声明区域:

声明区域指的是可以在其中进行声明的区域,比如我们可以在函数外侧声明全局变量,对于全局变量,它的声明区域就是其声明所在的文件。对于函数中声明的变量, 它的声明区域就是其声明所在的代码块。

潜在作用域:

潜在作用域的范围比声明区域更加精确,它从声明语句处开始一直到声明区域的结尾。这是因为变量必须定义之后才能使用,所以潜在作用域的范围比声明区域要小。

这里有一个细节,变量并不一定在整个潜在作用域都是可见的。因为可能还会被嵌套在声明区域中的同名变量隐藏。比如说我们同时定义了一个全局变量和一个函数中的同名变量,那么在函数当中,外侧的全局变量将会被同名的局部变量隐藏。

作用域:

结合前面所说的,变量对于程序而言可见的范围被称为作用域,它又比潜在作用域更加精确一些。

1.2新的名称空间特性

C++新增了通过定义一种新的声明区域来创建命名的名称空间,这样做的目的是提供一个声明名称的区域。一个名称空间中的名称不会与另外一个名称空间的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西。

比如C++ Primer当中的这个例子,下面使用新的关键字namespace创建了两个名称空间A和B。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace A {
    double pail;
    void fetch();
    int pal;
    struct Well {...};
}
 
namespace B {
    double bucket(double n) {...}
    double fetch;
    int pal;
    struct Hill {...};
}

名称空间可以是全局的,也可以位于另外一个名称空间中,但不能位于代码块中。因此,默认名称空间里的所有声明的名称的链接性都是外部的,const关键字修饰的常量除外。

除了用户定义的名称空间之外,还存在另外一个名称空间——全局名称空间。它对应于文件级的声明区域,因此前面所说的全局变量现在被描述为位于全局名称空间中。

任何名称空间中的名称都不会与其他空间的名称发生冲突,因此A中的fetch可以和B中的fetch共存。名称空间中的声明和定义规则桶全局声明和定义的规则相同。

名称空间是开放的,可以把名称加入到已经创建的名称空间中,比如:

?
1
2
3
namespace A {
    char *goose(const char *);
}

同样我们之前在名称空间A当中只是定义了函数fetch,而没有定义,我们也可以在之后的代码当中添加定义:

?
1
2
3
4
5
namespace A {
    void fetch () {
        ...
    }
}

当然而我们需要一种方法来访问给定名称空间里的名称,最简单的方法是使用作用域解析符::,使用名称空间名来找到该名称:

?
1
2
A::pail = 12.34;
A::fetch();

没有作用域解析符的名称成为未限定名称,包含了名称空间的名称称为限定的名称。

这一篇当中涉及了许多概念,看起来有些晦涩。但我个人感觉,这些概念理解起来并不复杂,主要是一些说明性的语言读起来有些难以理解。最好的办法就是沉下气来,一点点精读,先把前面理解了再看后面。

到此这篇关于C++名称空间介绍的文章就介绍到这了,更多相关C++名称空间内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

延伸 · 阅读

精彩推荐
  • C/C++C++关于引用作为函数的用法

    C++关于引用作为函数的用法

    今天小编就为大家分享一篇关于C++关于引用作为函数的用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来...

    蜗牛2014292021-07-15
  • C/C++C语言多维数组数据结构的实现详解

    C语言多维数组数据结构的实现详解

    对于数组想必大家都不陌生首先得要知道的是对于数组元素在内存存储是连续性的,下面这篇文章主要给大家介绍了关于C语言多维数组数据结构的相关资料...

    落别雨11572022-07-09
  • C/C++C++类的定义和对象的创建详解

    C++类的定义和对象的创建详解

    本篇文章重点讲解了两种创建对象的方式:一种是在栈上创建,形式和定义普通变量类似;另外一种是在堆上使用 new 关键字创建,必须要用一个指针指向...

    编程帮11402022-01-12
  • C/C++简单谈谈C++ 头文件系列之(iosfwd)

    简单谈谈C++ 头文件系列之(iosfwd)

    本文给大家分享的是小编关于头文件系列的(iosfwd)的简单讲解,所谓iosfwd,其实就是“input output stream forward”,下面我们来详细看看...

    C++教程网8642021-04-30
  • C/C++解析VC中创建DLL,导出全局变量,函数和类的深入分析

    解析VC中创建DLL,导出全局变量,函数和类的深入分析

    本篇文章是对VC中创建DLL,导出全局变量,函数和类进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网4942020-12-02
  • C/C++C++多线程强制终止详细

    C++多线程强制终止详细

    这篇文章主要介绍了C++多线程强制终止, 实际上,没有任何语言或操作系统可以为你提供异步突然终止线程的便利,且不会警告你不要使用它们。但是下面...

    我是一颗大西瓜5802022-01-12
  • C/C++70行C语言代码实现贪吃蛇

    70行C语言代码实现贪吃蛇

    这篇文章主要为大家详细介绍了70行C语言代码实现贪吃蛇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Keepower6762021-06-22
  • C/C++C++实现选择性排序(SelectionSort)

    C++实现选择性排序(SelectionSort)

    这篇文章主要为大家详细介绍了C++实现选择性排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    kevinmeanscool6072021-09-01