1. 命名空间内部名字的查找规则

由内向外依次查找每个外层作用域。

  • 外层作用域也可能是一个或多个嵌套的命名空间, 直到最外层的全局命名空间查找过程终止。

  • 只有位于开放的块中且在使用点之前声明的名字才被考虑

 namespace A {int i;namespace B {int i;        // hides A::i within Bint j;int f1(){int j;    // j is local to f1 and hides A::B::jreturn i; // returns B::i}} // namespace B is closed and names in it are no longer visibleint f2() {return j;     // error: j is not defined}int j = i;      // initialized from A::i}

1.1 命名空间中的类的查找规则

当成员函数使用某个名字时, 首先在该成员中进行查找, 然后在类中查找( 包括基类), 接着在外层作用域中查找,这时一个或几个外层作用域可能就是命名空间

namespace A {int i;int k;class C1 {public:C1(): i(0), j(0) { }   // ok: initializes C1::i and C1::jint f1(){return k;        // returns A::k}int f2(){return h;        // error: h is not defined}int f3();private:int i;                // hides A::i within C1int j;};int h = i;               // initialized from A::i
}
// member f3 is defined outside class C1 and outside namespace A
int A::C1::f3()
{return h;               // ok: returns A::h
}

2. 实参相关的查找与类类型形参

隐藏规则:直接访问输出运算符。

当我们给函数传递一个类类型的对象时, 除了在常规的作用域查找外,还会查找实参类所属的命名空间。 这一例外对于传递类的引用或指针的调用同样有效

eg.

std::string s;
std::cin » s;operator>> (std::cin, s);

或者使用函数调用的形式以把命名空间的信息包含进来:

std::operator»(std::cin, s) ; / / 正确: 显式地使用 std::>>

2.1 查找与 std::move 和 std::forward

如果在应用程序中定义了一个标准库中已有的名字, 则将出现以下两种情况中的一种:

  • 根据一般的重载规则确定某次调用应该执行函数的哪个版本
  • 应用程序根本就不会执行函数的标准库版本

2.2 友元声明与实参相关的查找

namespace A {class C {// 两个友元, 在友元声明之外没有其他的声明// 这些函数隐式地成为命名空间 A 的成员// 除非另有声明, 否则不会被找到friend void f(const C& ); // 才艮据实参相关的查找规贝可以被找到friend void f2();}
}

当类声明了一个友元时, 该友元声明并没有使得友元本身可见

一个另外的未声明的类或函数如果第一次出现在友元声明中, 则我们认为它是最近的外层命名空间的成员

int main ( )
{A::C cobj;f(cobj);f2();//正确: 通过在 A::C 中的友元声明找到 A::f//错误: A::f 2 没有被声明
}

C++ Primer 5th笔记(chap 18 大型程序工具) 类、 命名空间与作用域相关推荐

  1. C++ Primer 5th笔记(chap 18 大型程序工具)命名空间

    1. 问题:命名空间污染 namespace pollution 多个库将名字放置在全局命名空间 1.1 一般人的解决方法 起长名字 eg. class cplusplus_primer_Query ...

  2. C++ Primer 5th笔记(chap 18 大型程序工具)命名空间特性

    1. 命名空间成员 定义在命名空间中的实体称为命名空间成员. 在命名空间中定义的名字能够被命名空间中的其它成员直接訪问,命名空间外部的代码必须指出名字定义在哪个命名空间中 命名空间中定义的成员可以直接 ...

  3. C++ Primer 5th笔记(chap 18 大型程序工具) 重载与命名空间

    1. using 声明或 using 指示能将某些函数添加到候选函数集 2. 对于接受类类型实参的函数来说, 其名字查找将在实参类所属的命名空间中进行.在这些命名空间中所有与被调用函数同名的函数都将被 ...

  4. C++ Primer 5th笔记(chap 18 大型程序工具)使用命名空间成员

    1. 3种方法 using 声明 命名空间的别名( namespace alias) using 指示( using directive) 1.1 命名空间的别名 namespace cplusplu ...

  5. C++ Primer 5th笔记(chap 18 大型程序工具) 多重继承之构造函数、析构函数

    1. 继承的构造函数与多重继承 如果从多个基类中继承了相同的构造函数(即形参列表完全相同),则程序将产生错误 struct Basel {Basel () = default;Basel (const ...

  6. C++ Primer 5th笔记(chap 18 大型程序工具)未命名的命名空间unnamed namespace

    1. 定义 关键字 namespace 后紧跟花括号括起来的一系列声明语句 1.1 生命周期 未命名的命名空间中定义的变量拥有静态生命周期: 它们在第一次使用前创建, 并且直到程序结束才销毁 未命名的 ...

  7. C++ Primer 5th笔记(chap 18 大型程序工具)内联命名空间 (inline namespace)

    1. inline必须出现在命名空间第一次出现的地方 inline namespace FifthEd {//... }//后续再打开命名空间的时候可以写inline也可以不写 namespace F ...

  8. C++ Primer 5th笔记(chap 18 大型程序工具)noexcept

    1. 通过提供 noexcept 说明 ( noexcept specification ) 指定某个函数不会抛出异常. 其形式是关键字 noexcept 紧跟在函数的参数列表后面 {// 紧跟在函数 ...

  9. C++ Primer 5th笔记(chap 18 大型程序工具)异常处理

    1. 异常处理 ( exception handling) 允许程序中独立开发的部分能够在运行时就出现的问题进行通信并做出相应的处理. 异常使得我们能够将问题的检测与解决过程分离开来. 程序的一部分负 ...

最新文章

  1. python语言变量命名规则有什-以下选项中,符合Python语言变量命名规则的是_学小易找答案...
  2. Python pip安装命令
  3. android自动更新列表,Android数据库表结构自动升级
  4. MFC对话框中的工具栏、状态栏设计小结
  5. 话筒增益_话筒啸叫怎么办?教你四个解决话筒啸叫的方法!
  6. Android初级教程获取手机系统联系人信息
  7. Node Sass does not yet support your current environment
  8. Android的联通性---USB主机模式(三)
  9. 【神经网络】神经网络结构在命名实体识别(NER)中的应用
  10. C# 离线使用nuget
  11. c语言结构体出现乱码,结构体数组输出时出现了乱码情况 求大神帮帮看程序
  12. 从考勤管理需求说起,聊聊场景的思维“工具”
  13. Maven的性质与部署整理
  14. 系统补丁安静安装参数
  15. 计算机windows8黑屏怎么办,详解笔记本电脑出现电源拔出就黑屏的win8处理教程
  16. 图书管理系统源代码<Java>(带文字讲解)(javase)
  17. 好友管理系统 Python
  18. r语言 聚类求和_R语言聚类分析(示例代码)
  19. EXCEL中怎样能复制公式得来的数据(选择性粘贴)
  20. 六类双绞线排序和信息插座排序

热门文章

  1. access数据库拆分的用途_聊聊数据库设计一些经验 条条都是干货
  2. 你以为ACI=SDN?大错特错!
  3. linux搭建宝塔重启mysql_宝塔面板安装 重启等命令linux系统重启
  4. mysql 6.5安装_(整理)MySQL_REHL6.5 安装MySQL5.5
  5. Python之tushare:tushare库的简介、安装、使用方法之详细攻略
  6. ML之FE:对pandas的dataframe中的类别型字段进行数字编码化(类别型特征数值化)并导出映射表daiding
  7. 成功解决SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position 0-1: malformed
  8. Database之SQLSever:SQL命令实现理解索引、规则、默认概念及其相关案例之详细攻略
  9. Dataset之Knifey-Spoony:Knifey-Spoony数据集的简介、下载、使用方法之详细攻略
  10. Dataset之CelebAman2woman:CelebAman2woman 数据集的简介、安装、使用方法之详细攻略