C++ Primer Plus书之--C++命名空间(名称空间)

本文介绍了C++中的命名空间,包括声明区域、潜在作用域和作用域的概念,以及如何使用命名空间避免名称冲突。讨论了using声明和using编译指令的差异,并给出了使用示例。同时,提到了未命名的名称空间及其特点。最后,提出了使用命名空间的指导原则,建议在编写代码时优先考虑使用命名空间。
摘要由CSDN通过智能技术生成

名称空间:

首先介绍几个概念:

1.声明区域(declaration region): 是可以在其中进行声明的区域. 例如:可以在函数外面声明全局变量, 其声明区域为其声明所在的文件; 对于在函数中声明的变量, 其声明区域为其声明所在的代码块.

2.潜在作用域(potential scope): 变量的潜在作用域从声明点开始, 到其声明区域的结尾. 因此潜在作用域比声明区域小, 这是由于变量必须定以后才能使用.

3.作用域: 变量对程序而言课件的范围被称为作用域.

 

作用域与潜在作用域的关系图:

 

 

C++还允许通过定义一种新的声明区域来创建命名的名称空间, 这样做的目的之一是提供一个声明名称的区域, 一个名称空间中的名称不会与另外一个名称空间的相同名称发生冲突, 同时允许程序的其他部分使用该名称空间中声明的东西. 例如:

namespace Jack{
    // 声明变量
    double pail;
    // 函数原型
    void fetch();    
    int pal;
    // 结构体声明
    struct Well{...};
}
namespace Jill{
    // 函数定义
    double bucket(double n)(...)
    double fetch;  
    int pal;
    // 结构体声明
    struct Hill {...};
}

名称空间可以使全局的, 也可以位于另一个名称空间中, 但不能位于代码块中. 因此默认情况下, 在名称空间中声明的名称的链接性为外部的(除非它引用了常量).

除了用户定义的名称空间外, 还存在另一个名称空间--全局名称空间(global namespace). 它对应于文件级声明区域, 因此前面所说的全局变量现在被描述为位于全局名称空间中.

名称空间是开放的, 即可以把名称加入到已有的名称空间中, 例如: 下面这条语句就将函数原型goose添加到Jill中已有的名称列表中

namespace Jill{
    char * goose(const char *);
}

同样, 原来的Jack名称空间为fetch()函数提供了原型, 可以在该文件后面(或另外一个文件中)再次使用Jack名称空间来提供该函数的代码:

namespace Jack{
    void fetch()
    {
        ...
    }
}

当然, 需要有一种方法来访问给定名称空间中的名称, 最简单的方法使, 通过组用于解析运算符::, 使用名称空间来限定该名称:

// 使用Jack名称空间中的变量pail
Jack::pail = 12.34;
// 使用Jill名称空间中的结构体Hill
Jill::Hill mole;
// 使用Jack名称空间中的函数fetch
Jack::fetch();

未被修饰的名称(如 pail)称为未限定的名称(unqualified name), 包含名称空间的名称(如Jack::pail)称为限定的名称(qualified name)

 

using声明和using编译指令

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值