zoukankan      html  css  js  c++  java
  • c++ namespace

    作用:定义的函数可能与标准库里函数重名,所以用命名空间来解决,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。

    用法:namespace定义命名空间,namespace::的形式调用内部函数或变量,看例子

    #include <iostream>
    using namespace std;
     
    // 第一个命名空间
    namespace first_space{
       void func(){
          cout << "Inside first_space" << endl;
       }
    }
    // 第二个命名空间
    namespace second_space{
       void func(){
          cout << "Inside second_space" << endl;
       }
    }
    int main ()
    {
     
       // 调用第一个命名空间中的函数
       first_space::func();
       
       // 调用第二个命名空间中的函数
       second_space::func(); 
     
       return 0;
    }

    using用法:这样在使用命名空间时就可以不用在前面加上命名空间的名称。这个指令会告诉编译器,后续的代码将使用指定的命名空间中的名称。看例子:

    #include <iostream>
    using namespace std;
     
    // 第一个命名空间
    namespace first_space{
       void func(){
          cout << "Inside first_space" << endl;
       }
    }
    // 第二个命名空间
    namespace second_space{
       void func(){
          cout << "Inside second_space" << endl;
       }
    }
    using namespace first_space;
    int main ()
    {
     
       // 调用第一个命名空间中的函数
       func();
       
       return 0;
    }

    using 指令也可以用来指定命名空间中的特定项目。例如,如果您只打算使用 std 命名空间中的 cout 部分,您可以使用如下的语句:

    using std::cout;

    随后的代码中,在使用 cout 时就可以不用加上命名空间名称作为前缀,但是 std 命名空间中的其他项目仍然需要加上命名空间名称作为前缀,如下所示:

    #include <iostream>
    using std::cout;
     
    int main ()
    {
     
       cout << "std::endl is used with std!" << std::endl;
       
       return 0;
    }

    不连续的命名空间:命名空间可以定义在几个不同的部分中,因此命名空间是由几个单独定义的部分组成的。一个命名空间的各个组成部分可以分散在多个文件中。

    所以,如果命名空间中的某个组成部分需要请求定义在另一个文件中的名称,则仍然需要声明该名称。下面的命名空间定义可以是定义一个新的命名空间,也可以是为已有的命名空间增加新的元素。

    嵌套的命名空间:命名空间可以嵌套,您可以在一个命名空间中定义另一个命名空间。

    使用标准命名空间:using namespace std

    C++标准程序库中的所有标识符都被定义于一个名为std的namespace中 。 由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择: 
    直接指定标识符
    例如std::iostream而不是iostream。完整语句如下:
    std::cout<<std::hex<<3.4<<std::endl;
     
    使用using关键字
    加入using std::cout; using std::endl; using std::cin; 则前面语句可以写成如下代码:
    cout << std ::hex << 3.4 << endl;
    使用using namespace std
    例如:
    #include<......>
    #include<......>
    #include<......>
    using namespace std;
    cout << hex << 3.4 << endl;
    这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写:cout<< hex << 3.4 << endl; 因为标准库非常的庞大,所以程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。 所以就有了<iostream>和<iostream.h>等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。 iostream和iostream.h,前者没有后缀。实际上,在你的编译器include文件夹里面可以看到,二者是两个文件。打开文件就会发现,里面的代码是不一样的。 后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因 此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用< iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。命名空间std封装的是标准程序库的名称,
  • 相关阅读:
    LOJ #6183 看无可看
    BZOJ 5467 Slay the Spire
    BZOJ 5306 [HAOI2018] 染色
    BZOJ 2784 时间流逝
    BZOJ4911: [Sdoi2017]切树游戏
    min-max 容斥
    BZOJ 5475: [WC 2019] 数树
    BZOJ 2810 [Apio2012]kunai
    Codeforces round 1083
    详解大数据数据仓库分层架构
  • 原文地址:https://www.cnblogs.com/dmndxld/p/10778861.html
Copyright © 2011-2022 走看看