[C++再学习系列] Using声明和指令的工作原理

简介:

 对于C++编译器,那些名字可见至关重要,太多的名字可见将导致名字查找效率的降低,而名字太少将导致无法找到所需类型或函数的名字,从而导致编译错误。除了最常用的include可以导入可见名字之外,using关键字也可以导入名字到特定的编译单元中(单个cpp文件)。

区别:

Using声明: usingnamespace std; -- 导入某个名字空间可见的名字实体

Using指令: using N::Widget; -- 导入特定名字

  Using用于导入特定名字空间下的名字实体,可以是全部名字实体(usingnamespace std;),也可以是特定的名字实体(using std::map;)。

  工作原理:using声明将获取的是在遇到using声明瞬间所见到的名字空间中的实体。这点是可以理解的,这样的工作方式有利于避免名字冲突(过多导致污染),加快名字查找过程。但这同时意味着:只有在using namespace std;语句之前所include的std头文件的名字实体被引入,即using并未引入所有来自std的名字实体。

  Using关键字定理:绝对不要在include之前使用using声明或指令。

  推论:不要在头文件中使用using声明或指令,相反应该使用名字空间限定所有的名字,尤其是来自其他名字空间的名字。(原因:1)头文件并不知道完全的include信息,头文件总是被用于其他cpp中,其后总会出现另外的include; 2)避免不必要的名字污染)

  例子:

// snippet 1

namespace A {

 int f(double);

}

// snippet 2

namespace B {

  using A::f;

  void g();

}

// snippet 3

namespace A {

 int f(int);

}

// snippet 4

void B::g() {

  f(1);                         // which overload iscalled?

}

  这几个文件先后出现顺序将决定f(1)是否可编译(所有的f函数定义均不可见)?以及重载哪个函数(哪些函数可见,并参与重载)。

  错误地使用using将导致名字空间污染,或错误地导入不完整的名字空间的瞬间快照(导致无法找到特定名字实体)。在头文件中,使用using将使这个问题更加严重(多处使用,使用顺序不可控)。

  例外:编写类成员级的using声明导入所需的基类成员名字是一个合法技巧,只有这样才能避免基类的名字被屏蔽,如重载函数不可见问题。(见派生类的函数重载)

相关文章:揭秘:C++编译器的函数编译流程

----------------------------------------------------

兄弟的公司:立即购--手机购物,诚信网购


本文转自 zhenjing 博客园博客,原文链接:http://www.cnblogs.com/zhenjing/archive/2010/11/04/1868891.html   ,如需转载请自行联系原作者

相关文章
|
1天前
|
编译器 开发工具 C语言
配置C++的学习环境
这篇教程介绍了学习C++语言所需的环境配置和软件选择。首先,你需要一个文本编辑器(如Visual Studio Code、Visual Studio、Vim、Emacs或Eclipse)和一个C++编译器(如GCC)。在不同操作系统上安装GCC的方法包括:在Linux或UNIX上使用命令行检查或安装GCC,在Mac OS X上通过Apple的Xcode,而在Windows上则需要安装MinGW。教程还提供了使用Visual Studio创建和编译C++程序的步骤。最后,文章简述了g++编译器的使用及其常用命令选项。
7 0
|
7天前
|
编译器 C++ 容器
C++模板的原理及使用
C++模板的原理及使用
|
7天前
|
算法 编译器 C语言
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL(下)
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL
13 0
|
7天前
|
编译器 C语言 C++
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL(上)
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL
9 0
|
7天前
|
编译器 C语言 C++
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)(下)
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)
12 0
|
7天前
|
Java 编译器 C#
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)(上)
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)
24 0
|
13天前
|
设计模式 算法 C++
【C++】STL之迭代器介绍、原理、失效
【C++】STL之迭代器介绍、原理、失效
20 2
|
13天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
11 1
|
13天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
19 0
|
13天前
|
存储 安全 测试技术
【C++】string学习 — 手搓string类项目
C++ 的 string 类是 C++ 标准库中提供的一个用于处理字符串的类。它在 C++ 的历史中扮演了重要的角色,为字符串处理提供了更加方便、高效的方法。
20 0
【C++】string学习 — 手搓string类项目