//1.异常:待研究

//2.命名空间:
// A:多个库将名字放置在全局命名空间中将引发命名空间污染。
// B:命名空间为防止名字冲突提供了更加可控的机制。命名空间分割了全局命名空间,其中每个命名空间都是一个作用域。
// C:一个命名空间的定义包含两个部分:首先是关键字namespace,随后是命名空间的名字。只要是能出现在全局作用域中的声明就能置于命名空间中,主要为:类,变量(及其初始化操作),函数,模板和其它命名空间。
// D:命名空间不能定义在函数或类的内部,可以定义在全局命名空间和其它命名空间中。
// E:命名空间作用域后面无需分号。
// F:命名空间可以定义在几个不同的部分。形如: namespace szn{}可能定义了一个名为szn的新命名空间,也可能是为已经存在的命名空间添加新的成员。如类的声明和定义应该分开置于不同的文件,则当类位于命名空间时就可方便的声明与定义了。
// G:允许在命名空间中声明一个成员而在命名空间所属的外层空间中进行定义。
// H:全局作用域中定义的名字也就是定义在全局命名空间中。全局命名空间以隐式的方式声明,并且在程序中都会存在,全局作用域中定义的名字被隐式添加到全局命名空间中。
// I:作用域运算符同样可以作用于全局作用域的成员,因为全局作用域是隐式的,所以其没有名字,形如 ::member_name;
// J:未命名的命名空间:是指关键字namespace后紧跟花括号扩起来的一系列声明语句。未命名的命名空间中定义的变量具有静态生命周期。一个未命名的命名空间不能跨越多个文件。每个文件定义了自己的未命名的命名空间。
// 如果一个头文件定义了未命名的命名空间,则该命名空间中的定义的名字将在每个包含了该头文件的文件中对应不同实体。如果一个头文件定义了一个static变量,则包含此头文件的源文件都将拥有对应的不同实体
// 在文件中进行静态声明的做法应该是:使用未命名的命名空间。使用static的做法是继承与C语言,已经被未命名的命名空间所取代。
// K:命名空间的别名使得我们可以为命名空间的名字设定一个短的多的同义词。
namespace szn{}
namespace s = szn; //令s称为命名空间szn的别名
// L:using声明:一条using声明语句一次引入命名空间的一个成员,其有效范围是从using声明开始的地方一直到using声明所在的作用域结束为止。在此过程中,外层作用域的同名实体将被隐藏。在类中,这样的声明语句只能指向基类的成员,并改变其访问权限。
// 注意点:using只作用于一个名字。当命名空间szn存在多个名为fun的重载函数时,当使用using szn::fun;会将fun的所有重载版本均添加到使用using声明的作用域中。
// 一个using声明引入的函数将重载该声明语句所属作用域中声明的其他同名函数。如果using声明出现在局部作用域中,则引入的名字将隐藏外层作用域的相关声明。如果using声明所在的作用域中已经有一个函数与新引入的函数完全相同则会引发错误。
// M:using指示:以关键字using开始后接关键字namespace以及命名空间的名字。using指示使得特定的某个命名空间中的所有名字都可见。这就有可能导致名字冲突问题。在命名空间本身的实现文件中可以使用using指示,或者在一个函数的内部使用using指示,其他情况慎用。
// 使用using指示,实际上是将被操作的命名空间中的成员提升到最近的外层作用域中。
// 与using声明不同的是:对于using指示来说,引入一个与已有函数完全相同的函数并不会出错,此时只要我们指明当前调用的函数是来自命名空间的版本还是当前作用域的版本即可。
namespace szn {int value;}
int value;
int _tmain(int argc, _TCHAR* argv[])
{
//using指示
using namespace szn; //实际上是将命名空间szn中的成员提升最近的外层作用域即全局作用域中,从而产生了名字冲突
int v = value; //二义性
return ;
} namespace szn {int value = ;}
int value; int _tmain(int argc, _TCHAR* argv[])
{
//using声明
using szn::value; //使用using声明则是将指定命名空间中的指定名字添加入当前作用域,不会产生名字冲突。
int v = value; //v = 10
return ;
} namespace szn {void fun(){printf("szn_0\n");}}
//using szn::fun; //将报错
using namespace szn; //不会报错
void fun(){printf("szn_1\n");} // N:命名空间内部名字的查找规则: 即由内向外依次查找每个外层作用域。
// 对于位于命名空间中的类来说,常规的查找规则仍然适用:当成员函数适用某个名字时,首先在该成员中查找,然后在类中查找(包括基类),最后在外层作用域中查找。
// 对于命名空间中名字的隐藏规则来说有一个重要的例外:当我们给函数传递一个类类型对象、指针、引用时,除了在常规的作用域中查找外还会查找实参类所属的命名空间。
namespace szn
{
class CTest {public: int value;};
void SetAndPrintfCTest(CTest &Test){Test.value = ; printf("%d\n", Test.value);}
}
szn::CTest Test;
SetAndPrintfCTest(Test); //这里无需使用szn::限定符和using声明就可以调用SetAndPrintfCTest //3.多重继承与虚继承:待研究

C++Primer 第十八章的更多相关文章

  1. 【C++】《C++ Primer 》第十八章

    第十八章 用于大型程序的工具 大规模应用程序的特殊要求包括: 在独立开发的子系统之间协同处理错误的能力. 使用各种库进行协同开发的能力. 对比较复杂的应用概念建模的能力. 一.异常处理 异常处理(ex ...

  2. 《Linux内核设计与实现》读书笔记 第十八章 调试

    第十八章调试 18.1 准备开始          需要准备的东西: l  一个bug:大部分bug通常都不是行为可靠而且定义明确的 l  一个藏匿bug的内核版本:找出bug首先出现的版本 l  相 ...

  3. Python之路【第十八章】:Django基础

    Django基本配置 Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Se ...

  4. 《Linux内核设计与实现》课本第十八章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第十八章自学笔记 By20135203齐岳 通过打印来调试 printk()是内核提供的格式化打印函数,除了和C库提供的printf()函数功能相同外还有一 ...

  5. 《Linux命令行与shell脚本编程大全》 第十八章 学习笔记

    第十八章:初识sed和gawk 文本处理 sed编辑器 sed编辑器可以基于输入到命令行的或是存储在命令文本文件中的命令来处理数据流中的数据. 它每次读取一行,用提供的编辑器命令匹配数据.按命令中指定 ...

  6. 第十八章 DjangoWeb开发框架

    第十八章 DjangoWeb开发框架 第一课 内容概要: 1.JS正则 -登录注册验证 2.组件 1.BootStrap -css -js 学习BootStrap规则 2.jQueryUI -css ...

  7. Gradle 1.12用户指南翻译——第四十八章. Wrapper 插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  8. Gradle 1.12 翻译——第十八章. 日志

    有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...

  9. Gradle 1.12用户指南翻译——第二十八章. Jetty 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

随机推荐

  1. HTML: Css引入的四種方式

    哪四種?這裏簡單進行下總結 ①寫在 style 標籤中 <style type="text/css"> 這裏是css代碼... </style> ②外部引入 ...

  2. Bootstrap页面布局24 - BS旋转木马功能

    代码: <div class='container-fluid'> <h3 class='page-header'>Bootstrap 旋转木马</h3> < ...

  3. 策略模式代替大量的if else

    原代码 public class Example { public Double calRecharge(Double charge, RechargeTypeEnum type) { if (typ ...

  4. [收藏]Asp.net MVC生命周期

    一个HTTP请求从IIS移交到Asp.net运行时,Asp.net MVC是在什么时机获得了控制权并对请求进行处理呢?处理过程又是怎样的? 以IIS7中asp.net应用程序生命周期为例,下图是来自M ...

  5. linux configure

    Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而 ...

  6. Decimal、 Float、 Double 使用

    一.Java 1.float型定义的数据末尾必须 有"f "或"F",为了和double区别.例float x=123.456f,  y=2e20f; publ ...

  7. Qt拖拽界面 (*.ui) 缩放问题及解决办法(在最顶层放一个Layout)

    问题 使用Qt Designer 设计的界面,在缩放的时候不能随着主窗口一起缩放. 解决办法 之前遇到这个问题的时候,都是直接重写resizeEvent接口来实现的,在自动生成的Ui_Widget或U ...

  8. 如何将cmd中命令输出保存为TXT文本文件

    在使用Windows 中的cmd.exe工具时,有时候我们想要把我们的输入命令及结果保存起来, 但是用复制的方法过于麻烦:有时输出数据条数过大,会造成内容自动滚出屏幕,无法阅读,我们可将命令运行的结果 ...

  9. Qt high DPI

    http://doc.qt.io/qt-5/highdpi.html Qt Support Ability to provide pixmaps or artwork for high resolut ...

  10. android提供ToolBar实现划动菜单的陷阱

    代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android: ...