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 ...
随机推荐
- Behavior-Based Intelligence
Computer Science An Overview _J. Glenn Brookshear _11th Edition Early work in artificial intelligenc ...
- CentOS安装JAVA后JAVA版本不对的问题
今天用CentOS安装JDK,发觉在安装完成后,输入java命令来验证是否安装成功时,出现 Usage: gij [OPTION] ... CLASS [ARGS] ... to i ...
- (转)Linux下安装Matlab2014及破解
原文链接:http://blog.csdn.net/lanbing510/article/details/41698285 文章已搬家至http://lanbing510.info/2014/12/0 ...
- 【php学习】时间函数
手工画了一张图,来大体概括php中对于时间的处理函数 首先时间戳是这样“1441202665”的一串数字,虽然人看起来麻烦,但是计算机却很容易识别这样的时间表示形式. 所以给计算机看的时间是时间戳,给 ...
- 解决微软的两个恶心问题(VS2008死机、Win2008 WAS无法启动)
1.Visual Studio 2008,在切换到Web设计界面或Html Markup界面时,过一段时间就出现假死,点击任何地方没反应,也关闭不了,只能用任务管理器结束任务. 上网查了下,应该是先装 ...
- 低功耗蓝牙4.0BLE编程-nrf51822开发(8)-GATT
The Generic Attribute Profile (GATT)使用属性定义一个服务框架,定义了服务和特性的过程和数据格式,包含发现.读取.写入.通知指示特性和配置特性广播. GATT配置文件 ...
- MongoDB上的索引
1. 将索引建在number键上名为nameIndex并且为正序索引({number:-1}为倒序索引) 如: db.list名.ensureIndex({number:1},{name:" ...
- Android生命周期详细说明
提供两个关于Activity的生命周期模型图示帮助理解: 图1 图2 从图2所示的Activity生命周期不难看出, ...
- 自动换行的矢量文字(android demo)
由于矢量字体的宽度不同,自测android字体,发现当中文字体大小为100像素时,字母s等 宽度大概在52,字母l等 宽度大概在26,这样自动换行就不可以按字符的个数计算截取每行显示的字串. 直接上代 ...
- Maven实战(三)Eclipse构建Maven项目
1. 安装m2eclipse插件 要用Eclipse构建Maven项目,我们需要先安装meeclipse插件 点击eclipse菜单栏Help->Eclipse Marketplac ...