通过使用名空间(Namespaces)我们可以将一组全局范围有效的类、对象或函数组织到一个名字下面。换种说法,就是它将全局范围分割成许多子域范围,每个子域范围叫做一个名空间(namespaces).

使用名空间的格式是:

namespace identifier
    {
        namespace-body
    }

这里identifier 是一个有效的标示符,namespace-body 是该名空间包含的一组类、对象和函数。例如:

namespace general
    {
        int a, b;
    }

在这个例子中,a 和 b 是名空间general中的整型变量。要想在这个名空间外面访问这两个变量,我们必须使用范围操作符::。例如,要想访问前面的两个变量,我们需要这样写:

general::a
general::b

名空间(namespaces)的作用在于全局对象或函数很有可能重名而造成重复定义的错误,名空间的使用可以避免这些错误的发生。例如:

// namespaces
    #include <iostream.h>
    
    namespace first {
        int var = 5;
    }
    
    namespace second {
        double var = 3.1416;
    }
    
    int main () {
        cout << first::var << endl;
        cout << second::var << endl;
        return 0;
    }   
        
5
3.1416

在这个例子中,两个都叫做var全局变量同时存在,一个在名空间first 下面定义,另一个在 second下面定义,由于我们使用了名空间,这里不会产生重复定义的错误。

名空间的使用 (using namespace)
使用 using 指令后面跟namespace可以将当前的嵌套层与一个指定的名空间连在一起,以便使该名空间下定义的对象和函数可以被访问,就好像它们是在全局范围内被定义的一样。它的使用遵循以下原型定义:

using namespace identifier;
例如:

// using namespace example
    #include <iostream.h>
    
    namespace first {
        int var = 5;
    }
    
    namespace second {
        double var = 3.1416;
    }
    
    int main () {
        using namespace second;
        cout << var << endl;
        cout << (var*2) << endl;
        return 0;
    }            
3.1416
6.2832

在这个例子中的main函数中可以看到,我们能够直接使用变量var 而不用在前面加任何范围操作符。

这里要注意,语句using namespace 只在其被声明的语句块内有效(一个语句块指在一对花括号{}内的一组指令),如果using namespace是在全局范围内被声明的,则在所有代码中都有效。例如,如果我们想在一段程序中使用一个名空间,而在另一段程序中使用另一个名空间,则可以像以下代码中那样做:

// using namespace example
    #include <iostream.h>
    
    namespace first {
        int var = 5;
    }
    
    namespace second {
        double var = 3.1416;
    }
    
    int main () {
        {
            using namespace first;
            cout << var << endl;
        }
        {
            using namespace second;
            cout << var << endl;
        }
        return 0;
    }   
            
5
3.1416

别名定义(alias definition)
我们以可以为已经存在的名空间定义别名,格式为:

namespace new_name = current_name ;

标准名空间(Namespace std)
我们能够找到的关于名空间的最好的例子就是标准C++ 函数库本身。如ANSI C++ 标准定义,标准C++库中的所有类、对象和函数都是定义在名空间std下面的。

你可能已经注意到,我们在这个教程中全部忽略了这一点。作者决定这么做是因为这条规则几乎和ANSI 标准本身一样年轻 (1997) ,许多老一点的编译器并不兼容这条规则。

几乎所有的编译器,即使是那些与ANSI 标准兼容的编译器,都允许使用传统的头文件 (如iostream.h, stdlib.h, 等等),就像我们在这个教程中所使用的一样。然而,ANSI标准完全重新设计了这些函数库,利用了模板功能,而且遵循了这条规则将所有的函数和变量定义在了名空间std下。

该标准为这些头文件定义了新的名字,对针对C++的文件基本上是使用同样的名字,但没有.h的扩展名,例如, iostream.h 变成了iostream。

如果我们使用ANSI-C++ 兼容的包含文件,我们必须记住所有的函数、类和对象是定义在名空间 std 下面的,例如:

// ANSI-C++ compliant hello world
    #include <iostream>
    
    int main () {
        std::cout << "Hello world in ANSI-C++\n";
        return 0;
    }   
            
Hello world in ANSI-C++

更常用的方法是使用using namespace ,这样我们就不必在所有标准空间中定义的函数或对象前面总是使用范围操作符::了 :

// ANSI-C++ compliant hello world (II)
    #include <iostream>
    using namespace std;
    
    int main () {
        cout << "Hello world in ANSI-C++\n";
        return 0;
    }    
            
Hello world in ANSI-C++

对于STL 用户,强烈建议使用ANSI-compliant 方式来包含标准函数库。

名空间 (Namespaces)相关推荐

  1. C++ 高级篇(二)—— 名空间 (Namespaces)

    通过使用名空间(Namespaces)我们可以将一组全局范围有效的类.对象或函数组织到一个名字下面.换种说法,就是它将全局范围分割成许多子域范围,每个子域范围叫做一个名空间(namespaces). ...

  2. 打包几乎各程序都需要用到的宏命令和使用名空间

    文件C.h中用宏命令包含了几乎各程序都需要用到的C++头文件,以后的程序,只要用到C++的头文件,只需将文件C.h包含即可. //C.h 打包几乎各程序都需要用到的宏命令和使用名空间 #ifndef ...

  3. using和名空间namespace

    using 指令后面跟namespace可以将当前的嵌套层与一个指定的名空间连在一起,以便使该名空间下定义的对象和函数可以被访问. 我们能够直接使用在namespace中定义的变量而不用在前面加任何范 ...

  4. 名空间(namespace)

    在C++编程中,变量和函数等的作用范围是有限制的,在函数内定义的变量就不可以在函数外使用.引入名空间(namespace)可解决变量和函数的作用范围. 在一个名空间中可以定义一组变量和函数,这些变量和 ...

  5. python之路day10-命名空间和作用域、函数嵌套,作用域链、闭包

    楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y):m = x if x>y else yreturn mbigger = my_max(10,20)print(b ...

  6. 网络虚拟化基础一:linux名称空间Namespaces

    一 介绍 如果把linux操作系统比作一个大房子,那命名空间指的就是这个房子中的一个个房间,住在每个房间里的人都自以为独享了整个房子的资源,但其实大家仅仅只是在共享的基础之上互相隔离,共享指的是共享全 ...

  7. C++:05---命名空间

    一.概念: ①类似于仓库,空间内存储代码,需要用到时调用 ②也为防止名字冲突提供了更加可控的机制 二.命名空间的定义 定义的基本格式如下: namespace 命名空间名 { //一系列声明与定义 } ...

  8. C++:02---命名空间

    一.概念: ①类似于仓库,空间内存储代码,需要用到时调用 ②也为防止名字冲突提供了更加可控的机制 二.命名空间的定义 定义的基本格式如下: namespace 命名空间名 { //一系列声明与定义 } ...

  9. django-命名空间与反向解析-模板反向解析-视图反向解析

    小结 普通的反向解析 在路由中给一个路径起了别名 path('url/', views.url, name="别名") 1,在模板中如何进行反向解析 2,在视图函数中如何进行反向解 ...

最新文章

  1. 中国水务行业运行状况调研与投资前景规划预测报告2022-2027年新版
  2. PLSQL_Database Link的基本概念和用法(概念)
  3. 矩阵乘法如何去逆矩阵_矩阵乘法和求逆
  4. 一般动态规划问题合集(Leetcode题解-Python语言)
  5. java枚举的特点_Java中有些好的特性(二):枚举
  6. 安全使用计算机事例,计算机安全案例分析.ppt
  7. 谈判中,要学会“留一手”
  8. ZooKeeper系列(3):znode说明和znode状态
  9. Jmeter安装TPS插件
  10. 高效程序员的45个习惯
  11. 读《未来世界的幸存者》 -- 阮一峰
  12. 第五章 定积分及其应用
  13. 计算机安全反思报告书,计算机数据安全教学反思.doc
  14. 给键盘加上音效(机械键盘音效)
  15. 分享一个好用的CSS布局
  16. Redis集群生产环境搭建,主从搭建,动态增删步骤
  17. 关于iphone、QQ通讯录、飞聊联系人排序设计的思考
  18. 自然语言语义相似度计算方法
  19. 给UMEditor 增加placeholder
  20. 从立项到发布仅三个月,开源技术问答社区 Answer 是如何诞生的?

热门文章

  1. 安装Ubuntu13.10 - Saucy Salamander(活泼的蝾螈)后的首要事情
  2. html5 指纹识别,Http指纹识别技术
  3. asp.net806-人力资源管理系统#毕业设计
  4. Linux下的Vlan子接口(逻辑子接口)
  5. 现在分词和不定式都是可以做状语的,但二者有区别
  6. 如何提高自己的写作能力
  7. 小灰熊卡拉OK字幕设计工具KBuilder 3.5 使用说明
  8. 生鲜行业B2B交易管理系统:助力企业一体化管理,促进生鲜企业线上线下融合
  9. 亚信23年笔试(40道)
  10. 开源引领创新,云原生主题论坛资料呈现 | 长沙1024程序员节