namespace 命名空间

1. 定义

命名空间的定义如下:

namespace SpaceName {
    ...
}

其中,空间内部可以定义和声明类、变量、函数,变量会被赋予初值。定义时不仅可以定义全局,可以定义在已有的命名空间中(嵌套定义)。命名空间可以不连续(除未命名的命名空间),一个命名空间的第一次使用为定义,后续的使用为打开。注意,一般不建议把头文件包含进命名空间,这样做意味着把头文件中所有的命名全部加入到该空间中,这样做有一定的危险性。

  1. 全局的命名空间

    即在全局范围内定义命名空间,该命名空间可以在局部的函数体内部使用,也可以在类内部使用, 总之它可以在本文件中的任意地方使用。

  2. 命名空间的嵌套

    命名空间可以使用嵌套,例如:

    namespace mySpace {
        ...
        namespace myChildSpace{
            int i;
            ...
        }
    }
    

    调用时加上前缀 mySpace::myChildSpace::i。在C++11新标准中允许定义内联命名空间。

    inline namespace myChildSpace
    

    内联namespace在调用时可以省去前缀,可以用于版本控制系统,例如:

    namespace mySpace {
        ...
        namespace first {
            string version("1.0.0");
            ...
        }
    
        inline namespace second {
            string version("2.0.0");
        }
    }
    

    调用时,mySpace::version 就会动调用内联函数中的 version 变量。如果想调用 first 中的变量,需要加上前缀 first。

  3. 未命名的namespace

    未命名的namespace的适用范围仅限于本文件中,它是每个文件独有的命名空间。C++中的常用未命名的namespace来代替 static。

2. 命名空间的使用

可以为命名空间去个别名。例如:

namespace MyNames {  
    int iVal1 = 100;  
    int iVal2 = 200;  

    namespace YourNames {
        int val = 300;
    }
}  
namespace MyAlias = MyNames; 
namespace YourAlias = MyNames::YourNames;
using
  1. using的声明

    using std::string;
    
  2. using的指示

    using namespace std;
    

3. 查找

查找分为:普通查找OL(Ordinary Name Lookup)和依赖于实参的名字查找ADL(argument-depentment lookup)

  • OL:在当前的作用域中找到函数名相同的函数,并且匹配最合适的参数(重载的时候)
  • ADL:根据实参的类型,先去去实参的基类中查找,再去包含实参类型的命名空间。例如:

    operator<<(std::cout, "123");
    

当本文件中没有可用的运算符重载函数的时候,编译器会自动的从std::cout的类中和命名空间中去找,最后找到了 cout::string 中的运算符重载函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值