一、本章重点

  1. 为什么有命名空间?
  2. 什么是命名空间?
  3. 命名空间的使用

二、为什么要存在命名空间?

我们需要知道的是:C++大多数语法的出现都是解决C语言的不足。

在C语言中,下面这样的代码能过通过编译吗?

#include<stdio.h>
void Swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}int Swap = 1;int main()
{return 0;
}

c语言中,在同一个作用域是不允许有同名变量的。

但在一个工程项目中,大多数都是多人协助完成,如果你的同事用Swap做函数名,而你用它做了全局变量,在编译的时候,会产生命名冲突。

我们容易知道这种命名冲突问题在多人协助的项目中是频繁的。

如果出错后再去改变量名,成本太高。

为了解决这一问题,C++引入了namespace关键字,即命名空间。

三、什么是命名空间?

简单来说就是将同一作用域的变量、函数、类用一个自定义的空间名字区分。

比如你写的全局变量、函数、类可以放在一个叫做RNG的空间,这个空间的名字由你决定。

命名空间的写法:

namespace+自定义的空间名字

namespace RNG
{void Swap(int* a,int* b){int temp = *a;*a = *b;*b = temp;}
}
int Swap = 1;
int main()
{return 0;
}

这时如果你打印Swap,打印的是全局变量Swap=1。

#include<iostream>
using namespace std;
namespace RNG
{void Swap(int* a,int* b){int temp = *a;*a = *b;*b = temp;}
}
int Swap = 1;
int main()
{cout << Swap << endl;return 0;
}

那如何取RNG空间中定义的变量、函数、类呢?

这时需要在前面加上自定义的空间名字::

#include<iostream>
using namespace std;
namespace RNG
{void Swap(int* a,int* b){int temp = *a;*a = *b;*b = temp;}
}
int Swap = 1;
int main()
{cout << RNG::Swap << endl;return 0;
}

函数名代表该函数的地址,以地址形式打印。

除了上述命名空间的用法,命名空间还支持嵌套使用。

如:

namespace RNG
{void Swap(int* a,int* b){int temp = *a;*a = *b;*b = temp;}namespace rNG{int r = 10;}
}

需要注意的是:允许相同的空间名字存在,相同空间名会被编译器合并成一个空间名

比如:

namespace RNG
{void Swap(int* a,int* b){int temp = *a;*a = *b;*b = temp;}}
namespace RNG
{int Swap = 1;
}

这时候就相当于

namespace RNG
{void Swap(int* a,int* b){int temp = *a;*a = *b;*b = temp;}int Swap = 1;
}

会导致错误

四、命名空间的使用

使用命名空间中的内容有三种方式

第一种:使用using关键字,展开部分空间

#include<iostream>
namespace RNG
{void Swap(int* a,int* b){int temp = *a;*a = *b;*b = temp;}int a = 11;
}
using RNG::a;int main()
{printf("%d ", a);return 0;
}

其实这样就相当于

namespace RNG
{void Swap(int* a,int* b){int temp = *a;*a = *b;*b = temp;}
}int a = 11;

第二种:空间名+作用域限定符

#include<iostream>
namespace RNG
{void Swap(int* a,int* b){int temp = *a;*a = *b;*b = temp;}
}int a = 11;int main()
{printf("%p ", RNG::Swap);return 0;
}

第三种:展开命名空间

#include<iostream>
namespace RNG
{void Swap(int* a,int* b){int temp = *a;*a = *b;*b = temp;}int a = 11;
}using namespace RNG;int main()
{printf("%p %d\n", Swap, a);return 0;
}

全部展开相当于这样,一夜回到解放前,这样就会存在命名冲突的问题。

​
void Swap(int* a,int* b)
{int temp = *a;*a = *b;*b = temp;
}
int a = 11;​

但为什么c++代码前面经常加上using namespace std;

std就是一个命名空间的名字,它是standard的缩写。

相当于全部展开了std里面的函数、全局变量、类。

加上这句话后,我们就不需要使用std::cout

和std::endl,而是直接cout和endl了,这样在我们学习c++的过程中,使用起来方便。

一般在工程里面,我们一般不使用using namespace std,而是部分展开std中的内容。

比如

using std::cout;

using std::endl;

一般展开工程中使用次数最多的函数名、类名。

《C++初阶之路》命名空间的意义相关推荐

  1. 《C++初阶之路》函数重载

    一.本章重点 什么是函数重载? 函数重载的条件 为什么有函数重载? 为什么C不支持函数重载,C++确能支持函数重载? extern "C" 二.函数重载 2.1函数重载的概念 简单 ...

  2. 《C++初阶之路》inline函数

    一.本章重点 为什么要有inline函数(内联函数)? 什么是内联函数? 为啥所有函数不都改成内联? 内联函数的使用场景 内联函数注意事项 二.Inline函数 2.1为什么要有inline函数(内联 ...

  3. 趋势交易大师php,系统交易的初阶——趋势交易者路在何方?

    系统交易的初阶--趋势交易者路在何方? (2010-02-02 21:09:11) 标签: 股票 系统交易的初阶--趋势交易者路在何方? 问:我算是看明白了,其实你的问题太好理解了,记得金融怪杰里面有 ...

  4. 看雪学院课程《汇编语言详解与二进制漏洞初阶》笔记

    前言和声明 安全工程师这条路任重道远.如今国际形势复杂,网络战一旦爆发,安全势力弱的一方很快会处于竞争的下风,加上国家的安全人才缺口过大,我辈则应当肩挑重担,为祖国安全尽一份力. 本博客是博主在学习看 ...

  5. <初识C++(1)>《C++初阶》

    目录 <初识C++><C++>之学习 --By 作者:新晓·故知 1. C++关键字(C++98) 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 3. C++输入 ...

  6. 学习笔记:C++初阶【C++入门、类和对象、C/C++内存管理、模板初阶、STL简介、string、vector、list、stack、queueu、模板进阶、C++的IO流】

    文章目录 前言 一.C++入门 1. C++关键字 2.命名空间 2.1 C语言缺点之一,没办法很好地解决命名冲突问题 2.2 C++提出了一个新语法--命名空间 2.2.1 命名空间概念 2.2.2 ...

  7. SAP MM 初阶之事务代码MIGO中采购退货的处理

    SAP MM 初阶之事务代码MIGO中采购退货的处理 SAP项目实践中,采购收货流程是一个无法回避的流程. 仓库部门在收货的时候,会清点供应商送过来的商品的品类和各自的数量,看是否符合送货单,是否跟采 ...

  8. 《JavaEE初阶》HTTP协议和HTTPS

    <JavaEE初阶>HTTP协议和HTTPS 文章目录 <JavaEE初阶>HTTP协议和HTTPS HTTP协议是应用层协议: 使用Fiddler抓取HTTP请求和响应: F ...

  9. 《牛津字典精华总结》- 初阶系列 - 首页前言

    the Epilogue and Essential of 'Oxford Elementary Learner's Dictionary 2nd' 2008第一版总结,2011高阶版已经完全更新.完 ...

最新文章

  1. 学习javascript 的一点感想
  2. (转)angular进行md5加密 base64加密 哈希加密
  3. 安装pr_PR 一键转场插件 安装教程
  4. python实现英文新闻摘要自动提取_用python机器学习实现新闻关键词的抽取
  5. Microsoft SQL Server SA权限最新入侵方法
  6. C++Dynamic Array动态数组(附完整源码)
  7. Image inpainting 图像修补最新综述
  8. 带头结点的链式表操作集
  9. 法国 计算机 转专业,在法国留学怎样换专业
  10. Struts(十四):通用标签-form表单
  11. fastJson工具类
  12. 类与类加载器---《深入理解java虚拟机》
  13. [转载] 根据Python常见面试题来谈谈 Python 闭包
  14. 推荐一款手机app自动点击神器
  15. php做网站需要的技术,建网站需要什么技术
  16. 如何用markdown排版公众号,使用排版神器Markdown Nice
  17. 用互联网思维去做事之-(2)用户思维
  18. python列表get方法_Python json.get方法代码示例
  19. 面试秘籍 | 测试工程师的简历该怎么写?(带样例)
  20. java+mysql简单实现点赞评论转发帖子

热门文章

  1. WPF中使用浏览器控件WebBrowser
  2. 快递轨迹第三方接口接入(快递鸟)
  3. python文件中用逗号分隔_在python中读取逗号分隔文件(包括日期)的最快方式
  4. 如何防止电脑卡顿和C盘爆满
  5. 客服系统对接微信公众号-访客在聊天界面扫码-临时访客绑定公众号OpenID可接收客服回复消息通知...
  6. Java方向如何准备BAT技术面试答案(汇总版)
  7. 宇文成 Python 第七章 字符串与正则表达式
  8. Ubuntu 16.04 LTS版本部署Virtualmin
  9. python金融衍生品_什么是金融衍生品,金融衍生品有哪些?
  10. pta习题2-2 阶梯电价