C++中名称空间namespace的使用方法示例

 更新时间:2020年4月25日 17:29  点击:2069

命名空间

在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。

MFC中并没有使用命名空间,但是在.NET框架、MC++和C++/CLI中,都大量使用了命名空间。

我们常常会见到这样的语句:

using namespace std;

或者还有这样的:

using std::string;

这些其实就是使用了C++的名称空间技术。

什么是名称空间呢?名称空间可以看做一个声明区域,其区域内的变量在内部有效,比如假设有两个名称空间:

namespace Jack {
 double pail;
 void fetch();
}

namespace Jill {
 double pail;
 void fetch();
}

两个名称空间有着一样的变量,但因为是在不同的名称空间内,所以互相不会发生冲突。我们在使用时可以这样调用:

Jack::pail = 12.34;
Jill::pail = 56.78;
Jack::fetch();

所以,我们有时候也会看到这样的代码:

int x;
std::cin >> x;
std::cout << x << std::endl;

但如果我们使用了using声明,就可以简单一点:

using std::cin;
using std::cout;
using std::endl;
int x;
cin >> x;
cout << x << endl;

或者更简单的,我们可以使用using编译指令:

using namespace std;
int x;
cin >> x;
cout << x << endl;

其中,cin、cout、endl都是存在于std名称空间内的。

上面其实是两种using,一个叫using声明,一个叫using编译指令。using声明用于声明名称空间内的某一个变量或函数,而using编译指令会将整个名称空间全部都声明。

一般而言我们建议对需要的变量或函数使用using声明,这样就不用一股脑全部声明,难保有些变量或者函数在别的名称空间内也有,这样又会产生冲突,实际上这是不允许的。

名称空间也是可以嵌套的。

有些名称空间没有名字:

namespace {
 int ice;
 int water;
}

这种名称空间因为没有名字,所以不能用using声明和using编译指令来操作,也就不能再其他文件使用,只能在当前文件声明处到作用域结尾可用,这也就类似于static的作用了。实际上C++不建议使用static,而更推荐这种做法:

static int counts;// 不推荐
namespace {
 int counts;// 推荐
}
int main() {
 ...
}

而名称空间用的最多的地方,就是供其他文件去访问了。就像std一样。

对于名称空间的使用,也有一些指导原则:

  • 使用已命名的名称空间中声明的变量,而不是外部全局变量或静态全局变量。
  • 如果开发函数库或者类库,将其放在一个名称空间中。
  • 不要过度使用using编译指令。
  • 不要在头文件使用using编译指令,以防产生未知影响。
  • 导入名称时,首选使用using声明。
  • 对于using声明,首选将其作用域设为局部而不是全局。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对猪先飞的支持。

[!--infotagslink--]

相关文章

  • Swift中的命名空间详解

    这篇文章主要给大家介绍了关于Swift中命名空间的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
  • c# 如何使用 My 命名空间

    这篇文章主要介绍了c# 如何使用 My 命名空间,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2020-12-08
  • 浅析JavaScript中命名空间namespace模式

    namespace即“命名空间”,也称“名称空间” 、”名字空间”。接下来通过本文给大家介绍JavaScript中命名空间namespace模式的相关知识,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧...2016-06-24
  • C# 命名空间(Namespace)相关知识总结

    这篇文章主要介绍了C# 命名空间(Namespace)的相关知识,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以参考下...2020-11-03
  • C++与namespace有关的两个编译错误的讲解

    今天小编就为大家分享一篇关于C++与namespace有关的两个编译错误的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-04-25
  • php中命名空间namespace用法介绍

    PHP的命名空间(namespace)是php5.3之后才有的之前学习php所以没有这个东西了,最近用到了php命名空间了,下面我们一起来看看命名空间namespace用法 现在说这个,感觉有...2016-11-25
  • .net的命名空间类库的简单介绍

    .net的命名空间类库的简单介绍,需要的朋友可以参考一下...2020-06-25
  • 关于Java中XML Namespace 命名空间问题

    这篇文章主要介绍了Java中XML Namespace 命名空间,XML命名空间是由国际化资源标识符 (IRI) 标识的 XML 元素和属性集合,该集合通常称作 XML“词汇”,对XML Namespace 命名空间相关知识感兴趣的朋友一起看看吧...2021-08-14
  • 关于.NET的集合总结

    集合是一些有共同特征的独立数据项组成的,通过集合,我们可以可以使用相同的调用代码来处理一个集合的所有元素,而不用单独处理每一个单独的项...2021-09-22
  • C#命名空间与java包的区别分析

    这篇文章主要介绍了C#命名空间与java包的区别,较为详细的分析了C#命名空间与java包的相同点与不同点,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • PHP6 的namespace 命名空间

    php有namespace或类似的东西的。对于发布类库框架,或者构建大的程序来说是很重要的。可以避免类名和函数名冲突,又不用像Pear里那样把类名弄得老长。当初php5的测试版曾...2016-11-25
  • C++编程中的命名空间基本知识讲解

    这篇文章主要介绍了C++编程中的命名空间基本知识讲解,包括对C++11中内联命名空间新特性的介绍,需要的朋友可以参考下...2020-04-25
  • ASP.NET MVC命名空间时引起错误的解决方法

    这篇文章主要介绍了解决ASP.NET MVC 重命名(命名空间)而导致错误的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • C++命名空间实例解析

    这篇文章主要介绍了C++命名空间实例解析,对C++程序员来说是非常重要的知识点,需要的朋友可以参考下...2020-04-25
  • C++ namespace相关语法实例分析

    这篇文章主要介绍了C++ namespace相关语法实例分析,对C++初学者有很好的参考借鉴价值,需要的朋友可以参考下...2020-04-25
  • C++中名称空间namespace的使用方法示例

    namespace中文意思是命名空间或者叫名字空间,下面这篇文章主要给大家介绍了关于C++中名称空间namespace使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧。...2020-04-25
  • php中namespace use用法实例分析

    这篇文章主要介绍了php中namespace use用法,结合实例形式分析了PHP中命名空间的定义与使用技巧,需要的朋友可以参考下...2016-01-23
  • PHP namespace 命名空间详解

    在这里中我们介绍了php教程命名空间的用途和namespace关键字,在这篇文章中我们将介绍一下use命令的使用以及php如何解析命名空间的名字的。 namespace bakbaba; functi...2016-11-25
  • 详解C++ 动态内存分配与命名空间

    这篇文章主要介绍了详解C++ 动态内存分配与命名空间,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
  • PHP5.3 命名空间namespace 翻译

    PHP中的命名空间用来解决大型PHP库(libraries)中作用域的问题,在PHP中,所有的类定义都是全局的,所以,当一个库的作者为这处库创建多种应用或公共API类的时候,他必须清...2016-11-25