第1章 文件结构

第 1 章 文件结构 每个 C++/C 程序通常分为两个文件。一个文件用于保存程序的声明( declaration ),称为头文件。另一个文件用于保存程序的实现( implementation ),称为定义( definition )文件。 C++/C 程序的头文件以“ .h ”为后缀, C 程序的定义文件以“ .c ”为后缀, C++ 程序的定义文件通常以“ .cpp ”为后缀(也有一些系统以“ .cc ”或“ .cxx ”为后缀)。 1.1 版权和版本的声明 版权和版本的声明位于头文件和定义文件的开头(参见示例 1-1 ),主要内容有: ( 1 )版权信息。 ( 2 )文件名称,...
C | 2009-03-09 09:58 | 阅读 4149 次 | 评论 0 条

第2章 程序的版式

第2章 程序的版式 版式虽然不会影响程序的功能,但会影响可读性。程序的版式追求清晰、美观,是程序风格的重要构成因素。可以把程序的版式比喻为“书法”。好的“书法”可让人对程序一目了然,看得兴致勃勃。差的程序“书法”如螃蟹爬行,让人看得索然无味,更令维护者烦恼有加。请程序员们学习程序的“书法”,弥补大学计算机教育的漏洞,实在很有必要。   2.1 空行   空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。所以不要舍不得用空行。【规则2-1-1】在每个类声明之后、每个函数定义结束之后都...
C | 2009-03-09 09:57 | 阅读 3052 次 | 评论 0 条

第3章 命名规则

第3章 命名规则比较著名的命名规则当推Microsoft公司的“匈牙利”法,该命名规则的主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。例如所有的字符变量均以ch为前缀,若是指针变量则追加前缀p。如果一个变量由ppch开头,则表明它是指向字符指针的指针。 “匈牙利”法最大的缺点是烦琐,例如int i, j, k; float x, y, z;倘若采用“匈牙利”命名规则,则应当写成int iI, iJ, ik; // 前缀 i表示int类型float fX, fY, fZ; // 前缀 f表示float类型如此烦琐的程序会让绝大多数程序员无法忍受。据考察,没有一种命名规则可以...
C | 2009-03-09 09:57 | 阅读 2416 次 | 评论 0 条

第4章 表达式和基本语句

第4章 表达式和基本语句   读者可能怀疑:连if、for、while、goto、switch这样简单的东西也要探讨编程风格,是不是小题大做?我真的发觉很多程序员用隐含错误的方式写表达式和基本语句,我自己也犯过类似的错误。表达式和语句都属于C++/C的短语结构语法。它们看似简单,但使用时隐患比较多。本章归纳了正确使用表达式和语句的一些规则与建议。 4.1 运算符的优先级   C++/C语言的运算符有数十个,运算符的优先级与结合律如表4-1所示。注意一元运算符 + - * 的优先级高于对应的二元运算符。 优先级 运算符 结合律 从   高 ...
C | 2009-03-09 09:57 | 阅读 3933 次 | 评论 0 条

第5章 常量

第5章 常量常量是一种标识符,它的值在运行期间恒定不变。C语言用 #define来定义常量(称为宏常量)。C++ 语言除了 #define外还可以用const来定义常量(称为const常量)。 5.1 为什么需要常量 如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?(1) 程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知它们从何处来、表示什么。(2) 在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。(3) 如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。l 【规则5-1-1】 尽量使用含义直观的常量来表示...
C | 2009-03-09 09:55 | 阅读 2031 次 | 评论 0 条

第6章 函数设计

第6章 函数设计 函数是C++/C程序的基本功能单元,其重要性不言而喻。函数设计的细微缺点很容易导致该函数被错用,所以光使函数的功能正确是不够的。本章重点论述函数的接口设计和内部实现的一些规则。函数接口的两个要素是参数和返回值。C语言中,函数的参数和返回值的传递方式有两种:值传递(pass by value)和指针传递(pass by pointer)。C++ 语言中多了引用传递(pass by reference)。由于引用传递的性质象指针传递,而使用方式却象值传递,初学者常常迷惑不解,容易引起混乱,请先阅读6.6节“引用与指针的比较”。   6.1 参数的规则   【规则6...
C | 2009-03-09 09:55 | 阅读 2625 次 | 评论 0 条

第7章 内存管理

第7章 内存管理欢迎进入内存这片雷区。伟大的Bill Gates 曾经失言: 640K ought to be enough for everybody — Bill Gates 1981程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本章的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。7.1内存分配方式内存分配方式有三种:(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。(2) 在栈上创建。在执行函数时,函...
C | 2009-03-09 09:55 | 阅读 2805 次 | 评论 0 条

第8章 C++函数的高级特性

第8章 C++函数的高级特性   对比于C语言的函数,C++增加了重载(overloaded)、内联(inline)、const和virtual四种新机制。其中重载和内联机制既可用于全局函数也可用于类的成员函数,const与virtual机制仅用于类的成员函数。重载和内联肯定有其好处才会被C++语言采纳,但是不可以当成免费的午餐而滥用。本章将探究重载和内联的优点与局限性,说明什么情况下应该采用、不该采用以及要警惕错用。8.1 函数重载的概念 8.1.1 重载的起源自然语言中,一个词可以有许多不同的含义,即该词被重载了。人们可以通过上下文来判断该词到底是哪种含义。“词的重载”可以使语...
C | 2009-03-09 09:54 | 阅读 2370 次 | 评论 0 条

第9章 类的构造函数、析构函数与赋值函数

第9章 类的构造函数、析构函数与赋值函数   构造函数、析构函数与赋值函数是每个类最基本的函数。它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险。  每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A产生四个缺省的函数,如A(void); // 缺省的无参数构造函数A(const A &a); // 缺省的拷贝构造函数~A(void); // 缺省的析构函数A & operate =(const A &...
C | 2009-03-09 09:54 | 阅读 2369 次 | 评论 0 条

第10章 类的继承与组合

第10章 类的继承与组合   对象(Object)是类(Class)的一个实例(Instance)。如果将对象比作房子,那么类就是房子的设计图纸。所以面向对象设计的重点是类的设计,而不是对象的设计。对于C++程序而言,设计孤立的类是比较容易的,难的是正确设计基类及其派生类。本章仅仅论述“继承”(Inheritance)和“组合”(Composition)的概念。注意,当前面向对象技术的应用热点是COM和CORBA,这些内容超出了C++教材的范畴,请阅读COM和CORBA相关论著。   10.1 继承   如果A是基类,B是A的派生类,那么B将继承A的数据和函数。例如:cl...
C | 2009-03-09 09:53 | 阅读 1933 次 | 评论 0 条

第11章 其它编程经验

第11章 其它编程经验     11.1 使用const提高函数的健壮性   看到const关键字,C++程序员首先想到的可能是const常量。这可不是良好的条件反射。如果只知道用const定义常量,那么相当于把火药仅用于制作鞭炮。const更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++程序设计书籍建议:“Use const whenever you need”。 11.1.1 用const修饰函数的参数   如...
C | 2009-03-09 09:52 | 阅读 2133 次 | 评论 0 条

C++语言基础(1)

1.入门简介     变量 C++数据类型 C++操作符 C++中的函数 main函数 数组 字符串数组 字符串操作函数 C++是个强大的语言,可以用于做别的语言做不了的工作。但是,这种强大功能是有代价的。开始使用C++时,你可能会遇到内存溢出和访问失效等问题,使程序死机。这里用最简短的篇幅介绍C++语言基础。C++语言本身有专著介绍,这种书还特别厚,所以别指望我能用三言两语说清楚。读者学完本书并使用C++ Builder一般时间之后,最后对C++语言再作更深入的了解。 C++可以最充分地利用面向对象编程(OOP)的优势。OOP不只是一个新名词,而有它的实际意义,可以生成可复用的对...
C++ | 2009-03-09 09:50 | 阅读 2877 次 | 评论 0 条

C++语言基础(2)

if语句 if语句用于测试条件并在条件为真时执行一桌或几条语句。 说明:if表达式后面不能带分号,否则它本身表示代码中的空语句,使编译器将空语句解释为在条件为真时执行的语句。 if (x == 10); // Warning! Extra semicolon! DoSomething(x); 这里DoSomething()函数总会执行,因为编译器不把它看成在条件为真时执行的第一条语句。由于这个代码完全合法(但无用),所以编译器无法发出警告。 假设要在条件为真时执行多行语句,则要将这些语句放在大括号内: if (x > 10) { cout << "The number is grea...
C++ | 2009-03-09 09:50 | 阅读 2329 次 | 评论 0 条

C语言高效编程的四大绝招

编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就是针对编程工作中的一些体会和经验做相关的阐述。  第一招:以空间换时间  计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值:  方法A:通常的办法 #define LEN 32char string1 [LEN];memset (string1,0,LEN);strcpy (string1,"This is a example!!");   方法B: const char ...
编程文章 | 2009-03-09 09:45 | 阅读 2750 次 | 评论 0 条

动态哈夫曼编码的改进

《计算机世界月刊》1994年7月号所登载的《动态哈夫曼编码的数据压缩方法》一文给出了一种实时性较强的数据压缩方法,该方法的最大特点是不需预先对原始数据进行一遍扫描以建立哈夫曼树,而改为以动态变化的哈夫曼树对数据编码。该文所附的动态哈夫曼编码数据压缩与解压源程序中的UpDate函数是动态修改哈夫曼树的关键部分,该函数对动态哈夫曼树的一种可能情况无法正确修改,针对这一点,本文附上对该函数的一个修正定义,以使该压缩与解压程序更加完善。以下就举例说明原UpDate函数无法正确修改的一种哈夫曼树。例如若要压缩“TThhis”字符串,则在压缩完“TTh”之后的动态哈夫曼树为图所示(设根结点序号为10...
C | 2009-03-09 09:45 | 阅读 2056 次 | 评论 0 条

特种搜索引擎介绍

一、查找电子邮件、电话号码、人物   1、555-1212 http://www.555-1212.com  查询电话号码   2、Yahoo! People Search http://people.yahoo.com  查询电子邮件和电话号码   3、WhoWhere http://www.whowhere.com  查询email和电话号码   4、Switchboard http://www.swotchboard.com  可提供商业企业查询、电子邮件查询、寻人、地图和线路查询等。   5、Look4U http://www.looku.com  搜索全球的华人。 ...
其它 | 2009-03-09 09:44 | 阅读 3013 次 | 评论 0 条

一位老工程师给年轻人的“十大忠告”

1、好好规划自己的路,不要跟着感觉走;   根据个人的理想来安排自己的生活,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,痛快一些,那么就需要慎重安排自己的的轨迹,从一个行业入手逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会以后,钱根本不是问题,频繁地动荡不 是上策,最后你对哪个行业都没有摸透,永远是新手。   2、可以做技术的,切不可沉湎于技术;   千万不可一门心思钻营技术,给自己造成很多压力,如果你的心思全部放在上面那么注定你将成为孔乙己一类的人物,适可而止为之,因为技术只不...
经典文章 | 2009-03-09 09:43 | 阅读 2213 次 | 评论 0 条

程序员应具有的素质

程序员是一种技术工作,在IT的发展中有相当重要的地位,从底层硬件通讯协议的建立,到数据传输层的处理,到操作系统的建设,到数据库平台的建设,一直到应用层上各种数据营销平台的搭建,程序员在里面都扮演着举足轻重的角色并为IT事业的发展做出了巨大的贡献。  中国有很多精于编码的人,但是中国软件行业,尤其是网络应用开发方面误区很大,很难形成有规模的软件开发力量和产品能力,不但比美国差距甚远,和印度相比也是颇有不如。这些问题不是在于中国程序员的智商和工作努力状况,也不是在于国家和民间对开发的投入程度,而是很大程度上,有一些对技术,对程序开发,对项目设计方面的思想误区,这些误区,导致了软件行业的产品化...
编程文章 | 2009-03-09 09:42 | 阅读 2205 次 | 评论 0 条

C语言漫谈

C语言是被使用的最广泛的一种高级语言,其历史相当久远。而其发展也相当神速, 从当初的标准C发展到后来的C++。其性能也发生了很多很大的变化。C语言拥有众多的编译器,其中不乏优秀者众多。从当初的Turbo C引入集成化编译环境后,C语言就以其灵活性,高效率,可移植性好深入人心。后来发展起来的C++,Java 等语言,无不是在 其基础进行扩充,使其更为灵活,更方便易用。新的C++编译器引入了很多特色。使得C语言语法更加灵活。摒弃了标准C对语法死板的要求。使得编程随心所欲。这里推荐 Borland C++ 和Visual C++.当然这是指Dos应用,如果开发Windows应用程序,那么当 首...
编程文章 | 2009-03-09 09:41 | 阅读 1704 次 | 评论 0 条

#Pragma 指令详解

在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 其格式一般为: #Pragma Para 其中Para 为参数,下面来看一些常用的参数。 (1)message 参数。 Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗 口中输出相应的...
C | 2009-03-09 09:41 | 阅读 2100 次 | 评论 0 条
浏览190843次