[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++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
【C++】深入解析C/C++内存管理:new与delete的使用及原理(二)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
193 4
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
222 3
|
存储 C语言 C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(一)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
252 3
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
222 0
|
10月前
|
负载均衡 算法 安全
探秘:基于 C++ 的局域网电脑控制软件自适应指令分发算法
在现代企业信息化架构中,局域网电脑控制软件如同“指挥官”,通过自适应指令分发算法动态调整指令发送节奏与数据量,确保不同性能的终端设备高效运行。基于C++语言,利用套接字实现稳定连接和线程同步管理,结合实时状态反馈,优化指令分发策略,提升整体管控效率,保障网络稳定,助力数字化办公。
169 19
|
11月前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
238 4
2023/11/10学习记录-C/C++对称分组加密DES
|
10月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
144 16
|
9月前
|
安全 C语言 C++
彻底摘明白 C++ 的动态内存分配原理
大家好,我是V哥。C++的动态内存分配允许程序在运行时请求和释放内存,主要通过`new`/`delete`(用于对象)及`malloc`/`calloc`/`realloc`/`free`(继承自C语言)实现。`new`分配并初始化对象内存,`delete`释放并调用析构函数;而`malloc`等函数仅处理裸内存,不涉及构造与析构。掌握这些可有效管理内存,避免泄漏和悬空指针问题。智能指针如`std::unique_ptr`和`std::shared_ptr`能自动管理内存,确保异常安全。关注威哥爱编程,了解更多全栈开发技巧。 先赞再看后评论,腰缠万贯财进门。
402 0
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
429 6