namespace 命名空间

一、命名空间的定义

namespace 命名空间的名字 {类/变量/函数/模板/其他命名空间};

命名空间空间可以定义在全局作用域和其他命名空间中,但不能定义在函数或类的内部。

二、命名空间的作用域

每一个命名空间都是一个作用域,定义在某个命名空间中的名字可以被该命名空间内的其他成员访问,也可以被这些成员的内嵌作用域中的任何单位访问。

namespace nsp{
    int num=10;
    class ab
    {
        public:
        int val(){return num;}
    };
    }
int val(){return num;}     //num未定义

命名空间可以使不连续的,也就是说可以定义一个新的命名空间,也可以为已经存在的命名空间添加新成员

namespace nsp{
    int num=10;
    class ab
    {
    public:
        int val(){return num;}
        ab& operator=(const ab&);
    private:
        string Simat;
    };
    }
namespace nsp{
    ab& ab::operator=(const ab&rs)
    {
        if(this!=&rs)
        {
            ab ls(rs);
            string temp=ls.Simat;
            ls.Simat=Simat;
            Simat=temp;
        }
        return *this;
    }
}

全局作用域中定义的名字也就是定义在全局命名空间中,他以隐式的方式声明,因而也不会有名字。

我们访问可以用

::member_name   //表示一个全局命名空间的一个成员

未命名的命名空间指那么namespace之后直接接花括号,他具有静态生命周期(用于取代静态声明)。

形如 namespace {int i;}

三、命名空间的使用

命名空间别名

namespace 别名=原来的名字; //主要用于名字过长

using 声明

一条using声明语句一次只引入命名空间的一个成员

using 指示

using指示将某个命名空间所有名字可见

namespace pro1
{
    int i=1;
    int j=2;
}
namespace pro2
{
    int k=3;
    int m=4;
}
void f()
{
    using pro1::i;     //using声明
    using namespace pro2;   //using 指示
    cout<<i<<" "<<k<<endl;
    //  cout<<j<<endl;     error: ‘j‘ was not declared in this scope
}

四、命名空间查找规则

常规查找规则:由内到外依次查找每个外层作用域。

实参相关的查找:当我们给函数传递一个类类型对象时,除了常规的作用域查找,还继续查找实参类所属的命名空间(指针与引用同样有效)

//下面两种调用等价
operator>>(std::cin,s);  //在没有声明string的operator>>时我们可以直接使用

std::string s;
std::cin>>s;

友元声明与实参相关的查找:

namespace pro1
{
    class C{
        friend void f2();
        friend void f(const C&);
    };
    void f2()
    {

    }

    void f(const pro1::C& a)
    {

    }
}

void f3()
{
    pro1::C cobj;
    f(cobj);    //f在C所属的命名空间进行了隐式声明(实参cobj),所以可以被找到
//   f2();      //没有形参所以找不到
}

重载与命名空间

using声明的是一个名字所以对于一个函数的声明只能有函数名

using NS::print(int);  //这是错误的

using NS::print;  //只声明一个函数名

因而一个using声明会包括所有的重载函数版本

using指示则会将命名空间的某个函数与作用域内的同名函数都作为重载函数版本

namespace AW
{
   int print(int);
}

namespace Pri
{
  double print(double);
}

using namespace Pri;
using namespace AW;

string print(string);

int main()
{
  print(1);   //调用AW::print
  print(1.1);  //调用Pri::print
  print("abc");
  return 0;
}
时间: 2024-07-30 17:08:20

namespace 命名空间的相关文章

php中的namespace 命名空间

名字解释: namespace(命名空间),命名空间是从php5.3开始支持的功能.作用主要有两个:1.可以避免类名取得过长.2.当在多个框架配合使用时,同名的类之间不会冲突. 命名空间,看名字就知道,目的就是为了命名的,不然咋不叫QQ空间 盗梦空间 七度空间.额 好像有奇怪的掺进来了. 下面是示例代码: 1 //在test1.php 中有一个类 叫做Person,它放在一个叫shop的namespace里. 2 <?php 3 namespace shop;//这个声明要放在php文件的最上面

XML Namespace 命名空间

根据 Namespaces in XML W3C 推荐标准的定义,XML 命名空间 是由国际化资源标识符 (IRI) 标识的 XML 元素和属性集合:该集合通常称作 XML“词汇”. 定义 XML 命名空间的主要动机之一是在使用和重用多个词汇时避免名称冲突.XML 模式用于为 XML 实例创建一个词汇并频繁使用命名空间.因此,正确理解命名空间概念对于从总体上理解 XML 模式和实例验证至关重要. 命名空间在多个方面类似于 Java 中的程序包: Java 中的程序包可以包含许多可重用的类和接口.

第一章 01 namespace 命名空间

一.什么是namespace? namesapce是为了防止名字冲突提供的一种控制方式. 当一个程序需要用到很多的库文件的时候,名字冲突有时无法避免.之前的解决思路是使用更长的变量名字,使用不方便. 二.命名空间的定义 1.namespace   空间名称 { 变量: 函数: 类: } 三.命名空间的特点 1.每个命名空间都有自己的作用域: 2.命名空间可以是不连续的,正像代码中的所列举的例子: 1.1 如何理解命名空间的作用域 1 namespace global_namespace{ 2 3

Python Namespace - 命名空间

命名空间 命名空间 namespace 对 python 来说是一个非常核心的概念,整个 python 虚拟机运行的机制与 namespace 概念有这非常紧密的联系. 从'赋值'说起, python 中的赋值语句是一类特殊的语句,原因是因为它们会影响 namespace. python 中的赋值语句首先创建一个 对象 object,然后将 obj '赋值' 给一个名字 name (理解为赋值给一个变量) 赋值语句执行后, 我们的一个 name 和 object 的关联关系, 称之为'约束',

关于js中namespace命名空间模式

命名空间有助于减少程序中所需要的全局变量的数量,并且同时有助于避免命名冲突或过长的名字前缀. 关于命名空间的例子: 1 /** 2 * 创建全局对象MYAPP 3 * @module MYAPP 4 * @title MYAPP Global 5 */ 6 var MYAPP = MYAPP || {}; 7 8 /** 9 * 返回指定的命名空间,如果命名空间不存在则创建命名空间. 10 * 备注:命名时需小心,注意保留关键字,可能在一些浏览器无法使用. 11 * 12 * @method n

namespace命名空间与define预处理

在c++语言中是namespace是定义命名空间,或者说是定义作用域,在c++中最常见的划分作用域是使用{},同时C++里有define关键词,用来定义一个宏,或者说是预处理变量,那么这种预处理变量与namespace又如何去划分呢?示例代码如下: #include <iostream> using std::endl; using std::cout; namespace test1 { #define MYSIZE 1000 const int size = 10000; int a =

C++ namespace命名空间

#include <stdio.h> #include <iostream> // 引入相应的头文件 using namespace std; // 引入相应的命名空间 namespace A { int x = 1; void fun() { cout << "A" << endl; } } namespace B { int x = 2; void fun() { cout << "B" <<

c++基础---namespace命名空间

命名空间是c++新引入的一种概念,用来划分全局作用域的,我们都知道在C语言中只有一个全局作用域,而c++通过命名空间划分了多个全局作用域. 命名空间作为一种作用域的命名,是不占内存空间的 1.什么叫命名空间namespace呢? 它就好像是{...},在里面定义了一系列的变量,我们知道在{}里面的变量在{}外是不能访问的,只有在内部才能访问.所以我们通过引入命名空间访问里面的变量.而且不同命名空间中可能有相同的变量名,因此也有其对应的访问方式. 在这里我盗用一张图来说明: 2.命名空间的访问:

02C++namespace命名空间

一.C++命名空间基本常识 所谓namespace,是指标识符的各种可见范围.C++标准程序库中的所有标识符都被定义于一个名为std的namespace中. 1.<iostream>和<iostream.h>格式不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的.后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开