读书
shi5jin
这个作者很懒,什么都没留下…
展开
-
站在巨人肩上的思考 [连载] (1)
[原创。欢迎复制。转载请您注明出处 -- Gavin]Tips: Correctness, simplicity, and clarity come first.序言: 2006年圣诞节这天,我终于买来了传说中的《The C++ Programming Language》这本Bjarne Stroustrup亲自撰写的著作。在此之前,也曾读过一些其它经典系列,但细细品读原创 2007-04-08 12:05:00 · 434 阅读 · 0 评论 -
我应该怎样处理内存泄漏?
很 简单,只要写“不漏”的代码就完事了啊。显然,如果你的代码到处是new、delete、指针运算,那你想让它“不漏”都难。不管你有多么小心谨慎,君为 人,非神也,错误在所难免。最终你会被自己越来越复杂的代码逼疯的——你将投身于与内存泄漏的奋斗之中,对bug们不离不弃,直至山峰没有棱角,地球不再 转动。而能让你避免这样困境的技巧也不复杂:你只要倚重隐含在幕后的分配机制——构造和析构,让C++的强大的...2007-09-06 10:43:39 · 119 阅读 · 0 评论 -
为何空类的大小不是零?
为了确保两个不同对象的地址不同,必须如此。也正因为如此,new返回的指针总是指向不同的单个对象。我们还是来看代码吧: class Empty { }; void f() { Empty a, b; if (&a == &b) cout << "impossible: report error to compiler supplier"; Empty* p1 = ...2007-09-06 10:46:13 · 127 阅读 · 0 评论 -
如何在类中定义常量?
如果你想得到一个可用于常量表达式中的常量,例如数组大小的定义,那么你有两种选择: class X { static const int c1 = 7; enum { c2 = 19 }; char v1[c1]; char v2[c2]; // ... };一眼望去,c1的定义似乎更加直截了当,但别忘了只有static const的整型或枚举型量才能如此初始化。这就很有局限性,例如...2007-09-06 10:51:58 · 529 阅读 · 0 评论 -
为何我的构造函数不太对劲?
类似这样的问题千奇百怪。例如: 为什么我明明不想复制对象,而编译器却偏偏这么做了呢? 如何关闭复制机制? 如何防止隐式转换? 为何 int 自动转换成了复数? 类的默认复制构造函数和赋值运算符可以复制所有元素。例如: struct Point { ...2007-09-06 10:57:38 · 76 阅读 · 0 评论 -
我能从构造函数调用虚函数吗?
可以。不过你得悠着点。当你这样做时,也许你自己都不知道自己在干什么!在构造函数中,虚拟机制尚未发生作用,因为此时overriding尚未发生。万丈高楼平地起,总得先打地基吧?对象的建立也是这样——先把基类构造完毕,然后在此基础上构造派生类。 看看这个例子: #include<string> #include<iostream> using namespace std;...2007-09-06 11:18:36 · 193 阅读 · 0 评论 -
A Generic Ostream Iterator
by Christopher DigginsNovember 11, 2005 Summary Ostream iterators are a handy but under-utilized tool for using the STL to output containers and ranges. Here I provide an alternative, which ...2007-09-07 08:37:30 · 110 阅读 · 0 评论 -
一种“标准”的虚函数机制简介
编译器是如何针对虚函数产生可以再运行时刻确定被调用函数的代码呢?也就是说,虚函数实际上是如何被编译器处理的呢?Lippman在深度探索C++对象模型中的不同章节讲到了几种方式,这里把“标准的”方式简单介绍一下。 我所说的“标准”方式,也就是所谓的“VTABLE”机制。编译器发现一个类中有被声明为virtual的函数,就会为其搞一个虚函数表,也就是VTABLE。VTABLE实际上是...2007-11-09 11:07:00 · 99 阅读 · 0 评论 -
站在巨人肩上的思考[连载] (7)
4.8 枚举 枚举是表示具有共同属性的整型常量集合的用户自定义类型。这其中包含这些含义:1. 枚举的取值只能是整数,正负皆可;2. 枚举的取值是常量,枚举初始化后,这些值不能被改变;3. 枚举也是一种用户自定义类型,用户定义好枚举后,可以自定义该枚举类型自身的操作,如“++”,“<<”等;<o:p>...2007-12-03 14:56:08 · 158 阅读 · 0 评论 -
您可以推荐一种编写代码的标准吗?
C++ 代码编写标准的要点是:根据使用 C++ 的具体的环境和具体目的制定一套规则。因此,没有哪一种代码编写标准是符合所有需要和所有用户的。对于一个特定的应用程序(或者公司、应用领域,等等)来 说,一种好的代码编写标准当然比没有标准要好得多。话说回来,我看到过很多例子表明一种差劲的代码编写标准比没有标准还要更糟糕。 选择规则时,请切记细心,而且你必须对该应用领域有过硬的知识。一些最...2007-09-06 10:36:03 · 95 阅读 · 0 评论 -
如何使用异常?
请参考 TC++PL 章节 8.3、第十四章,以及附录 E。附录聚焦于如何为“苛刻的”应用程序编写异常安全(exception-safe)的代码,它并非写给初学者看的。 C++ 里,异常用于发出一种信号,表示发生了“本地”处理不了的错误,比如构造函数里某个获取资源的操作失败了。例如: class Vector { int sz; ...2007-09-05 09:34:35 · 100 阅读 · 0 评论 -
为何C++既有指针也有引用?
C++ 的指针继承于 C,若要移除指针,势必造成严重的兼容性问题。引用有几方面的用处,但我在 C++ 中引入它的主要目的是为了支持运算符重载。例如: void f1(const complex* x, const complex* y) // 没有引用 { complex z = ...2007-09-05 09:28:28 · 693 阅读 · 0 评论 -
站在巨人肩上的思考 [连载] (2)
1.3 C++的设计tips: "If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would detroy civilization." -- Gerald Weinberg----------------------原创 2007-04-08 12:32:00 · 419 阅读 · 0 评论 -
站在巨人肩上的思考 [连载] (1)
[原创。欢迎复制。转载请您注明出处 -- Gavin]Tips: Correctness, simplicity, and clarity come first.序言: 2006年圣诞节这天,我终于买来了传说中的《The C++ Programming Language》这本Bjarne Stroustrup亲自撰写的著作。在此之前,也曾读过一些其它经典系列,但细细品读了该书...2007-04-06 08:20:38 · 111 阅读 · 0 评论 -
站在巨人肩上的思考 [连载] (2)
<st1:chmetcnv tcsc="0" w:st="on" unitname="C" sourcevalue="1.3" numbertype="1" negative="False" hasspace="True">1.3 C</st1:chmetcnv>++的设计tips: "If bu2007-04-07 11:23:16 · 313 阅读 · 0 评论 -
站在巨人肩上的思考 [连载] (3)
上一篇中,主要是对C++类设计的一个概览。如果你认为那写得很肤浅,并能明确指出问题所在,那么恭喜你,可以说,你对C++的类机制有了更深入的了解! 这并不是说上篇笔记中有什么错误,前文仅仅就B.S.概述当中的某几句进行了适当的联想,但不能说全面、深入。其中提及的好多思想,方法只是针对C++类设计当中的类别:“具体类”的设计与实现。其他诸如层次结构的、多态的、范型的设计...2007-04-09 08:36:26 · 145 阅读 · 0 评论 -
站在巨人肩上的思考[连载] (4)
首先感谢 spinach 的鼓励与支持。你给了我很大的动力,真诚的希望我的文字能够对你有所帮助。 这篇之后可能周末前不会再更新了,因为手头上有个项目需要集中精力先搞定。本笔记首发www.iteye.com 转载请您注明出处。谢谢。 ...2007-04-10 11:13:33 · 277 阅读 · 0 评论 -
站在巨人肩上的思考[连载] (5)
最近做个小项目,有点忙。事情倒是不难,就是有点杂,涉及到好多的东西,还得现找资料。这次又学习了远程数据库和rpc的编程,都挺有意思的,有时间和大家交流一下,不知道斑竹允不允许在本版讨论这些乱七八糟的东西,呵呵。估计这周项目会结案,争取多多更新。:)祝贺圈子朋友达到100人,希望我们这里越来越热闹!本笔记首发www.iteye.com 转载请注明出处。谢谢。//---------...2007-04-23 19:40:10 · 114 阅读 · 0 评论 -
站在巨人肩上的思考[连载] (6)
第4章 类型和声明4.3 字符类型 “由8bits表示的256个值可以解释为0~255,或者解释为-128~127,不幸的是,普通char类型选择那种解释是由具体实现决定的”[1]<o:p></o:p> 所以,不要做过多的假设。如果你必须这样做,请使用显式的signed char或者unsigned char来声明变量。4.4整数类型“...2007-05-04 09:31:05 · 163 阅读 · 0 评论 -
可以在构造函数里抛出异常吗?析构函数里呢?
可以:当你不能正常地初始化(构造)对象时,你应该在构造函数里抛出异常。没有任何其它方法比抛出异常退出构造函数更合适了。 不然:你可以在析构函数里抛出异常,但这个异常必须不能越过析构函数;如果因为抛出异常而退出了析构函数,任何糟糕的情况都可能发生,因为这违反了标准库及 C++ 语言本身的基本规则。不要这么做。更详细的实例和解释尽在 TC++PL 附录 E。给你一个忠告:...2007-09-05 09:24:19 · 364 阅读 · 0 评论 -
站在巨人肩上的思考[连载] (8)
5.2 数组5.2.2 字符串文字量 类似”this is a string.”这样一个字符串文字量,它是一个常量。正如代码中一个显式的数字0xff08一样,其值不可以被更改。如想修改,可以通过复制给一个变量来实现: <v:shapetype id="_x0000_t202" path="m,l,21600r21600,l21600,xe" o:sp...2007-12-03 14:58:01 · 221 阅读 · 0 评论