如何使用namespace?

一、为什么使用命名空间

考虑一种情况,当我们有两个同名的人,Zara,在同一个班里。当我们需要对它们进行区分我们必须使用一些额外的信息和它们的名字,比如这个区域,如果它们生活在不同的区域或者它们的母亲或父亲的名字,等等。

  在您的C++应用程序中也会出现同样的情况。例如,您可能正在编写一些具有名为xyz()函数的代码,并且还有另一个可用的库,它也具有相同的xyz()函数。现在编译器无法知道您在代码中引用的xyz()函数的哪个版本。

  名称空间(namespace)被设计来克服这个困难,并被用作额外的信息来区分类似的函数、类、变量等等,它们在不同的库中具有相同的名称。使用名称空间,您可以定义定义名称的上下文。本质上,名称空间定义了一个范围。

c++中造成这个的原因是应为c++必须兼容c语言,在Java中基本不使用namespace,因为Java不能在类外面定义变量。而c++中可以在类外面定义变量。一般c++的第三方类库使用sh

二、命名空间的定义

在C语言中只有一个全局作用域:

1.C语言中所有的全局标识符共享一个作用域
2.标识符之间可能发生冲突
C++中提出了命名空间的概念:

1.命名空间将全局作用域分成不同的部分,
2.不同命名空间中的标识符可以同名而不会发生冲突
3.命名空间可以发生嵌套
4.全局作用域也叫默认命名空间
语法:

namespace Name
{
    namespace Internal
    {
        /*...*/
    }
    /*...*/
}
C++命名空间的使用:

使用整个命名空间:using namespace name;
使用命名空间中的变量:using name::variable
使用默认命名空间中的变量:  ::variable
Example:

#include <stdio.h>
#include <iostream>
namespace First 
{
    int i = 0;
}
 
namespace Second
{
    int i = 1;
 
    namespace Internal //嵌套命名空间
    {
        struct P  //嵌套命名空间
        {
            int x;
            int y;
        };
    }
}
 
int main()
{
    using namespace First; //使用整个命名空间
    using Second::Internal::P;  //使用嵌套的命名空间
 
    printf("First::i = %d\n", i);
    printf("Second::i = %d\n", Second::i);  //使用命名空间中的变量
 
    P p = { 2, 3 };
 
    printf("p.x = %d\n", p.x);
    printf("p.y = %d\n", p.y);
 
    system("pause");
    return 0;
}


编译运行,输出结果:

 三、using指令

  可以使用using namespace指令避免使用名称空间前置。该指令告诉编译器后续代码正在使用指定命名空间中的名称。

Example:

#include <iostream>
using namespace std;
 
// first name space
namespace first_space {
   void func() {
      cout << "Inside first_space" << endl;
   }
}
 
// second name space
namespace second_space {
   void func() {
      cout << "Inside second_space" << endl;
   }
}
 
using namespace first_space;
int main () {
   // This calls function from first name space.
   func();
   
   return 0;
}


编译运行,输出结果:

四、std命名空间

  下列代码可以引用cout而不预先添加命名空间:

#include <iostream>
using std::cout;
 
int main () {
   cout << "std::endl is used with std!" << std::endl;
   
   return 0;
}
编译运行,输出结果:

std::endl is used with std!

<本文完>
 ———————————————— 
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值