在<string>头文件中的所有声明都包含在名字空间std 中正如第1 章所提到的我们可
以用在#include 预处理器指示符后面加上using 指示符的办法使C++头文件<string>中
的在名字空间std 中声明的组件对于我们的程序都是可见的
#include <string>
using namespace std;
// ok: string 是可见的
string current_chapter = "A Tour of C++";
为了使在名字空间std 中声明的名字在我们的程序中可见指示符using 通常被看作是一种比较差的选择方案在上面的例子中指示符using 使头文件<string>中声明的并且位于名字空std 中的所有组件在程序文本文件中都是可见的这又将全局名字空间污染问题带回来了而这个问题正是std 名字空间首先要努力避免的它增加了C++标准库组件的名字与我们程序中声明的全局名字冲突的机会
using 使我们能够引用到隐藏在名字空间std 中的名字string 我们可以使用限定的名字例
如
#include <string>
// ok: 使用限定的名字
std::string current_chapter = "A Tour of C++";
或如下使用using 声明
#include <string>
using std::string;
// ok: 上面的using 声明使string 可见
string current_chapter = "A Tour of C++";
为了使用名字空间中声明的名字建议使用带有精细选择功能的using 声明代替using 指示符这也正是本书的代码示例中没有出现using 指示符的另一个原因理想情况下每一个代码示例对它所用到的每个库组件都应该有一个using 声明为了限制例子代码的长度也因为本的许多例子是在不支持名字空间的情况下被编译的所以using 声明就没有显示出来
在下面的例子中fp 是一个float 型的数据对象而fp2 是一个指向float 型对象的指针
float fp, *fp2;
为清楚起见最好写成
string *ps;
而不是
string* ps;
有可能发生的情况是当程序员后来想定义第二个字符串指针时他会错误地修改定义
如下
// 喔: ps2 不是一个字符串指针
string* ps, ps2;