C++ 命名空间

转载 2013年12月04日 20:07:54

  • 命名空间:由一个程序设计者命名的内存区域
    • 比如ns1::a,命名空间限定符+限定名字
  • 命名空间声明:
    • namespace 命名空间名
    • {
    •     变量,函数,结构体,类,模板,其他命名空间
    • }

    • 无命名空间:作用范围在本文件
    • namespace // 命名空间没有名字
    • { ...... }
  • 命名空间的使用方法
    • using namespace name 使用整个命名空间
    • using name::variable 使用命名空间中的某一个变量(即使这个命名空间没有被完全打开,我们仍然可以通过这种方式来使用这个空间中的某个变量)
    • ::variable 使用默认命名空间中的变量,
    • namespace TV=Television; // 别名TV与Television等价

    • 在默认情况下,可以直接使用命名空间中的所有标示符。
      • 例:
      • #include <iostream>
        using namespace std;
        namespace ns1
        {
            const double RATE = 3.3;    // 常量
            double pay = 0;             // 变量
            double tax(int distance)    // 函数
            {
                return distance*RATE;
            }
            namespace ns2               // 嵌套命名空间
            {
                int num = 0;
                double pay = 1;
            }
        }
        
        int main()
        {
            using namespace ns1;
            cout << ns1::RATE << endl;      // 结果3.3
            cout << ns1::tax(3) << endl;    // 结果9.9
            using ns1::pay;
            cout << pay << endl;            // 结果0,等同于ns1::pay
            cout << ns1::ns2::num << endl;  // 结果0
            cout << ns1::ns2::pay << endl;  // 结果1
            return 0;
        }
        
  • 使用命名空间注意:
    • 1. 如果仅仅打开第一层命名空间,即使在程序的运行过程中再通过第一层命名空间去访问第二层命名空间也是无法实现的,例如:
      • #include <iostream>
        using namespace std;
        
        namespace first
        {
            int b = 0;
            namespace first
            {
                int i = 5;
            }
        }
        
        int main()
        {
            using namespace first;
            cout << first::first::i << endl; //错误
        
            return 0;
        }

    • 2. 命名空间在嵌套的时候可以使用相同的名字,不过在打开命名空间的时候要按照顺序打开,同时作用域也是不相同的。例如:
      • #include <iostream>
        using namespace std;
        
        namespace first
        {
            int i = 0;
            namespace first
            {
                int i = 5;
            }
        }
        
        int main()
        {
            using namespace first::first;
            cout << i << endl;               // 结果为5
            cout << first::i << endl;        // 结果为0
            cout << first::first::i << endl; // 结果为5
        }
      • 通过using namespace first::first打开了名字为first和first的嵌套命名空间(第一个first嵌套第二first),这个时候实际上我们把两个first都打开了,所以实际上我们可以使用两个命名空间了
        • 程序开始运行的时候就已经确定直接打开第二层first的命名空间,所以这个时候打印的i是第二层命名空间对应的i.
        • frist::i,也就是打印第一层命名空间中的i。
        • first::first::i,也就是打印第二层命名空间中的i。
    • 3. 一个命名空间下可以嵌套多个命名空间,这多个命名空间可以重名(相当于分开定义空间中变量),不过重名的时候空间中的标示符不允许相同,否则程序运行报错。
      • #include <iostream>
        using namespace std;
        
        namespace first
        {
            namespace first
            {
            int i = 0;
            }
            namespace first
            {
            int b = 8;
            //    int i = 2;  // 前面已经定义,会有冲突
            }
        }
        
        int main()
        {
            using namespace first::first;
            cout << first::first::i << endl;
            return 0;
        }
  • 标志命名空间std:在std中定义和声明的所有标示符在本文件中都可以作为全局使用。但不能再定义和命名空间std的成员同名的标识符。

参考文章:

在c++中怎么创建命名空间

什么是命名空间呢?举一个现实中的例子,命名空间就像是一个企业,每个企业都有自己的员工。在这里假设每一个员工代表一个类,于是每一个命名空间中都包含若干个类。优于命名空间不同,编译器就可以将同名的类区别开...
  • zhaoyinhui0802
  • zhaoyinhui0802
  • 2017年05月13日 11:35
  • 1423

C++中的命名空间namespace

在一个企业级的开发中,一个工程往往会很大,定义的类和方法也会特别多,而且还会引入很多的第三方库,这就不可避免的会有一些同名的冲突问题。在Java中有包(Package)的概念,也就是将不同功能的类分成...
  • luoweifu
  • luoweifu
  • 2015年03月09日 00:03
  • 3229

C++命名空间namespace的使用规范

1.命名空间 namespacens { ………//将内容添加到命名空间中 } using namespace ns; ……..//声明命名空间后,表示ns命名空间里面的内容对于这条声明后的代码是...
  • wsx199397
  • wsx199397
  • 2016年09月09日 20:30
  • 1829

C++命名空间的几种玩法

**什么是命名空间?** 命名空间域是随标准C++而引入的。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字: names...
  • summy_J
  • summy_J
  • 2017年02月20日 20:47
  • 682

C++ STL之命名空间、函数模板、类模板

1 命名空间 #include //using namespace std; namespace name1 { int max(int a,int b) { int result= ...
  • feng1790291543
  • feng1790291543
  • 2016年12月04日 12:19
  • 619

C++自定义命名空间编写

记录一下自定义命名空间的写法 0x00 代码实现 1、定义命名空间 namespace ReacherNameSpace { //int count_value = 10; //extern ...
  • u012870721
  • u012870721
  • 2017年08月29日 15:04
  • 162

c++命名空间及项目中引用的小技巧

c++命名空间的用法引用:http://blog.sina.com.cn/s/blog_986c99d601010hiv.html 最近在看项目的源代码,看到了这个用命名空间的小技巧,所以写下这篇文...
  • eeekkk
  • eeekkk
  • 2013年11月06日 22:52
  • 1090

C++库研究笔记——命名空间namespace 嵌套后的作用域问题

总结: 1.::ant 表根命名空间,或匿名空间 2.同时存在 ::ant::i 和::ant::blas::i,  ant::detail::i时,在::ant::detail中使用i时,默认调...
  • mathgeophysics
  • mathgeophysics
  • 2013年08月03日 13:45
  • 5266

C++std命名空间详解

转自http://qiusuoge.com/9811.html 什么是命名空间 在编程语言中,命名空间是一种特殊的作用域,它包含了处于该作用域中的所有标示符,而且其本身也是由标示符表示的。命名空间的使...
  • zhouxianglun
  • zhouxianglun
  • 2015年07月19日 15:11
  • 5718

C++基础篇--作用域和自定义命名空间

引子    为引出本文主题,先举个例子,以便后文对照理解:某学校一年招了3个叫李明的学生,为便于区分:1)按年龄排序分别称大、中、小李明;2)把他们分到不同班,这样各班内部就没有同名的李明,而学校范围...
  • ipmux
  • ipmux
  • 2015年03月23日 17:19
  • 3330
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 命名空间
举报原因:
原因补充:

(最多只允许输入30个字)