相关推荐
-
Thinking_in_C++_中文版【高清+可搜索+可编辑/复制/粘贴+无密码】
一、下载须知: .................本书无目录 .................本书经过内容识别处理,所以好处就是书上的案例源码可以直接粘贴复制到编辑器中,当然有个别括号什么的可能需要自己纠正一下。 ................本书高清 ...............本书是和代码结合在一起讲解的,其中也讲到了运行时类的识别等等。 二、截取部分章节 《第18章:运行时类型识别》 RTTI的两种使用方法 使用RT T I有两种不同的方法。第一种就像s i z e o f ( ),因为它看上就像一个函数。但实际上它是 由编译器实现的。t y p e i d ( )带有一个参数,它可以是一个对象引用或指针,返回全局t y p e i n f o类的 常量对象的一个引用。可以用运算符“= =”和“!=”来互相比较这些对象。也可以用n a m e ( )来 获得类型的名称。注意,如果给t y p e i d ( )传递一个s h a p e *型参数,它会认为类型为s h a p e *,所以如 果想知道一个指针所指对象的精确类型,我们必须逆向引用这个指针。比如,s是个s h a p e * , cout << typeid(*s).name()<<endl; 将显示出s所指向的对象类型。 也可以用b e f o r e ( t y p e i n f o & )查询一个t y p e i n f o对象是否在另一个t y p e i n f o对象的前面(以定 义实现的排列顺序),它将返回t r u e或f a l s e。如果写: if(typeid(me).before(typeid(you))) //... 那么表示我们正在查询m e在排列顺序中是否在y o u之前。 RT T I的第二个用法叫“安全类型向下映射”。之所以用“向下映射”这个词也是由于类继 承的排列顺序。如果映射一个c i r c l e *到s h a p e *叫向上映射的话,那么将一个s h a p e *映射成一个 c i r c l e *就叫向下映射了。当然一个c i r c l e *也是一个s h a p e *,编译器允许任意的向上映射,但一 个s h a p e *不一定就是c i r c l e *,所以编译器在没有明确的类型映射时并不允许我们完成一个向下 映射任务。当然可以用原有的C风格的类型映射或C + +的静态映射(s t a t i c c a s t ,将在本章末介绍) 来强制执行,这等于在说:“我希望它实际上是一个c i r c l e *,而且我打算要求它是。”由于并没 有明确地知道它实际上是c i r c l e,因此这样做是很危险的。在开发商制定的RT T I中一般的方法 是:创建一个函数来试着将s h a p e *指派为一个c i r c l e * (在本例中),检查执行过程中的数据类型。 如果这个函数返回一个地址,则成功;如果返回n u l l,说明我们并没有一个c i r c l e *对象。 C + +的RT T I的“安全类型向下映射”就是按照这种“试探映射”函数的格式,但它(非常 合理地)用模板语法来产生这个特殊的动态映射函数( d y n a m i c c a s t),所以本例变成: 动态映射的模板参数是我们想要该函数创建的数据类型,也就是这个函数的返回值。函数 参数是我们试图映射的源数据类型。 通常只要对一种类型作这种工作(比如将三角型变成紫色),但如果想算出各种s h a p e的数 目,可以用面下例子的框架: 当然这是人为的—我们可能已经在各个类型中放了一个静态数据成员并在构造函数中对 第18章运行时类型识别383 下载 shape* sp = new circle; circle* cp = dynamic_cast<circle*>(sp); if(cp) cou七<< "cas 七successful"; circle* cp = dynamic_cas区circle*>(sh); square* sp = dynamic_cast<square*>(sh); triangle* 七p = dynamic_cast<triangle*>(sh); 它自增。如果可以控制类的源代码并可以修改它,当然可以这样做。下面这个例子用来计算 s h a p e的个数,它用了静态数据成员和动态映射两种方法: 384 C + +编程思想 下载 //: RTSHAPES.CPP -- Counting shapes #include <iostream.h> #include< 七ime.h> #include <typeinfo.h> #include"·.\14\tstash.h" class shape { protected: S 七atic in七coun店 public: shape() { count++; vir七ual -shape() = O { count--; } vir七ual void draw () const = O; static in七quan七让y() { return count; }; in七shape : : count = O; class rectangle : public shape void operator=(rectangle&); // Disallow protected: static int count; public: rectangle() { count++; rectangle(const rectangle&) { count++;} -rectangle() { count--; } void draw () cons 七{ cout << "rec 七angle: : draw ()" << endl; S 七atic int quantity() { return count; } ... ' int rectangle: : count = 0; class ellipse : public shape void operator=(ellipse&}; // Disallow protected: static int count; public: ellipse () { count++; } ellipse (const ellipse&) { count++; } ~ellipse() { count 一;} void draw() cons 七{ cout << "ellipse: :draw()" << endl; 第18章运行时类型识别385 下载 } static int quantity() { return count; } }; int ellipse::count = O; class circle: public ellipse { void operator=(circle&); // Disallow protected: static int count; public: circle() { count++; } circle(cons 七circle&) { count++; } 一circle() { count--; } void draw() const { cout << "circle: :draw()" << endl; } static in七quantity() { return count; } } ; int circle::count = 0; main() { 七stash<shape> shapes; time_t t; II Seed random number generator: srand((unsigned)time(&t)); const mod= 12; for(int i = 0; i < rand() 令mod; i++) shapes.add(new rectangle); for(int j = O; j < rand() % mod; j++) shapes.add(new ellipse); for(int k = O; k < rand() 兮mod; k++) shapes.add(new circle); int Ncircles = O; int Nellipses = O; int Nrects = O; int Nshapes = O; for(int u = O; u < shapes.count(); u++) { shapes[u]->draw(); if(dynamic_cast<circle*>(shapes[u])) Ncircles++; if(dynamic_cast<ellipse*>(shapes[u])) Nellipses++; if(dynamic_cast<rectangle*>(shapes[u])) Nrects++; 对于这个例子,两种方法都是可行的,但静态数据成员方法只能用于我们拥有源代码并已 安装了静态数据成员和成员函数时(或者开发商已为我们提供了这些),另外RT T I可能在不同 的类中用法不同。 18.3 语法细节 本节详细介绍RT T I的两种形式是如何运行的以及两者之间的不同。 18.3.1 对于内部类型的typeid() 为了保持一致性, t y p e i d ( )也可以运用于内部类型,所以下面的表达式结果为t r u e: 18.3.2 产生合适的类型名字 t y p e i d ( )必须在所有的状况下都可以运行,比方说,下面的类中包含了一个嵌套类: 386 C + +编程思想 下载 } if(dynamic_cast<shape*>(shapes[u])) Nshapes++; cout << endl << endl <<"circles=• << Ncircles << endl <<"ellipses=• << Nellipses << endl << "rec 七angles="<< Nrects << endl <<"shapes="<< Nshapes << endl << endl << "circle: :quantity() =• << circle: :quantity() << endl << "ellipse: :quantity() = " << ellipse: :quantity() << endl << "rectangle: :quantity() =" << rectangle: : quantity () << endl << "shape: :quantity() =• << shape: :quantity() << endl;
-
Thinking In C++中文版
<br />----------------------- Page 1-----------------------<br /> 下载 <br /> 第1章 对象的演化 <br /> 计算机革命起源于一台机器,程序设计语言也源于一台机器。 <br /> 然而计算机并不仅仅是一台机器,它是心智放大器和另一种有表述能力的媒体。这一点 <br />使它不很像机器,而更像我们大脑的一部分,更像其他有表述能力的手段,例如写作、绘画、 <br />雕刻、动画制作
-
Thinking in C++.中文版
虽然C++领域的经典书籍犹如过江之鲫、车载斗量,但其中的可供初学者入门的书籍却并不多。可能C++阵营里的牛人太多了,都不屑于写入门级新手教程。虽然Bjarne Stroustrup大叔说学习C++不需要学习C语言,但实践表明有C语言基础还是很有帮助的。另外大叔自己写的那本《The C++ Programming Language》初学者不要看! 好了,如果你已有C语言使用经验,想要继续学习C++,那么有两本书值得推荐:《Thinking in C++》和《C++ Primer》,前者浅显易懂,后者广博渊深,都是学习C++良师益友。 《Thinking in C++》分为两本:volume I(卷1)和volume II(卷2)。卷1的作者是著名的Bruce Eckel,卷2是他和人合著的。我感觉是卷2相比卷1语言上要晦涩不少,不如看《C++ Primer》和《The Standard Template Library》。 《Thinking in C++》卷1和《Thinking in Java》最大的特点就是结合面向对象的设计思想来讲解C++、Java程序设计,在阐述OOP方面做得非常好!其他C++书籍无出其右。
-
Thinking in java和Thinking in c++中文版
Thinking in java 和 Thinking in C++中文版 分别为chm和pdf格式,前者可以直接打开。
-
从《thinking in C++》被迫转到《C++ Primer》第一天
今天啃《thinking in C++》有种不能继续下去的感觉,一方面我一看书就停不下来,难懂+没有休息容易困,所以看的速度并不快。另外感觉里边有很多内容在建立在你了解其使用的基础上的理论提升,所以我认识需要补一下基础。在网上查了一下,确定串插着看《C++ Primer》。 《C++ Primer》第一、二章笔记 一些基本的类型、控制语句、关键字什么的我都略过了。 1.在#inclu
-
Thinking in C 英文版
Thinking in C 英文原版,doc格式,方便移动设备观看。
-
Thinking In C++(C++编程思想英文版).pdf
Thinking In C++(C++编程思想英文版).pdf
-
Thinkin in C++ (C++编程思想) 英文版 两册全
C++编程思想,经典的C++教程。英文原版,两册全。非扫描,十分清晰。
-
Windows 10 Inside Out(2nd) 无水印pdf
Windows 10 Inside Out(2nd) 英文无水印pdf 第2版 pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
-
Thinking in C++ 卷2中文版
让我们对bruceeckel的开源精神致以崇高的敬意IO流 You can do much more with the general I/O problem than just take standard I/O and turn it into a class。 如果你能产生通常看起来一样的容器——标准IO,文件,甚至内存块,以致于你只须仅仅记住一个接口,难道这不是很好的吗?这
28 楼 YES 2010-02-05 12:22
flex sdk 需要jdk
真是讽刺呀。
27 楼 fasling 2010-02-02 17:05
同感
26 楼 volking 2010-02-02 16:32
flex成不了气候
25 楼 chandler 2010-02-02 14:56
24 楼 四非夜 2010-02-02 14:15
iphone能上youtube
你说ipad能不能上?
用ie也上不了
在天朝法律范围内,用什么你都上不了
23 楼 wwzg99 2010-02-02 12:15
呵呵,这个不能说的太细,但我希望Javaeye老板能给个说法
22 楼 Else 2010-02-02 11:33
iphone能上youtube
你说ipad能不能上?
用ie也上不了
21 楼 zhenng 2010-02-02 09:06
iphone能上youtube
你说ipad能不能上?
20 楼 diferent 2010-02-02 08:47
但是IE能打开近99%的网页 其他的浏览器 ....呃很惨 尤其是国内的
19 楼 znjq 2010-02-02 01:10
因为你不仔细观察。
你观察了.你来讲讲?
18 楼 halk 2010-02-01 21:10
17 楼 bitray 2010-02-01 20:51
因为你不仔细观察。
16 楼 jyh149129 2010-02-01 20:08
15 楼 fanlei77 2010-02-01 19:47
更严重的是什么M$,mac都藏着掖着,然后反过来咬一口,老乔这事儿办得不地道啊。
14 楼 elmar 2010-02-01 17:21
13 楼 trains629 2010-02-01 17:21
12 楼 wjing63 2010-02-01 13:13
youtube已经开始使用html5 video
11 楼 znjq 2010-02-01 12:57
10 楼 szwe 2010-02-01 12:18
9 楼 NeuronR 2010-02-01 12:15