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

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声明,首先将其作用域设置为局部而不是全局。

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

时间: 2024-10-11 17:59:34

c++名称空间 (c++ primer plus 笔记)的相关文章

《C++ Primer Plus》第9章 内存模型和名称空间 学习笔记

C++鼓励程序员在开发程序时使用多个文件.一种有效的组织策略是,使用头文件来定义用户类型,为操纵用户类型的函数提供函数原型,并将函数定义放在一个独立的源代码文件中.头文件和源代码文件一起定义和实现了用户定义的类型及其使用方式.最后,将main()和其他使用这些函数的函数放在第三个文件中.C++的存储方案决定了变量保留在内存中的事件(存储持续性)以及程序的哪一部分可以访问它(作用域和链接性).自动变量在代码块(如函数体或函数体中的代码块)中定义的变量,仅当程序执行到包含定义的代码块时,它们才存在,

C++ primer plus读书笔记——第9章 内存模型和名称空间

第9章 内存模型和名称空间 1. 头文件常包含的内容: 函数原型. 使用#define或const定义的符号常量. 结构声明. 类声明. 模板声明. 内联函数. 2. 如果文件名被包含在尖括号中,则C++编译器将在存储标准头文件的主机系统的文件系统中查找.但如果头文件名包含在双引号中,则编译器将首先查找当前的工作目录或源代码目录(或其他目录,这取决于编译器).如果没有在那里找到头文件,则将在标准位置中查找.因此在包含自己的头文件时,应使用引号而不是尖括号. 3. 链接程序将目标文件代码.库代码和

《C++ Primer Plus》读书笔记之七—内存模型和名称空间

第九章 内存模型和名称空间 1.不要将函数定义或者变量声明放到头文件中. 2.头文件常包含的内容:函数原型.使用#define或者const定义的常量.结构声明.类声明.模板声明.内联函数. 3.避免多次包含同一个头文件的技术:#ifndef/#endif.仅当以前没有使用预处理器编译指令#define定义一个头文件名称时,才处理#ifndef和#endif之间的语句. 4.链接性描述了名称如何在不同单元间共享.链接性为外部的名称可在文件间共享,链接性为内部的名称只能由一个文件中的函数共享.自动

C++ Primer 学习笔记_105_特殊工具与技术 --联合:节省空间的类

特殊工具与技术 --联合:节省空间的类 联合是一种特殊的类.一个 union 对象可以有多个数据成员,但在任何时刻,只有一个成员可以有值.当将一个值赋给 union 对象的一个成员的时候,其他所有都变为未定义的. 为 union 对象分配的存储的量至少与包含其最大数据成员的一样多.联合提供了便利的办法表示一组相互排斥的值,这些值可以是不同类型的. 1.定义联合 作为例子,我们可能有一个处理不同各类数值或字符数据的过程.该过程可以定义一个 union 来保存这些值: union ToKenValu

python学习笔记第五节(函数,名称空间,作用域)

python2中 默认存为unicode需要再字符串前加u 循环打印每一行 循环打印整个文件内容方式二下面这种同一时间取一行 先定义后执行 函数定义的时候,只检测语法错误,不执行 函数返回值,默认是元组模式return 只能返回一次 形参与实参 形参就是变量名实参就是值 打破顺序限制 经常变化的值用位置形参,值通常不变的用默认参数.默认参数通常定义成不可变类型.默认参数只在定义时被赋值一次. 可变长参数就是* 关键字参数(关键字参数指的是实参当中指定y=2,z=3等等) *等同于位置参数 函数内

C++学习笔记--名称空间

名称空间是为了更好的控制名称的作用域,以管理不同的类库,避免发生冲突. 1.创建名称空间 如下,使用namespace关键字创建了pers和debts两个名称空间. #ifndef NAMESP_H_ #define NAMESP_H_ namespace pers { const int LEN = 40; struct Person { char fname[LEN]; char lname[LEN]; }; void GetPerson(Person &); void ShowPerson

[C++ Primer Plus] 第9章、内存模型和名称空间——(一)程序清单

程序清单9.11-13(名称空间示例) namesp.h 头文件:常量.结构定义.函数原型 1 //namesp.h 2 #include<string> 3 //creat the pers and debts namespace 4 namespace pers //包含Person结构的定义和两个函数原型 5 { 6 struct Person 7 { 8 std::string fname; 9 std::string lname; 10 }; 11 void getPerson(Pe

C++ Primer 学习笔记_98_特殊工具与技术 --优化内存分配

特殊工具与技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自动运行合适的构造函数来初始化每个动态分配的类类型对象. new基于每个对象分配内存的事实可能会对某些类强加不可接受的运行时开销,这样的类可能需要使用用户级的类类型对象分配能够更快一些.这样的类使用的通用策略是,预先分配用于创建新对象的内存,需要时在预先分配的内存中构造每个新对象. 另外一些类希望按最小尺寸为自己的数据成员分配需要的内存.例如,

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器 bitset容器是一个bit位元素的序列容器,每个元素只占一个bit位,取值为0或1,因而很节省内存空间.下图是一个bitset的存储示意图,它的10个元素只使用了两个字节的空间. 使用bitset需要声明头文件"#include <bitset>" 1.创建bitset对象 创建bitset对象时,必须要指定容器的大小.bitset对象的大小一经定义,就不能修改了.下面这条语句就定义了bitset对