C++Primer 第十八章
//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 第十八章的更多相关文章
- 【C++】《C++ Primer 》第十八章
		
第十八章 用于大型程序的工具 大规模应用程序的特殊要求包括: 在独立开发的子系统之间协同处理错误的能力. 使用各种库进行协同开发的能力. 对比较复杂的应用概念建模的能力. 一.异常处理 异常处理(ex ...
 - 《Linux内核设计与实现》读书笔记 第十八章 调试
		
第十八章调试 18.1 准备开始 需要准备的东西: l 一个bug:大部分bug通常都不是行为可靠而且定义明确的 l 一个藏匿bug的内核版本:找出bug首先出现的版本 l 相 ...
 - Python之路【第十八章】:Django基础
		
Django基本配置 Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Se ...
 - 《Linux内核设计与实现》课本第十八章自学笔记——20135203齐岳
		
<Linux内核设计与实现>课本第十八章自学笔记 By20135203齐岳 通过打印来调试 printk()是内核提供的格式化打印函数,除了和C库提供的printf()函数功能相同外还有一 ...
 - 《Linux命令行与shell脚本编程大全》 第十八章 学习笔记
		
第十八章:初识sed和gawk 文本处理 sed编辑器 sed编辑器可以基于输入到命令行的或是存储在命令文本文件中的命令来处理数据流中的数据. 它每次读取一行,用提供的编辑器命令匹配数据.按命令中指定 ...
 - 第十八章 DjangoWeb开发框架
		
第十八章 DjangoWeb开发框架 第一课 内容概要: 1.JS正则 -登录注册验证 2.组件 1.BootStrap -css -js 学习BootStrap规则 2.jQueryUI -css ...
 - Gradle 1.12用户指南翻译——第四十八章. Wrapper 插件
		
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
 - Gradle 1.12 翻译——第十八章. 日志
		
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
 - Gradle 1.12用户指南翻译——第二十八章. Jetty 插件
		
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
 
随机推荐
- LR中日志设置和日志函数
			
LR中日志参数的设置与使用 1.Run-Time Setting日志参数的设置 在loadrunner的vuser菜单下的Run-Time Setting的General的LOG选项中可以对在执行脚本 ...
 - thinkPhp 3.1.3的验证码无法显示的问题
			
Image帮助类的output方法中,在下面的代码 header("Content-type: image/" . $type); 前增加代码: ob_end_clean();
 - Python操作MySQL以及中文乱码的问题
			
Python操作MySQL需要安装Python-MySQL可以从网上搜索一下,和一般的Python包一样安装 安装好之后,模块名字叫做MySQLdb ,在Window和Linux环境下都可以使用,试验 ...
 - php经典笔试题
			
五.基础及程序题(建议使用你擅长的语言:C/C++.PHP.Java) 5.写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一个维数组.(提示:不能使用系统已有函数,另外请仔细回忆以前学 ...
 - 【转】HideInInspector 与SerializeField
			
http://blog.csdn.net/luyuncsd123/article/details/21563697 [HideInInspector]表示将原本显示在面板上的序列化值隐藏起来. [Se ...
 - Iphone H5上传照片被旋转
			
最近做项目发现在Iphone下,我们上传图片都会被翻转,最后查阅资料发现,的确是IOS的问题 不说过程,直接解决方法 iOS下,html方式使用<input type="file&qu ...
 - filter:Alpha总结
			
filter:Alpha(Opacity=?, FinishOpacity=?, Style=?, StartX=?, StartY=?, FinishX=?, FinishY=?)Opacity:透 ...
 - docker squid---but git proxy should specify by git config --global http.proxy http:...
			
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.t ...
 - There is no tracking information for the current branch
			
There is no tracking information for the current branch. Please specify which branch you want to mer ...
 - [LeetCode] Subsets (bfs的vector实现)
			
Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...