名称空间,标题和对象的层次结构

时间:2017-03-22 16:50:19

标签: c++

据我所知,命名空间std包含所有C ++标准库,其中一个标准库是iostream,它有cout和cin对象。

std namespace 
       |
   iostream
       |
   cout, cin

以上结构是否正确?或者它有什么不同?

2 个答案:

答案 0 :(得分:1)

  

据我所知,命名空间std包含所有C ++标准   库,其中一个标准库是iostream和它   有cout和cin的功能。

不完全。

  • 虽然几乎所有标准库都在名称空间std中,但在使用旧标头表单(std而不是<stdio.h>时,我们还有<cstdio>之外的C组件})和assert宏,它没有作用域。
  • std::cinstd::cout不是函数,而是对象。
  • <iostream>只是一个标题的名称,其中包含C ++ ISO标准正式命名的部分&#34;输入/输出库&#34; (std::iostreamtypedef很少使用std::basic_iostream<char>
  • 库的某些组件可以由不同的#include引入。例如,std::initializer_list可通过<initializer_list>或类似<vector>的内容获得。

在没有详细介绍的情况下,头文件和作用域是C ++中的两个正交概念。换句话说,它们彼此平行存在。它们之间/之间没有有用的层次结构。

答案 1 :(得分:1)

如果假设标准库中的所有内容都包含在std命名空间中,包含一些例外,则标准中的17.6.1.1/§3符合标准,这是正确的:

  

除了宏 operator new operator delete 之外的所有库实体都在命名空间 std 中定义,或者命名空间嵌套在命名空间 std中即可。未指定在特定名称空间中声明的名称是直接在该名称空间中声明还是在该名称空间内的内联名称空间中声明。

然后,当你说“图书馆”时,这里只有一个图书馆,即“标准图书馆”。 iostream是此库的标题。但这并不意味着标题中的所有内容都在特定的命名空间中。

例如,cincout直接位于std命名空间中,但包含在<iostream>标题中。