码迷,mamicode.com
首页 > 编程语言 > 详细

c++名称空间 (c++ primer plus 笔记)

时间:2018-04-22 13:58:27      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:另一个   需要   替代   影响   ali   相同   包含   解决   编译器   

c++名称空间

  1. 名称空间术语
  2. 新的名称空间特性
  3. 名称空间的使用理念

  1. 名称空间术语
    c++中的名称包括:变量、函数、结构、枚举、类以及类和结构的成员。
    名称空间作用:当程序项目越来越大时,c++中的名称冲突可能性将会增加,名称空间的出现即为了解决c++中名称冲突问题。
    声明区域:是可以在其中进行声明的区域。例如,全局变量其声明区域为其声明所在的文件,局部变量其声明区域为其声明所在的代码块。
    潜在作用域:变量的潜在作用域从声明点开始,到其声明区域的结尾。因此潜在作用域比声明区域小,这是由于变量必须在定义后才能使用。但声明区域中的变量并非在潜在作用域的任何位置都是可见的,它可能被别一个在嵌套声明区域中声明的同名变量隐藏。
  2. 新的名称空间特性
    名称空间作用:
    c++新增了一种功能,即通过定义一种新的声明区域来创建命名的名称空间,这样做的目的之一是提供一个声明名称的区域。一个名称空间中的名称不会与另外一个名称相同名称发生冲突,同时允许程序的其他部分使用该名称声明的东西。
    创建名称空间关键字namespace,语法格式如下:

    namespace name {
    int value;
    void func();
    }
  • 名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。
  • 名称空间中声明的名称的链接性为外部的,除非它引用了常量。
  • 全局名称空间对应于文件级声明区域,全局变量位于全局名称空间中。
  • 名称空间中的声明和定义规则同全局声明和定义规则相同。
  • 名称空间是开放的,可以把名称加入到已有的名称空间中。语法格式如下:

    namespace name  {
    double value2;
    }

    为名称空间中的函数原型提供定义的语法格式如下:如下:如下(可在 该文件后面或另一个文件中提供定义):

    namespace name {
    void func() {
    ....
    }
    }

    访问名称空间:未被装饰的名称称为未限定的名称;包含名称空间的名称称为限定的名称。
    使用解析运算符访问名称:

    name::value = 100;

    使用using声明和using编译指令简化对名称空间的访问:

    using name::value;
    using namespace name;
  • using声明将特定的名称添加到它所属的声明区域后,便可以使用value代替name::value,以简化代码。
  • 关键字using namespace使名称空间中的所有名称都可用,而不需要使用域解析运算符。
  • 在全局声明区域中使用using编译指令,将使该名称空间的名称全局可用。
  • 使用域解析运算符可避免名称二义性,using声明和using编译指令,可能导致名称二义性。
  • 如果名称空间和声明区域定义了相同的名称,则不能用using声明导入名称空间,这样会导致名称冲突,编译器不允许这样做。但可以用using编译指令导入名称空间,此时只是局部名称隐藏了名称空间名,用域解析运算符就可以访问了。
    using声明比using编译指令更安全,因为如果有名称与局部名称发生冲突,编译器会发出指示,而后者不会发出警告。
    名称空间嵌套

    namespace name1 {
    namespace name2 {
        int value2;
    }
    int value1;
    }

    访问value2的方法:

    using name1::name2::value2;
    value2 = 100;
    using namespace name1::name2;
    value2 = 100;
    using namespace name1;   
    name2::value2 = 100;
  • using编译指令是可以传递的,即嵌套的名称空间会一起被导入。
  • 创建名称空间别名:namespace alias_name = name;可以用来简化对嵌套名称空间的使用。
  • 未命名的名称空间:可以通过省略名称空间的名称来创建未命令的名称空间。就像后面跟着using编译指令一样,也就是说,在该名称空间中声明的名称的潜在作用域为:从声明点开始到该声明区域的末尾。不能在未命名名称空间所属文件之外使用名称空间中的名称,即提供了链接性为内部的静态变量的替代品。

3.名称空间的使用理念

  • 使用在已命名的名称空间中声明的变量,而不是使用外部全局变量。
  • 使用在已命名的名称空间中声明的变量,而不是使用静态全局变量。
  • 如果开发一个函数库或类库,将其放在一个名称空间中。例如c++提倡将标准函数库放在名称空间std中。
  • 仅将编译指令using作为一种将旧代码转换为使用名称空间的权宜之计。
  • 不要在头文件中使用using编译指令。首先,这样做掩盖了要让哪些名称可用;另外,包含头文件的顺序可能影响程序的行为。如果非要使用,应将其放在所有预处理器编译指令#include之后。
  • 导入名称时,首先使用作用域解析运算符或using声明方法。
  • 对于using声明,首先将其作用域设置为局部而不是全局。

c++名称空间 (c++ primer plus 笔记)

标签:另一个   需要   替代   影响   ali   相同   包含   解决   编译器   

原文地址:https://www.cnblogs.com/linuxcoffe/p/8906514.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!