2007年8月23日星期四

新读《C++Primer4》

虽然《C++Primer3》是我的枕边常读之书,但这次《C++Primer4》仍给我许多新的启发。该版进一步强调了C++作为一门工程语言的实用性。如在章节设置上,第一部与第二部都没有叙述Class的定义等内容,而是从使用者角度介绍STL中最常用库的介绍。这表明作者认为目前C++程序员更应该了解STL库,去用STL库,而不总是去设计“原始而拙劣”的Class。在第一部Basic中,作者将String、Vector等STL中最常用库介绍放在语句表达式之前介绍,并将Array与Pointer并入一章叙述,都体现了这一点。想现在大学中,许多学生学习完C++后,对于 Bind、Transform 等知之甚少,而 Class 也编写得很糟糕,就更感到《C++Primer》作者的真知灼见。“用比创建好”——这是《C++Primer4》给我的最深印象。

2007年8月20日星期一

网页上的代码高亮

在网络上发现一个源自Google的工具,可进行代码高亮。
1.下载并解压文件包,其中有两个文件:CSS和JS
2.在HTML文件头引用CSS与JS
< link href="prettify.css" type="text/css" rel="stylesheet">
< script type="text/javascript" src="prettify.js"></script>
3.在HTML正文中执行JavaScript命令,如 < body onload="prettyPrint()"> < /code >
4.需要高亮的代码用< code class="prettyprint" > ... < /code >包围即可。
原文地址:
http://google-code-prettify.googlecode.com/svn/trunk/README.html

2007年8月19日星期日

lstlisting的使用技巧

lstlisting中使用lstinputlisting命令导入外部源代码,不要全部导入,这样常会引起Latex解释错误。应定义起始/结束行号,这样即清楚,Latex编译也很快。
\lstinputlisting[language=Gnuplot,firstline=1,lastline=2]{sample01.plt}

2007年8月18日星期六

Firefox中的Gmail显示

最近Firefox中Gmail总是显示不正常,但在IE中却能正常显示,我原先以为是Firefox升级后的问题,今天Google得知原来是ADblock的缘故,故在ADblock中增加两条新的过滤条目后即可。

@@|http://*.google.com/
@@|https://*.google.com

2007年8月3日星期五

《C++沉思录》阅读笔记(5)

1.在一个具有继承关系的类群中使用容器会遇到许多在使用内在类型(元类型)时所不会遇到的问题,因为机器是不了解它要处理的问题的规模是多大。它像一个满脸青春痘的少年面对制定一个跨国企业下年度财务预算报表时一样茫然无措。这并不是说少年不够聪明,而是他没有多少经验。即便对于一个经过多年磨炼的人来说,面对一个无法预测边界的工作时,他多少也会紧张。
2.将继承与容器共用,迫使我们要处理两个问题:控制内存分配和把不同类型的对象放入同一个容器中。这其实是一个RTTI问题。在C++中的语言层次,并没有提供一个完善的RTTI解决方案,但其确提供了解决该问题的工具。可惜地是,该问题是OOP中最常见也是最难于理解的问题,故后来的Delphi、Java、C#等都将RTTI作为语言级机制内化起来。这固然为新手入门带来很多好处,并能大幅提高软件工业的生产效率。但软件生产是一个如此特殊的产业,了解RTTI等底层技术的人的产能可能是一般新手的几百倍。或许其只是在产生了形式上的"效率提高"的繁华,而实际整体并没有太多增长。
3.在容器中应该使用代理对象而不是对象本身。
4.在编辑器中手工编写一下代码,有时不需要编译就可以理解作者意图,而单纯阅读总像"雾里看花"。
5.不应该接受对象,而应该接受对象指针或者引用。这虽然带来显而易见的效率优势,也带来棘手的问题,因为使用对象指针比直接使用对象要困难,未初始化的指针是非常危险而且没有什么简单办法可以防范。所以要在其间增加一个代理类,将指针管理封装起来,这样就有效隔绝了指针问题的蔓延。
6.Handle类的实现越看越和COM机制相似,或许COM的实现就是采用这样的技术。
7.Copy on write技术能有效提高效率,在编写完成代码后,应该用该技术优化既有代码。

《C++沉思录》阅读笔记(4)

1.OOP->使用继承和动态绑定的编程方式;
2.检查表不是任务清单,它的用途是帮助你回忆起可能会忘掉的事情,而不是来约束你;
(1)构造函数
(2)私有数据成员
(3)带参数的构造函数
(4)是否每个构造函数都初始化所有的数据成员
(5)析构函数
(6)虚析构函数
(7)需要复制构造函数
(8)赋值操作符
(9)赋值操作符能正确地将对象赋值给对象吗?
(10)定义关系操作符
(11)删除数组时采用delete[]
(12)在复制构造函数与赋值操作符参数中使用const
(13)如果函数有引用参数,其应该是const吗?
(14)适当声明成员函数为const
3.C++更适合于那些喜欢思考的程序员;

《C++沉思录》阅读笔记(3)

1.Murphy's Law 墨菲法则,一件事只要有可能变糟,就一定会变糟。
2.通常我们不可能为特定的工具挑选合适的问题;而应该为特定的问题挑选合适的工具,但目前我们常常会在没有分析问题前就决定了工具,这常常是因为商业意义或其它原因。有时我会在第一次技术讨论会上,在一段5分钟的简短需求说明后,听到项目经理斩钉截铁地提出要采用J2EE+***或者ASP.NET+***等方案,然后兴致勃勃地讲述该技术平台的优越性,宛然他是某家技术提供商所雇用的推销员。
3.C++主要设计目的是可移植性和可并存性,其可移植性与跨平台不是一个概念。在Java以前就有许多包裹着不同层次系统的语言,很显然Java是其中最成功的一个,而其由于商业推广目的,并不会强调移植性与跨平台间的概念差异。虽然从计算机科学家的角度来看,这样的差异是如此之大,以至于许多专家认同"Java不是跨平台,Java自己就是平台"。但对于程序工人来说,这样的差异是细小的。而对于商人来说,这样的差异是产生"现金流"的风道。
4.C++的目的不是安全,而是自由。我想随着软件工业的发展,C++与Java会不断分化,科学家使用C++,而商业系统中的技术工人则采用Java(或者与之类似的C#等)。