《C++初阶之路》命名空间的意义
一、本章重点
- 为什么有命名空间?
- 什么是命名空间?
- 命名空间的使用
二、为什么要存在命名空间?
我们需要知道的是: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++初阶之路》命名空间的意义相关推荐
- 《C++初阶之路》函数重载
一.本章重点 什么是函数重载? 函数重载的条件 为什么有函数重载? 为什么C不支持函数重载,C++确能支持函数重载? extern "C" 二.函数重载 2.1函数重载的概念 简单 ...
- 《C++初阶之路》inline函数
一.本章重点 为什么要有inline函数(内联函数)? 什么是内联函数? 为啥所有函数不都改成内联? 内联函数的使用场景 内联函数注意事项 二.Inline函数 2.1为什么要有inline函数(内联 ...
- 趋势交易大师php,系统交易的初阶——趋势交易者路在何方?
系统交易的初阶--趋势交易者路在何方? (2010-02-02 21:09:11) 标签: 股票 系统交易的初阶--趋势交易者路在何方? 问:我算是看明白了,其实你的问题太好理解了,记得金融怪杰里面有 ...
- 看雪学院课程《汇编语言详解与二进制漏洞初阶》笔记
前言和声明 安全工程师这条路任重道远.如今国际形势复杂,网络战一旦爆发,安全势力弱的一方很快会处于竞争的下风,加上国家的安全人才缺口过大,我辈则应当肩挑重担,为祖国安全尽一份力. 本博客是博主在学习看 ...
- <初识C++(1)>《C++初阶》
目录 <初识C++><C++>之学习 --By 作者:新晓·故知 1. C++关键字(C++98) 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 3. C++输入 ...
- 学习笔记: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 ...
- SAP MM 初阶之事务代码MIGO中采购退货的处理
SAP MM 初阶之事务代码MIGO中采购退货的处理 SAP项目实践中,采购收货流程是一个无法回避的流程. 仓库部门在收货的时候,会清点供应商送过来的商品的品类和各自的数量,看是否符合送货单,是否跟采 ...
- 《JavaEE初阶》HTTP协议和HTTPS
<JavaEE初阶>HTTP协议和HTTPS 文章目录 <JavaEE初阶>HTTP协议和HTTPS HTTP协议是应用层协议: 使用Fiddler抓取HTTP请求和响应: F ...
- 《牛津字典精华总结》- 初阶系列 - 首页前言
the Epilogue and Essential of 'Oxford Elementary Learner's Dictionary 2nd' 2008第一版总结,2011高阶版已经完全更新.完 ...
最新文章
- 学习javascript 的一点感想
- (转)angular进行md5加密 base64加密 哈希加密
- 安装pr_PR 一键转场插件 安装教程
- python实现英文新闻摘要自动提取_用python机器学习实现新闻关键词的抽取
- Microsoft SQL Server SA权限最新入侵方法
- C++Dynamic Array动态数组(附完整源码)
- Image inpainting 图像修补最新综述
- 带头结点的链式表操作集
- 法国 计算机 转专业,在法国留学怎样换专业
- Struts(十四):通用标签-form表单
- fastJson工具类
- 类与类加载器---《深入理解java虚拟机》
- [转载] 根据Python常见面试题来谈谈 Python 闭包
- 推荐一款手机app自动点击神器
- php做网站需要的技术,建网站需要什么技术
- 如何用markdown排版公众号,使用排版神器Markdown Nice
- 用互联网思维去做事之-(2)用户思维
- python列表get方法_Python json.get方法代码示例
- 面试秘籍 | 测试工程师的简历该怎么写?(带样例)
- java+mysql简单实现点赞评论转发帖子
热门文章
- WPF中使用浏览器控件WebBrowser
- 快递轨迹第三方接口接入(快递鸟)
- python文件中用逗号分隔_在python中读取逗号分隔文件(包括日期)的最快方式
- 如何防止电脑卡顿和C盘爆满
- 客服系统对接微信公众号-访客在聊天界面扫码-临时访客绑定公众号OpenID可接收客服回复消息通知...
- Java方向如何准备BAT技术面试答案(汇总版)
- 宇文成 Python 第七章 字符串与正则表达式
- Ubuntu 16.04 LTS版本部署Virtualmin
- python金融衍生品_什么是金融衍生品,金融衍生品有哪些?
- pta习题2-2 阶梯电价