您现在的位置是:首页 > 技术文章网站首页技术文章

[C++]命名空间

  • WangYe
  • 2020-08-04 14:05:16
  • 1023 次阅读
了解C++中的命名空间

假设如果班级里有两个名字为 `小明` 的同学,为了区分他们 我们可能会在身高 长相 发型 等等其他条件判断谁是谁

编译器也是这样 当你写了 两个 函数名字一样的函数 编译器不知道引用哪一个

因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量

等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围

定义命名空间:

namespace namespace_name {
    //代码声明
}

调用带有命名空间的函数或变量,需要在前面加上命名空间的名称,如下所示:

name::code;    //code 可以是变量或函数


实例

#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;
}

结果:

图片.png


using指令

using 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;
    }
}

using namespace first_space;

int main()
{
    //调用第一个命名空间函数
    func();
}

结果:

图片.png


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;
}

结果:

图片.png


不连续的命名空间

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

namespace namespace_name {
    //代码声明
}


嵌套的命名空间

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

namespace namespace_name1 {
    //代码声明
    namespace namespace_name2 {
        //代码声明
    }
}

可以通过使用::运算符来访问嵌套的命名空间中的成员:

//访问 namespace_name2 中的成员
using namespace namespace_name1::namespace_name2;

//访问 namespace:name1 中的成员
using namespace namespace_name1;

如果使用的是 namespace_name1,那么在该范围内 namespace_name2 中的元素也是可用的,如下所示:

#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 firest_space::second_space;

int main()
{
    //调用第二个命名空间中的函数
    func();
    
    return 0;
}

结果:

图片.png


关于命名空间内变量和函数及全局变量的使用和作用域:

#include <iostream>
using namespace std;

namespace A
{
    int a= 100;
    namespace B    //嵌套一个命名空间B
    {
        int a = 20;
    }
}

int a = 200;    //定义一个全局变量

int main(int argc,char *argv[])
{
    cout << "A::a = " << A::a << endl;
    cout << "A::B::a = " << A::B::a << endl;
    cout << "a = " << a << endl;
    cout << "::a = " << ::a << endl;
    
    int a = 30;
    cout << "a = " << a <<endl;
    cout << "::a = " << ::a << endl;
    
    return 0;
}

结果:

A::a=100
A::B::a=20
a=200      //全局变量a
::a=200
a=30       //局部变量a
::a=200

:全局变量 a 表达为 ::a,用于当有同名的局部变量时来区别两者。

上一篇:[C++]认识STL 2

下一篇:[C++]继承

文章评论 (0)



Top