2015年1月21日晴

寒假第一天,程序猿的第一天,减肥的第一天(瘦了两斤,鼓掌

学要有所得,既然今天学了一天,是该好好整理一下今天所学的内容。

菜鸟一枚,如有bug还望指点一二。

-------------------------------------------------------华丽的分割线---------------------------------------------------------------

名字空间(namespace)

1.为什么需要名字空间呢?

假如你是月入上万的快递员蜀黍,有天你来到某某学校给小强送快递,可是一班有个小强,二班也有个小强。这小强怎么区分呢?
回到程序世界,一段程序中,可能有两个变量需要用到sum这个名字,除了改写成不同的sum(sum1或sum2)之外,我们还有什么方法呢?
啰嗦这么多,终于扯到namespace(名字空间)上来了。

2.什么是名字空间?

从字面意思我们就能理解,这是一个用来存放名字的空间,可能你还不太懂,我们下面看程序就知道了。
先给大家看一段最简单的c++程序,一定是每个初学者都会看到的代码:
#include <iostream>
using namespace std;
int main(){cout<<"hello world"<<endl;return 0;
}

在第二行我们看见了我们看到了namespace这个单词,很多初学者肯定不知道这是干什么的。老师或许告诉你,不用管他干什么的,知道写上去就行了。读书最怕一知半解,我们接下来就来看看这到底是干什么的。

3.名字空间的作用:

(1)划分逻辑单元

比如,一班的小强和二班的小强不是同一个小强。
一个是一班的,一个是二班的。我们从逻辑上把他们放在了不同的两个班级中。
一班、二班就是我们定义的两个逻辑单元。

(2)避免名字冲突

由上可知,小强这个名字冲突了。
通过加上名字空间(一班或者二班),我们就能有效的区分,避免了同名带来的名字冲突。

4.怎样定义名字空间?

说了那么多,这到底怎么用呢?这里又有三个知识点:

(1)名字空间定义

好吧,我们动手敲代码来区分这两个小强吧。
#include <iostream>
namespace Class1{char xq[] = "我是一班的小强";
}
namespace Class2{char xq[] = "我是二班的小强";
}
int main(){std::cout<<Class1::xq<<std::endl;std::cout<<Class2::xq<<std::endl;return 0;
}

ps:1.cout和endl这两个属于std这个名字空间

2.我们要使用名字空间的时候,可以用 "::"这个符号(下面我们会讲到)
运行这个程序你会发现,输出是不同的结果:
由此我们可以知道名字空间的定义方法了:
namespace 空间名{...}

(2)名字空间合并

我们再看这样一段代码:
#include <iostream>
using namespace std;
namespace Class1{char xq[] = "我是一班的小强";
}
namespace Class2{char xq[] = "我是二班的小强";
}
namespace Class1{void show(){cout<<xq<<endl;}
}
namespace Class2{void show(){cout<<xq<<endl;}
}
int main(){Class1::show();Class2::show();return 0;
}

我们可以看到,show()这个函数和xq字符串并没有定义在一起,而是分开定义,但是同时属于一个名字空间。

运行结果同上,节省空间不展示了。
这就是我们所说的名字空间的合并,只要名字空间一样无论你在哪里定义,最后都会合并在一起。

(3)声明定义分开

学过c或者c++对的同学知道,声明和定义其实是可以分开的。先写声明,后定义。那名字空间可以吗?
行不行,写出来就知道了。

#include <iostream>
using namespace std;
namespace Class1{char xq[] = "我是一班的小强";void show();
} // 声明
namespace Class2{char xq[] = "我是二班的小强";void show();
} //声明int main(){Class1::show();Class2::show();return 0;
}
namespace Class1{void show(){cout<<xq<<endl;}
} // 定义
namespace Class2{void show(){cout<<xq<<endl;}
} //定义

运行结果同样一样,果然和我们以前学的声明定义一样,是可以分开的写的。

5.怎样使用名字空间?

既然我们已经定义好了名字空间了,怎么使用它呢?上面的代码我们已经使用了其中一种方法。接下来我给大家说三种方法:

(1)作用域限定符(“  :: ”)

这个相信大家并不陌生了,因为上面我们已经用到了 。

用法就是在你要使用的变量或者函数名前加上“名字空间名 ::”,如“Class1::”

(2)名字空间指令

其实这个我们之前也看到过,在最上面那段最简单的c++代码中的第二行:using namespace std;
具体用法是这样:using namespace + 空间名;
写段代码看看怎么用:
#include <iostream>
using namespace std;
namespace Class1{char xq[] = "我是一班的小强";void show(){cout<<xq<<endl;}
}
namespace Class2{char xq[] = "我是二班的小强";void show(){cout<<xq<<endl;}
}
int main(){using namespace Class1;show();Class2::show();return 0;
}

运行结果还是一样的,main函数的第二行调用的show()函数为什么是名字空间Class1里面的show呢?

因为我们使用了指令了using,把Class1这个名字空间解放出来了。也就是说从main函数一行之后凡是调用Class1名字空间里面的东西都可以省略前面的;;作用域限定符。
这也就是为什么使用了using namespace std 之后,cout和endl之前可以不用加上std::啦。
那又人或说了,既然这么方便那我以后就直接这么用吧。可是还有一点需要注意的地方。
如果main函数里面我这样写:
using namespace Class1;
using namespace Class2;
show();

结果肯定就是编译器(我用的codeblocks)报错了。

编译器提示说show()是有歧义的。
所以使用using的时候,会把你划分的逻辑单元的围墙推倒(比喻一下),名字冲突的问题再一次产生,也就失去了我们使用名字空间的意义。
所以个人建议这种方法最好不用。

(3)名字空间声明

这种方法其实只是比第二种方法稍微改进一步。
具体看程序(前面因为一样的就省略):
int main(){using namespace Class1;using Class2::show;show();return 0;
}

最后使用的是Class2里面的show。

虽然一开始你告诉编译器我使用的是Class1的名字空间,但是我任性的要使用Class2里面的show,编译器只好听你的。
这种方法容易让人产生误导,最好还是怪怪使用方法一比较靠谱些(除非你很懒)。

6.关于名字空间还需要注意的地方:

(1)无名名字空间

顾名思义,就没有名字的名字空间(我是无名氏,阿啦啦啦~~~~)
什么意思呢?请看程序
#include <iostream>
using namespace std;
char my[] = "我是谁?";
int main(){cout<<::my<<endl;return 0;
}

my是一个我们经常使用的全局变量,可能在我们没说名字空间之前你没有注意它的名字空间是什么吧?

一句话,没有定义在任何名字空间的,都属于无名名字空间。
无名名字空间这么定义:namespace {..}
无名名字空间这样使用: ::变量名(或函数名)
发明c++的人还真是无聊

(2)名字空间的嵌套

我们知道,循环、函数有嵌套,那么名字空间也是有嵌套的。
怎么个嵌套法?还是以程序说明(眼见为实)
#include <iostream>
using namespace std;
namespace hnsd{namespace sjy{namespace jsj{char xq[] = "小强";}}
}
int main(){cout<<hnsd::sjy::jsj::xq<<endl;   // 嵌套的名字空间需要一层一层的解析return 0;
}

大部分用法和上面的一样,唯一要注意的地方就是,你嵌套了多少层,就需要解析多少层(也就是::符号要用几个啦,注意上下层次的关系不要弄错了)

(3)给名字空间取别名

从上面的代码我们可以看见,如果要用xq,前面还得加上“hnsd::sjy::jsj”一长串的名字空间,如果每次调用都写这么多,是不是太麻烦了一点?
怎么办?看来只好取个别名呢?怎么取呢?看如下代码:
namespace name = hnsd::sjy::jsj;
cout<<name::xq<<endl;

这效果是一样一样的。很简单吧?

【c++笔记一】名字空间(namespace)相关推荐

  1. c++ 名字空间 namespace

    定义 namespace 名字空间的名字{ 全局变量 类型定义 函数 } 意义 对于一个较大型的C++程序来说,需要由多个程序员相互协作编写,这样的情况下容易出现不同程序员在需要负责的程序部分使用相同 ...

  2. C++程序设计语言学习笔记:名字空间

    1.名字空间(namespace)的概念用来直接表示本属一体的一组特性,例如库代码.名字空间的成员都位于相同的作用域中,无需特殊符号即可相互访问,而从名字空间外访问它们就需要显式符号. 2.显式限定: ...

  3. 名字空间(namespace)

    作用:缓解名字污染. 访问名字空间内成员.类的三种方式: 1.名字空间别名 namespace International_Business_Machines { int a; .... } //别名 ...

  4. C++ 名字空间(namespace)

    C++支持多种作用域:全局域.局部域.块域.类域,还有名字空间域等. 作用域:规定变量能够被访问的范围,离开这个范围的变量不能被访问. 作用域是一个独立的地盘,让变量不会暴露出去,也就是说作用域最大的 ...

  5. C++引入名字空间(namespace)意义何在?为什么using namespace std会成为常用语句?

    在没有引入名字空间的概念之前,用户在一个cpp文件(即用C或C++代码写的源码文件)的开始位置一般会引入头文件,比如<stdio.h>,这里面就有已经定义好的全局变量.函数名.和类名,如果 ...

  6. c++ 静态类成员函数(static member function) vs 名字空间 (namespace)

    好多人喜欢把工具函数做成static member function.这样以增加隐蔽性和封装性,由其是从C#,java转而使用c++的开发人员. 例如: class my_math { public: ...

  7. python 作用域 前缀_Python 之作用域和名字空间

    作用域与名字空间 Python有一个核心概念是名字空间(namespace),namespace是一个name到object 的映射关系,Python有很多namespace,因此,在代码中如果碰到一 ...

  8. java schema名_关于Schema的名字空间

    基本的 XML Schema 的使用就是这样,下面我们要介绍 XML Schema 的另外一个核心的部分也是 Schema 最关键的一个部分,就是关于 Schema 的名字空间( namespace ...

  9. c++之头文件基本输出,输入,名字空间,引用,内联函数,函数重载,缺省参数

    c++之头文件,基本输出,输入,名字空间,引用,内联函数,函数重载,缺省参数 文章目录 c++之头文件,基本输出,输入,名字空间,引用,内联函数,函数重载,缺省参数 前言 一.头文件,基本输出,输入 ...

  10. python的名字空间(namespace)与作用域(scope)

    名字空间(namespace) 1).名字(name)与对象(object) 对象:对象一块存储区域,用来存储值,同时包含对该值所支持的一系列方法,也包含一系列属性. 名字:每个名字对应一个对象,多个 ...

最新文章

  1. OKR的实施案例:OKR不需要很复杂
  2. NBT:南农突破成果—噬菌体:土壤“狙击手”激发根际防御军团(附视频)
  3. 19、修改和删除事件(ALTER/DROP EVENT)
  4. ebay注册流程_跨境电商平台eBay企业入驻流程
  5. 没想到啊!3980元的Web前端视频今日免费送。
  6. Linux Shell脚本入门教程系列之(十四) Shell Select教程
  7. Python常用第三方库大盘点
  8. 免费报名通道限时开启!解锁QCon「AI 时代下的融合通信技术」专场
  9. SQL必知必会-更新和删除数据
  10. e4a生成r.java错误,编译时候出现英文错误
  11. flash人物原地走路_Flash怎么制作一个行走的小人动画?
  12. 因为计算机丢失d3dx10,Win7打开剑灵游戏提示丢失d3dx10_43.dll怎么解决
  13. 【UE4】Bounds 详解
  14. uni-app 开发小程序,使用到u-charts.js时会出现弹框或下拉框部分与图标重叠的情况(还有在解决过程中出现 vasToTempFilePath: fail canvas is empty)
  15. 计算机设备2后符号,表情符号含义展示的方法及设备与流程
  16. □ 影片名:《陈好-女人要爱自己》(7012) 在线播放
  17. 创意休闲手游《急速感染》震撼来袭~
  18. 加入滚动条的html代码
  19. 收敛级数加发散级数是什么情况?
  20. LMS自适应滤波算法的 matlab实现

热门文章

  1. Safari 14.0 版本安装json插件
  2. 007 定位明文封包call
  3. Install Cypress
  4. 反射之前奏Oracle简单版
  5. 尘梦留痕:苏东坡的诗词里,藏着六种人生智慧
  6. 微信网页开发(5)--invalid signature/permission denied/offline verifying等错误处理
  7. 群体遗传学习笔记-基础篇
  8. Oracle初学者入门指南-什么是DSI?
  9. nxp的bluetooth驱动调试
  10. android简单悬浮窗源码,Android 悬浮窗的实现源码