1. 命名空间概念

C++ 应用程序中, 您可能会写一个名为 func() 的函数,在另一个可用的库中也存在一个相同的函数 func() 。这样,编译器就无法判断您所使用的是哪一个 func() 函数。

因此,引入了命名空间概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。

命名空间是给代码指定的名称,有助于降低命名冲突的风险。

2. 定义命名空间

命名空间的定义使用关键字 namespace ,后跟命名空间的名称,如下所示:

namespace namespace_name {// 代码声明
}

3. 调用命名空间

为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称,如下所示:

name::code;  // code 可以是变量或函数

4. using 指令

可以使用 using namespace 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称。这个指令会告诉编译器,后续的代码将使用指定的命名空间中的名称。

5. 使用示例

5.1 自定义命名空间

#include <iostream>
using namespace std;// 第一个命名空间
namespace first_sapce
{void func(){cout << "first namespace" << endl;}
}// 第二个命名空间
namespace second_space
{void func(){cout << "second namespace" << endl;}
}int main()
{   // 调用第一个命名空间中的函数first_sapce::func();return 0;
}

为了避免频繁输入命名空间名称,也可以使用 using namespace 指令,如下所示:

using namespace first_sapce;
int main()
{   // 调用第一个命名空间中的函数func();return 0;
}

或者仅使用用到的函数, 调用第一个命名空间中的函数:

using first_sapce::func;int main()
{  func();return 0;
}

5.2 标准命名空间

  1. 未使用 using namespace 指令
#include <iostream>int main()
{std::cout << "hello,world" << std::endl;return 0;
}
  1. 使用 using namespace 指令包含全部元素

通过告诉编译器您要使用名称空间 std ,在第 7 行使用 coutendl 时,就无需显式地指定名称空间了。

#include <iostream>using namespace std;int main()
{cout << "hello,world" << endl;return 0;
}
  1. 使用 using namespace 指令仅包含使用的元素

using 指令也可以用来指定命名空间中的特定项目。例如,如果您只打算使用 std 命名空间中的 cout 部分,您可以使用如下的语句:

using std::cout; // 这种语法结构称为 using 声明

完整示例函数

#include <iostream>using std::cout;
using std::endl;int main()
{cout << "hello,world" << endl;return 0;
}

两者的差别在于:

  • 前者让您能够在不显式指定名称空间限定符 std:: 的情况下使用名称空间 std 中的所有元素( coutcin 等);
  • 后者让您能够在不显式指定名称空间限定符 std:: 的情况下仅使用 std::coutstd::endl

using 指令引入的名称遵循正常的范围规则。名称从使用 using 指令开始是可见的,直到该范围结束。此时,在范围以外定义的同名实体是隐藏的。

一个一般性的原则是: 除非是 std 这种在某个应用领域中大家已经非常熟悉的名字空
间 ,否则最好不要使用 using 指令 。 过度使用 using 指令带来的问题是, 你已经记不清每个名字来自哪里,结果就是你又陷入名字冲突之中 。

显式使用全限定名或者使用 using 声明就不存在这个问题 。 因此 , 将一个 using 指令放在头文件中是一个非常坏的习惯,因为用户就无法避免上述问题 。

6. 不连续的命名空间

命名空间可以定义在几个不同的部分中,因此命名空间是由几个单独定义的部分组成的。一个命名空间的各个组成部分可以分散在多个文件中。

所以,如果命名空间中的某个组成部分需要请求定义在另一个文件中的名称,则仍然需要声明该名称。下面的命名空间定义可以是定义一个新的命名空间,也可以是为已有的命名空间增加新的元素:

namespace namespace_name {// 代码声明
}

7. 嵌套命名空间

命名空间可以嵌套,您可以在一个命名空间中定义另一个命名空间,如下所示:

namespace namespace_name1 {// 代码声明namespace namespace_name2 {// 代码声明}
}

可以通过使用 :: 运算符来访问嵌套的命名空间中的成员:

// 访问 namespace_name2 中的成员
using namespace namespace_name1::namespace_name2;// 访问 namespace:name1 中的成员
using namespace namespace_name1;

在上面的语句中,如果使用的是 namespace_name1 ,那么在该范围内 namespace_name2 中的元素是不可以直接使用的,除非使用命名空间说明 second_space::second(),如下所示:

#include <iostream>
using namespace std;// 第一个命名空间
namespace first_space
{void func(){cout << "first_space" << endl;}// 第二个命名空间namespace second_space{void func(){cout << "second_space" << endl;}}
}
using namespace first_space::second_space;int main ()
{// 调用第二个命名空间中的函数func();return 0;
}

输出结果:

second_space
#include <iostream>
using namespace std;// 第一个命名空间
namespace first_space
{void func(){cout << "first_space" << endl;}// 第二个命名空间namespace second_space{void second(){cout << "second_space" << endl;}}
}
using namespace first_space;int main ()
{// 调用第一个命名空间中的函数func();// second(); ‘second’ was not declared in this scopesecond_space::second();return 0;
}

输出结果:

first_space
second_space

C++ 笔记(03)— 命名空间(概念、定义、调用、using name 指令、嵌套命名空间)相关推荐

  1. 命名空间的定义和使用

    ►大型应用程序经常使用来自不同厂商的开发库,几乎不可避免会使用相同的名字,也就是说一个库中定义的名字可能与其他库中的名字相同而产生冲突,使得程序员不能组合各自独立的开发库到一个程序中. ►命名空间是用 ...

  2. C++系列: 嵌套命名空间

    目录 1.什么是嵌套命名空间? 2.实验 2.1 外部引用嵌套命名空间内的符号 2.2 命名空间内容不同层次间符号的引用 3.最后 1.什么是嵌套命名空间? 嵌套命名空间就是在命名空间里面在定义其它的 ...

  3. 侯捷C++课程笔记03: STL标准库与泛型编程

    本笔记根据侯捷老师的课程整理而来:STL标准库与泛型编程 pdf版本笔记的下载地址: 笔记03_STL标准库与泛型编程,排版更美观一点(访问密码:3834) 侯捷C++课程笔记03: STL标准库与泛 ...

  4. JDBC学习笔记03【JDBC事务管理、数据库连接池、JDBCTemplate】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  5. django学习笔记03

    原创博客地址:django学习笔记03 第一章,模型层 查询集API 一.QuerySet何时被提交 迭代 QuerySet是可迭代的,在首次迭代查询集时执行实际的数据库查询 切片:如果使用切片的&q ...

  6. ESP32 单片机学习笔记 - 03 - MCPWM脉冲输出/PCNT脉冲计数

    ESP32 单片机学习笔记 - 03 - MCPWM脉冲输出/PCNT脉冲计数 前言,继续上一篇的内容.因为上一篇刚好实验了iic和spi,形成一对.接下来讲pwm另起一篇. 目录 ESP32 单片机 ...

  7. JavaEE——Spring学习笔记03【AOP开发】

    JavaEE--Spring学习笔记01[Ioc开发的模式] JavaEE--Spring学习笔记02[Spring和Mybatis的整合] JavaEE--Spring学习笔记03[AOP开发] J ...

  8. 命名空间的定义、使用和存在的意义

    命名空间 文章目录 命名空间 前言 命名空间概念引入 1.1 命名空间定义 1.1.1 命名空间的一般定义方式 1.1.2 命名空间的嵌套定义 1.1.3 不连续的命名空间 1.2 命名空间使用 1. ...

  9. Spring-学习笔记03【Spring的IOC和DI】

    Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...

最新文章

  1. 什么是Python的var_dump()的Python等价物? [重复]
  2. [转帖]Sqlcmd使用详解
  3. java 静态对象赋值_基于Java class对象说明、Java 静态变量声明和赋值说明(详解)...
  4. 使用Azure云原生构建博客是怎样一种体验?(下篇)
  5. 2018.2.2PHPstrom破解版
  6. 前端学习(2480):接口文档使用2
  7. 吸顶那个叫什么_为什么我家吸顶灯开灯后一闪一闪的
  8. JavaSE——Java基础语法(二进制、变量、方法(函数)、运算符、转义字符)
  9. 关于Windows消息钩子的理解与测试项目
  10. C#LeetCode刷题之#125-验证回文串(Valid Palindrome)
  11. recycleviewitem 列表加载动画_2019年Q4动画数据报告 | 伍六七之最强发型师评论数破十万...
  12. java装箱和拆箱的意义_java的自动拆箱和装箱是每个程序员都要知道的
  13. Windows下命令(bat可用)
  14. mysql join 去重_对mysql left join 出现的重复结果去重
  15. 网吧服务器最新方案,云更新2017版对网吧服务器配置要求
  16. 计算机网络: 码元 波特 速率 带宽
  17. int / long / long int / long long / long long int
  18. 我生命中的钱事:童年!
  19. 列表如何做,看这一篇就够啦——触底加载、虚拟滚动与计算展现值
  20. 【Shell】mksh运行分析

热门文章

  1. docker停止、删除容器、删除镜像 一看就理解
  2. 2022-2028年中国基因工程药物产业市场研究及前瞻分析报告
  3. 2022-2028年中国能源期货市场深度调研及投资前景预测报告
  4. 2022-2028年中国散热产业深度调研及投资前景预测报告(全卷)
  5. 2022-2028年中国氢化环氧树脂产业发展动态及投资趋势预测报告
  6. Docker 入门系列(7)- Dockerfile 使用(FROM、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、WORKDIR)
  7. 翻转二叉树 c语言实现 递归 栈 队列
  8. 通俗理解tf.nn.conv2d() tf.nn.conv3d( )参数的含义 pytorhc 卷积
  9. LeetCode简单题之键盘行
  10. 合肥工业大学—SQL Server数据库实验三:SQL语句创建和删除基本表