高等大旨,命名空间

名字解释:

命名空间(namespace)为严防名字争辨提供可控机制。一个命名空间是一个成效域,可以在命名空间内部定义自己的模板名、类型名、函数名,而不会与别的命名空间中的相同名字造成争辩。

第17章  **用来大型程序的工具**

高等大旨,命名空间。程序设计语言,基本上都会有命名空间这一说,所以究竟怎么是命名空间吗?
  • 百科词条
      先给一个百度周到的解释:取名空间
      那里说,namespace(命名空间),也称之为“名称空间”和“名字空间”。顾名思义,是用来放名字的一个上空。

  • 取名空间
      在先后开发的进度中,我们必定会新产出一名目繁多的名字(变量名、函数名、类名等等),那些时候,大概无法完全幸免重名的情状,所以就要运用命名空间,把那一个名字分别开来。
      一个命名空间里的名字,可以和其它一个命名空间的名字完全相同,只要你在用的时候,是在团结的命名空间下,程序就不会因为名字同样而蒙圈,更不会去别人家的命名空间下找这几个变量。
      换句话说就是,变量只可以在投机这些命名空间的域里面起功用,而不会搅乱其余同名的有缘变量(ノv ̄、)。

  • Python的命名空间
      python自己的命名空间,效能自然也一致。
      例如,你有一个变量x,你把它坐落一个函数里了,那么x就在该函数下面的命名空间(相当于一个部分命名空间)中起效果,你在函数外去引用他,就会出错;反过来,y是全局变量,你就可以在您的那一个函数中使用它,因为你函数的那一个有些命名空间也在全局的命名空间里——一个命名空间里可以嵌套注脚命名空间

  而Python里最能显示命名空间与功效域的,是模块和包。

 namespace(命名空间),命名空间是从php5.3开头扶助的功能。功效至关主要有四个:1.可以避免类名取得过长。2.当在三个框架协作使用时,同名的类之间不会争论。

namespace cplusplus_primer {
class SalesItem { /* … */ };
SalesItem operator+(const SalesItem &, const SalesItem&);
class Query {
public:
    Query(const std::string&);
    std::ostream & display(std::ostream&) const;
    // …
};
class QueryBase { /* … */ };
}
  1. 极度处理
    不存在数组或函数类型的丰硕。相反,如若抛出一个数组,被抛出的目标转换为指向数组首元素的指针,类似地,如若抛出一个函数,函数被更换为指向该函数的指针。

  2. 不用抛出指针

  3. 析构函数不要抛出分外

  4. 除上边二种可能的界别之外,非凡的项目与 catch
    表达符的品种必须完全同盟: 
    •     允许从非 const 到 const 的变换。也就是说,非 const 对象的
    throw 能够与指定接受 const 引用的 catch 匹配。
    •     允许从派生类型型到基类类型的转换。
    •    
    将数组转换为指向数组类型的指针,将函数转换为指向函数类型的贴切指针。
    澳门葡京备用网址

  5. 命名空间
    取名空间为防患名字龃龉提供了更进一步可控的编制,命名空间可以划分全局命名空间,那样使用独立开发的库就更为便于了。
    一个命名空间是一个作用域,通过在命名空间内部定义库中的名字,库的撰稿人(以及用户)可以免止全局名字固有的限制。

  6. 取名空间的定义:
    namespace cplusplus_primer
    {
             class Sales_item { /* … */};
             Sales_item operator+(const Sales_item&,  const
    Sales_item&);
             class Query  { /* … */}; 
             class Query_base { /* … */};
    }
    命名空间的名字在概念该命名空间的成效域中必须是唯一的。
    取名空间可以在大局作用域或此外效率域内部定义,但无法在函数或类内部定义。
    命名空间名字背后随着由花括号括住的一块声明和定义,可以在命名空间中放入可以出现在大局作用域的即兴讲明:类、变量(以及它们的开端化)、函数(以及它们的概念)、模板以及其他命名空间。
    命名空间功能域不可能以分公司甘休。
    因为不一样命名空间引入不一致功效域,所以差异命名空间可以具备同名成员。
    在命名空间中定义的名字可以被取名空间中的其他成员直接使用,命名空间表面的代码必须指盛名字定义在哪些命名空间中。

取名空间,看名字就知晓,目标就是为着命名的,不然咋不叫QQ空间 盗梦空间
七度空间。额 好像有意想不到的掺进来了。

取名空间中的名字在该命名空间的作用域中务必是绝无仅有的。命名空间可以在大局功效域或任何作用域内部定义,但不能在函数或类内部定义。命名空间功效域不以分号为止。

  1. 从命名空间表面使用命名空间成员
    (1)总是利用限定名
         namespace_name::member_name 
    (2)编写 using 阐明来获取对我们精通将平常利用的名字的直白访问:
         using cplusplus_primer::Query; 
    在这么些 using 申明之后,程序可以不用 cplusplus_primer
    限定符而直白选用名字 Query

  2. 取名空间可以是不延续的
    取名空间可以在多少个部分中定义。命名空间由它的分开定义部分的总数构成,命名空间是积累的。一个命名空间的诀别部分可以分流在多少个文件中,在不一致文本文件中的命名空间定义也是积累的。

  3. 接口和兑现的分手
    可以用与管理自己的类和函数定义相同的章程来公司命名空间:
    (1)
    定义类的命名空间成员,以及作为类接口的一片段的函数表明与目标评释,可以放在头文件中,使用命名空间成员的文本可以涵盖那个头文件。
    (2) 命名空间成员的定义可以置身单独的源文件中。

  4. 全局命名空间
    概念在大局作用域的名字(在任意类、函数或命名空间表面评释的名字)是概念在大局命名空间中的。
    因为全局命名空间是包蕴的,它没闻明字,所以记号  ::member_name
    引用全局命名空间的分子。

  5. 嵌套命名空间
    一个嵌套命名空间即是一个嵌套效用域——其功用域嵌套在含蓄它的命名空间内部。
    嵌套命名空间中的名字遵守常规规则:外围命名空间中扬言的名字被嵌套命名空间中一样名字的宣示所屏蔽。嵌套命名空间内部定义的名字局地于该命名空间。外围命名空间之外的代码只好通过限制名引用嵌套命名空间中的名字。

  6. 嵌套命名空间中成员的名字由外界命名空间的名字和嵌套命名空间的名字构成。
    比如说,嵌套命名空间 QueryLib 中声称的类的名字是  
    cplusplus_primer::QueryLib::Query 

  7. 未命名的命名空间
    未命名的命名空间在概念时未尝给定名字。
    未命名的命名空间与其它命名空间分歧,未命名的命名空间的概念局地于特定文件,从不跨越多少个文件文件。 

  8. 命名空间成员的运用——使用using申明
    using std::map; 
    一个 using
    声圣元(Synutra)次只引入一个命名空间成员,它使得无论程序中应用什么名字,都可以相当明确。
    using 注脚中引入的名字遵从常规功用域规则。从 using
    评释点开首,直到包括 using
    表明的作用域的末段,名字都是可知的。外部成效域中定义的同名实体被遮挡。 

  9. 取名空间别名
    可用命名空间别名将较短的同义词与命名空间名字相关联,例如:
    namespace primer = cplusplus_primer;
    一个命名空间可以有无数别名,所有别名以及原来的命名空间名字都得以调换使用。

  10. using 指示
    using namespace std;
    using 提醒以首要字 using 初叶,后接关键字
    namespace,再接命名空间名字。如若该名字不是早已定义的命名空间名字,就会出错。 
    using 提醒使得特定命名空间有所名字可知,没有限定。短格式名字可从
    using 提示点开头利用,直到出现 using 提示的功用域的末段。

  11. 实参相关的检索与类类型形参
    std::string s;    
    getline(std::cin, s); 
    std::string s;
    它在命名空间 std 中查找并找到由 string 类型定义的 getline 函数。

  12. 重载与命名空间
    三个例外命名空间的成员的函数无法相互重载。
    同一个命名空间可以包罗一组重载函数成员。

  13. 重载与 using 声明 
    一旦命名空间内部的函数是重载的,那么,该函数名字的 using
    评释声称了有着具有该名字的函数。假如命名空间 NS 中有用于 int 和
    double 的函数,则 NS::print 的 using
    评释使得三个函数都在脚下效用域中可知。

  14. 重载与 using 指示
    using
    提醒将命名空间成员进步到外围成效域。若是命名空间函数与命名空间所在的功效域中声称的函数同名,就将命名空间成员加到重载集合中:

  15. 多重继承
    派生类的构造函数可以在构造函数开头化式中给零个或三个基类传递值:

  16. 社团的次第
    构造函数初步化式只可以控制用于先河化基类的值,不可能决定基类的结构次序。
    基类构造函数按照基类在类派生列表中的现身程序调用。

  17. 更换与三个基类
    在单个基类意况下,派生类的指针或引用能够活动转换为基类的指针或引用,对于多重继承也是如此,派生类的指针或引用可以变换为其自由基类的指针或引用。

  18. 八个基类可能导致二义性
    可以因此点名使用哪个类解决二义性:ying_yang.Endangered::print(cout);
    防止地下二义性最好的法子是,在缓解二义性的派生类中定义函数的一个版本。

  19. 虚继承
    虚继承是一种体制,类经过虚继承提议它仰望共享其虚基类的意况。在虚继承下,对给定虚基类,无论该类在派生层次中作为虚基类出现略微次,只持续一个共享的基类子对象。共享的基类子对象称为虚基类。 

  20.  特殊的开头化
    从具有虚基类的类继承的类对初叶化进行尤其处理。在虚派生中,由最低层派生类的构造函数早先化虚基类,而且是先构造虚基类,然后构造非虚基类。
    其余间接或直接接轨虚基类的类一般也亟须为该基类提供温馨的先导化式。


1. 每个命名空间是一个成效域

 

 

在命名空间中定义的名字可以被取名空间中的其他成员直接访问。命名空间外的代码必须指闻明字定义在哪些命名空间中:

第18章
用于大型程序的工具

下边是出现说法代码:

cplusplus_primer::Query q = cplusplus_primer::Query(“hello”);
q.display(cout);
// …
  1. C++ 提供上面二种艺术分配和释放未构造的原本内存
    (1)  allocator
    类,它提供可感知类型的内存分配。这么些类协理一个华而不实接口,以分配内存并随后利用该内存保存对象。
    (2)  标准库中的 operator new 和 operator
    delete,它们分配和刑释解教内需大小的原始的、未类型化的内存。 

  2.  allocator 类

 1 //在test1.php 中有一个类 叫做Person,它放在一个叫shop的namespace里。
 2 <?php
 3     namespace shop;//这个声明要放在php文件的最上面。就算是header也要让路。
 4 
 5     header('content-type:text/html;charset=utf-8');
 6 
 7     class Person {
 8       public $name = 'Leonard';
 9     }
10 ?>
11 //在同级目录的test2.php中也有一个叫Person的类,它放在一个叫admin的namespace中
12 <?php
13 
14     namespace admin;//上面可以有空白行。别的都不行
15 
16     include_once('./test.php');
17 
18     use shop as s;//这里就引用了这个shop命名空间。要使用test1.php中的类就必须写上这行。as的作用是简写命名空间的名字。
19 
20     class Person {
21       public $name = 'Sheldon';
22     }
23 
24     $p1 = new s\Person();//上面用了as简写,s指代命名空间shop。没有用as的话就用 new shop\Person()来实例化对象。
25     echo $p1->name;//Leonard
26 
27     $p2 = new Person();//不写命名空间时,就近在自己的命名空间里找Person类,找不到就报错咯。
28     echo $p2->name;//Sheldon

2. using声明

 

可以编写using申明来得到对常常使用的名字的一直访问:

using cplusplus_primer::Query;

在那个using声明之后,程序可以直接行使名字Query。

3. 命名空间能够是不再三再四的

一个命名空间可以散开定义在多少个文本中。不过,假设命名空间的一个片段须要采纳一个定义在另一文件中的名字,必须表明该名字。

namespace namespace_name {
// declarations
}

如果namespace_name不是援引后面定义的命名空间,则用该名字创办新的命名空间,否则,这么些概念打开一个已存在的命名空间,并将新注解加到那一个命名空间。

4. 接口和兑现的诀别

可以用分离的接口文件和达成公文构成命名空间。可以用与管理类和函数定义相同的法子来公司命名空间。定义八个不相干品种的命名空间应该运用分别的公文分别定义每个品种。

// sales_item.h
namespace cplusplus_primer {
class SalesItem { /* … */ };
SalesItem operator+(const SalesItem&, const SalesItem&);
}
// query.h
namespace cplusplus_primer {
class Query {
public:
    Query(const std::string&);
    std::ostream & display(std::ostream&) const;
};
}
// sales_item.cpp
#include “sales_item.h”
namespace cplusplus_primer {
// definitions for SalesItem members and overloaded operators
}
// query.cpp
#include “query.h”
namespace cplusplus_primer {
// definitions for Query members and related functions
}

5. 概念命名空间成员

可以在命名空间定义的外表定义命名空间成员,类似于在类外部定义类成员的方法。

// namespace members defined outside the namespace must use qualified names
cplusplus_primer::operator+(const SalesItem&, const SalesItem&)
{
SalesItem ret(lhs);
// …
}

假定看到完全限定的函数名,此函数就处于命名空间的成效域中。所以形参表和函数体中的命名空间成员引用可以运用非限定名。

6. 全局命名空间

概念在大局功效域的名字(在任意类、函数、命名空间表面表明的名字)是概念在大局命名空间(global
namespace)中的。全局命名空间是隐式注明的,存在于每个程序中。在大局作用域定义实体的各种文件将这多少个名字加到全局命名空间。

大局命名空间是含有的,没出名字,可以透过::member_name引用全局命名空间的分子。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website