C++Primer 第十八章

//1.异常:待研究

//2.命名空间:
//  A:多个库将名字放置在全局命名空间中将引发命名空间污染。
//  B:命名空间为防止名字冲突提供了更加可控的机制。命名空间分割了全局命名空间,其中每个命名空间都是一个作用域。
//  C:一个命名空间的定义包含两个部分:首先是关键字namespace,随后是命名空间的名字。只要是能出现在全局作用域中的声明就能置于命名空间中,主要为:类,变量(及其初始化操作),函数,模板和其它命名空间。
//  D:命名空间不能定义在函数或类的内部,可以定义在全局命名空间和其它命名空间中。
//  E:命名空间作用域后面无需分号。
//  F:命名空间可以定义在几个不同的部分。形如: namespace szn{}可能定义了一个名为szn的新命名空间,也可能是为已经存在的命名空间添加新的成员。如类的声明和定义应该分开置于不同的文件,则当类位于命名空间时就可方便的声明与定义了。
//  G:允许在命名空间中声明一个成员而在命名空间所属的外层空间中进行定义。
//  H:全局作用域中定义的名字也就是定义在全局命名空间中。全局命名空间以隐式的方式声明,并且在程序中都会存在,全局作用域中定义的名字被隐式添加到全局命名空间中。
//  I:作用域运算符同样可以作用于全局作用域的成员,因为全局作用域是隐式的,所以其没有名字,形如 ::member_name;
//  J:未命名的命名空间:是指关键字namespace后紧跟花括号扩起来的一系列声明语句。未命名的命名空间中定义的变量具有静态生命周期。一个未命名的命名空间不能跨越多个文件。每个文件定义了自己的未命名的命名空间。
//    如果一个头文件定义了未命名的命名空间,则该命名空间中的定义的名字将在每个包含了该头文件的文件中对应不同实体。
//    在文件中进行静态声明的做法应该是:使用未命名的命名空间。使用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 0;
}

namespace szn    {int value = 10;}
int value;

int _tmain(int argc, _TCHAR* argv[])
{
    //using声明
    using szn::value;        //使用using声明则是将指定命名空间中的指定名字添加入当前作用域,不会产生名字冲突。
    int v = value;            //v = 10
    return 0;
}

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 = 10; printf("%d\n", Test.value);}
}
szn::CTest Test;
SetAndPrintfCTest(Test);        //这里无需使用szn::限定符和using声明就可以调用SetAndPrintfCTest

//3.多重继承与虚继承:待研究
时间: 2024-10-24 18:13:19

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

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

第十八章调试 18.1 准备开始          需要准备的东西: l  一个bug:大部分bug通常都不是行为可靠而且定义明确的 l  一个藏匿bug的内核版本:找出bug首先出现的版本 l  相关内核代码的知识和运气 最好能让bug重现,有一些bug存在而且有人没办法让他重现,因为内核与用户程序和硬件间的交互很微妙. 18.2内核中的bug 可以有无数种原因产生,表象也变化多端.代码中的错误往往引发一系列连锁反应,目击者才看到bug. 18.3通过打印来调试 内核提供了打印函数printk

第十八章 并发登录人数控制——《跟我学Shiro》(http://blog.csdn.net/lhacker/article/details/19334305)

第十八章 并发登录人数控制——<跟我学Shiro> 博客分类: 跟我学Shiro 跟我学Shiro 目录贴:跟我学Shiro目录贴 在某些项目中可能会遇到如每个账户同时只能有一个人登录或几个人同时登录,如果同时有多人登录:要么不让后者登录:要么踢出前者登录(强制退出).比如spring security就直接提供了相应的功能:Shiro的话没有提供默认实现,不过可以很容易的在Shiro中加入这个功能. 示例代码基于<第十六章 综合实例>完成,通过Shiro Filter机制扩展Ki

第十八章 SOCKET类的实现

                        第十八章    SOCKET类的实现         这几天反复思考,到底是从上到下.还是从底层开始往上设计?最后.还是决定从上层建筑开始.APO追求的是简单.再简单!强大.再强大!高速.高效!"天下武功.无坚不破.唯快不破!". APO的socket也不外是一种内存文件吧,但socket描述符和其它类型的文件描述符还是略有区别的.APO中的一个用户进程最多可打开64K个非socket类型的文件描述符,而APO系统只是最多可以打开16M个

第十八章 面向对象的特性

学习要点:1.OOP 的封装2.OOP 的继承3.OOP 的多态 面向对象的三个主要特性是封装.继承和多态. 一.OOP的封装 隐藏对象的字段和实现细节,仅对外公开接口,控制在程序中字段的读和修改的访问级别:将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成"类",其中数据和函数都是类的成员. 字段的作用域1.public 公共的(类外可以访问)2.private 私有的(类内可以访问)3.protected 受保护的(类内和

Linux内核分析——第十八章 调试

第十八章    调试 18.1 准备开始 1.在用户级的程序里,bug表现比较直接:在内核中却不清晰. 2.内核级开发的调试工作远比用户级开发艰难的多. 3.准备工作需要的是: (1)一个bug (2)一个藏匿bug的内核版本 (3)相关内核代码的知识和运气 18.2 内核中的bug 1.内核中的bug多种多样. 2.引用空指针会产生一个oops:垃圾数据会导致系统崩溃. 3.定时限制和竞争条件都允许多个线程在内核中同时运行产生的结果. 18.3 通过打印来调试 一.健壮性 1.健壮性——在任何

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

有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html 本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41241915 关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qin

Linux Socket Programming by Example-第十八章 实战

第18章主要介绍了一个软件实践项目. 架构: C/S 功能:实现一个股票信息广播发布平台. 这个代码本身对2年工作以上的人来说,毫无参考价值. 主要的是软件本身引发的一些发散思考. 最近智能家电 物联网 大数据 数字医疗等都很火热. 这些设备均涉及到2个网络, 一个是基于WIFI.以太网的局域网 一个是基于ISP服务的互联网. 具体构架: 家里的智能设备     -> WiFi  ->  智能路由器 -> ISP ->  互联网 (远程服务器) 如果将智能路由器扩展下,变成带数据库

Gradle 1.12用户指南翻译——第三十八章. Eclipse 插件

本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userg

DRILLNET 2.0------第二十八章 背景知识

第二十八章 背景知识 <略>?