`

命名空间的 using 声明(摘自C++Primer第四版3.1)

阅读更多

在本章之前看到的程序,都是通过直接说明名字来自 std 命名空间,来引用标准库中的名字。例如,需要从标准输入读取数据时,就用 std::cin。这些名字都用了:: 操作符,该操作符是作用域操作符(第 1.2.2 节)。它的含义是右操作数的名字可以在左操作数的作用域中找到。因此,std::cin 的意思是说所需要名字 cin 是在命名空间 std 中定义的。显然,通过这种符号引用标准库名字的方式是非常麻烦的。幸运的是,C++ 提供了更简洁的方式来使用命名空间成员。本节将介绍一种最安全的机制:using 声明。关于其他简化使用命名空间中名字的方法将在第 17.2 节中介绍使用 using 声明可以在不需要加前缀 namespace_name:: 的情况下访问命名空间中的名字。using 声明的形式如下: using namespace::name; 一旦使用了 using 声明,我们就可以直接引用名字,而不需要再引用该名字的命名空间。

没有 using 声明,而直接使用命名空间中名字的未限定版本是错误的,尽管有些编译器也许无法检测出这种错误。每个名字都需要一个 using 声明一个 using 声明一次只能作用于一个命名空间成员。using 声明可用来明确指定在程序中用到的命名空间中的名字,如果希望使用 std(或其他的命名空间)中的几个名字,则必须为要用到的每个名字都提供一个 using 声明。例如,利用 using 声明可以这样重新编写第 1.2.2 节中的加法程序:

对 cin,cout 和 endl 进行 using 声明,就意味着以后可以省前缀 std::,直接使用命名空间中的名字,这样代码可以更易读。从这里开始,假定本书所有例子中所用到的标准库中的名字都已提供了 using 声明。这样,无论是在文档还是在代码实例中引用 cin, 我们都不再写为前缀形式 std::cin,为了使代码实例简短,我们还省略了编译时所必需的 using 声明。同样的,程序实例也会省略必需的 #include 指示。本书附录 A 中的表 A.1 列出了本书中用到的标准为名字的库名和相应的头文件。在编译我们提供的实例程序前,读者一定要注意在程序中添加适当的 #include 和 using 声明。使用标准库类型的类定义有一种情况下,必须总是使用完全限定的标准库名字:在头文件中。理由是头文件的内容会被预处理器复制到程序中。用 #include 包含文件时,相当于头文件中的文本将成为我们编写的文件的一部分。如果在头文件中放置 using 声明,就相当于在包含该头文件 using 的每个程序中都放置了同一 using,不论该程序是否需要 using 声明。通常,头文件中应该只定义确实必要的东西。请养成这个好习惯。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics